From 11d1eaf991ee329b5bbf2d7baecf1cacbbf91b3a Mon Sep 17 00:00:00 2001 From: Tyagi-Sunny Date: Tue, 28 Jan 2025 16:50:31 +0530 Subject: [PATCH 1/3] refactor(sandbox): refactor auth basic login signup refactor auth basic login signup MIGRATION CHANGE: migration-20230323132703- refactor auth basic login signup migration-20240116123737- refactor auth basic login signup migration-20241105074844- refactor auth basic login signup migration-20220607063927- refactor auth basic login signup migration-20221110095658- refactor auth basic login signup migration-20230524115047- refactor auth basic login signup migration-20210421113146- refactor auth basic login signup migration-20221122072057- refactor auth basic login signup gh-0 --- .../.dockerignore | 3 +- .../.env.defaults | 66 + .../.env.example | 87 + .../.eslintignore | 3 +- .../.eslintrc.js | 7 +- .../.gitignore | 0 .../.mocharc.json | 6 + .../auth-basic-login-signup-example/.nycrc | 5 + .../.prettierignore | 5 + .../.prettierrc | 0 .../.vscode/launch.json | 0 .../.vscode/settings.json | 11 +- .../.vscode/tasks.json | 0 .../.yo-rc.json | 6 + .../DEVELOPING.md | 0 .../Dockerfile | 88 + .../auth-basic-login-signup-example/README.md | 75 + .../migrations/20210318100600-init.js} | 27 +- .../20220607063927-secret-key-column.js | 0 .../20221110095658-updated-init.js} | 4 +- .../20230323132703-client-type-column.js | 59 + .../20230524115047-login-activity.js} | 34 +- .../20240116123737-sync-with-user-tenant.js | 59 + .../20241105074844-add-jwt-keys-schema.js | 59 + .../migrations}/database.json | 9 +- .../sqls/20210318100600-init-down.sql} | 0 .../sqls/20210318100600-init-up.sql} | 159 +- .../20220607063927-secret-key-column-down.sql | 0 .../20220607063927-secret-key-column-up.sql | 2 + .../20221110095658-updated-init-down.sql} | 0 .../sqls/20221110095658-updated-init-up.sql | 11 + ...20230323132703-client-type-column-down.sql | 3 + .../20230323132703-client-type-column-up.sql | 4 + .../20230524115047-login-activity-down.sql | 6 + .../sqls/20230524115047-login-activity-up.sql | 16 + ...40116123737-sync-with-user-tenant-down.sql | 1 + ...0240116123737-sync-with-user-tenant-up.sql | 15 + ...0241105074844-add-jwt-keys-schema-down.sql | 1 + .../20241105074844-add-jwt-keys-schema-up.sql | 7 + .../package.json | 66 +- .../public/index.html | 103 + .../src/__tests__/README.md | 0 .../acceptance/home-page.acceptance.ts | 8 +- .../acceptance/ping.controller.acceptance.ts | 8 +- .../src/__tests__/acceptance/test-helper.ts | 53 + .../src/application.ts | 139 + .../src/controllers/README.md | 0 .../src/controllers/home-page.controller.ts | 42 + .../src/controllers/index.ts | 2 + .../src/controllers/ping.controller.ts | 60 + .../src/datasources/README.md | 0 .../src/datasources/auth.datasource.ts | 54 + .../src/datasources/index.ts | 2 + .../src/datasources/redis.datasource.ts | 65 + .../src/index.ts | 20 +- .../src/models/README.md | 0 .../src/models/index.ts | 0 .../src/models/to-do.model.ts | 0 .../src/models/user.dto.ts | 0 .../src/openapi-spec.ts | 31 + .../src/openapi.json | 3036 +++++++++++++ .../src/opentelemetry-registry.ts | 35 + .../src/providers/index.ts | 2 + .../src/providers/local-signup.provider.ts | 2 + .../signup-token-handler.provider.ts | 21 + .../src/services/index.ts | 0 .../src/services/user-ops.service.ts | 57 +- .../tsconfig.json | 9 +- sandbox/auth-ms-basic-example/.env.defaults | 12 - sandbox/auth-ms-basic-example/.env.example | 11 - sandbox/auth-ms-basic-example/.mocharc.json | 5 - sandbox/auth-ms-basic-example/.prettierignore | 2 - sandbox/auth-ms-basic-example/.yo-rc.json | 6 - sandbox/auth-ms-basic-example/CHANGELOG.md | 809 ---- sandbox/auth-ms-basic-example/Dockerfile | 28 - sandbox/auth-ms-basic-example/README.md | 7 - .../migrations/database.json | 22 - .../sqls/20210421113146-seed-down.sql | 8 - .../sqls/20210421113146-seed-up.sql | 60 - .../20220607063927-secret-key-column-up.sql | 2 - .../sqls/20221122072057-updated-init-up.sql | 11 - sandbox/auth-ms-basic-example/openapi.md | 3934 ----------------- .../auth-ms-basic-example/public/index.html | 88 - .../src/__tests__/acceptance/test-helper.ts | 36 - .../auth-ms-basic-example/src/application.ts | 61 - .../src/controllers/index.ts | 5 - .../src/controllers/to-do.controller.ts | 194 - .../src/datasources/auth-cache.datasource.ts | 37 - .../src/datasources/auth-db.datasource.ts | 39 - .../src/datasources/index.ts | 6 - .../src/enums/permission.enum.ts | 9 - sandbox/auth-ms-basic-example/src/migrate.ts | 24 - .../auth-ms-basic-example/src/openapi-spec.ts | 30 - .../src/providers/azure-ad-signup.provider.ts | 82 - .../src/providers/index.ts | 1 - .../src/repositories/README.md | 3 - .../src/repositories/index.ts | 8 - .../src/repositories/role.repository.ts | 20 - .../src/repositories/tenant.repository.ts | 43 - .../src/repositories/to-do.repository.ts | 20 - .../src/repositories/user.repository.ts | 239 - sandbox/auth-ms-basic-example/src/sequence.ts | 7 - sandbox/auth-ms-basic-example/src/types.ts | 40 - 103 files changed, 4437 insertions(+), 6125 deletions(-) rename sandbox/{auth-ms-basic-example => auth-basic-login-signup-example}/.dockerignore (75%) mode change 100644 => 100755 create mode 100755 sandbox/auth-basic-login-signup-example/.env.defaults create mode 100755 sandbox/auth-basic-login-signup-example/.env.example rename sandbox/{auth-ms-basic-example => auth-basic-login-signup-example}/.eslintignore (63%) mode change 100644 => 100755 rename sandbox/{auth-ms-basic-example => auth-basic-login-signup-example}/.eslintrc.js (62%) mode change 100644 => 100755 rename sandbox/{auth-ms-basic-example => auth-basic-login-signup-example}/.gitignore (100%) mode change 100644 => 100755 create mode 100755 sandbox/auth-basic-login-signup-example/.mocharc.json create mode 100755 sandbox/auth-basic-login-signup-example/.nycrc create mode 100755 sandbox/auth-basic-login-signup-example/.prettierignore rename sandbox/{auth-ms-basic-example => auth-basic-login-signup-example}/.prettierrc (100%) mode change 100644 => 100755 rename sandbox/{auth-ms-basic-example => auth-basic-login-signup-example}/.vscode/launch.json (100%) mode change 100644 => 100755 rename sandbox/{auth-ms-basic-example => auth-basic-login-signup-example}/.vscode/settings.json (81%) mode change 100644 => 100755 rename sandbox/{auth-ms-basic-example => auth-basic-login-signup-example}/.vscode/tasks.json (100%) mode change 100644 => 100755 create mode 100755 sandbox/auth-basic-login-signup-example/.yo-rc.json rename sandbox/{auth-ms-basic-example => auth-basic-login-signup-example}/DEVELOPING.md (100%) mode change 100644 => 100755 create mode 100755 sandbox/auth-basic-login-signup-example/Dockerfile create mode 100755 sandbox/auth-basic-login-signup-example/README.md rename sandbox/{auth-ms-basic-example/migrations/20210421113036-init.js => auth-basic-login-signup-example/migrations/20210318100600-init.js} (77%) mode change 100644 => 100755 rename sandbox/{auth-ms-basic-example => auth-basic-login-signup-example}/migrations/20220607063927-secret-key-column.js (100%) mode change 100644 => 100755 rename sandbox/{auth-ms-basic-example/migrations/20221122072057-updated-init.js => auth-basic-login-signup-example/migrations/20221110095658-updated-init.js} (93%) mode change 100644 => 100755 create mode 100755 sandbox/auth-basic-login-signup-example/migrations/20230323132703-client-type-column.js rename sandbox/{auth-ms-basic-example/migrations/20210421113146-seed.js => auth-basic-login-signup-example/migrations/20230524115047-login-activity.js} (55%) mode change 100644 => 100755 create mode 100755 sandbox/auth-basic-login-signup-example/migrations/20240116123737-sync-with-user-tenant.js create mode 100755 sandbox/auth-basic-login-signup-example/migrations/20241105074844-add-jwt-keys-schema.js rename sandbox/{auth-ms-basic-example => auth-basic-login-signup-example/migrations}/database.json (79%) mode change 100644 => 100755 rename sandbox/{auth-ms-basic-example/migrations/sqls/20210421113036-init-down.sql => auth-basic-login-signup-example/migrations/sqls/20210318100600-init-down.sql} (100%) mode change 100644 => 100755 rename sandbox/{auth-ms-basic-example/migrations/sqls/20210421113036-init-up.sql => auth-basic-login-signup-example/migrations/sqls/20210318100600-init-up.sql} (59%) mode change 100644 => 100755 rename sandbox/{auth-ms-basic-example => auth-basic-login-signup-example}/migrations/sqls/20220607063927-secret-key-column-down.sql (100%) mode change 100644 => 100755 create mode 100755 sandbox/auth-basic-login-signup-example/migrations/sqls/20220607063927-secret-key-column-up.sql rename sandbox/{auth-ms-basic-example/migrations/sqls/20221122072057-updated-init-down.sql => auth-basic-login-signup-example/migrations/sqls/20221110095658-updated-init-down.sql} (100%) mode change 100644 => 100755 create mode 100755 sandbox/auth-basic-login-signup-example/migrations/sqls/20221110095658-updated-init-up.sql create mode 100755 sandbox/auth-basic-login-signup-example/migrations/sqls/20230323132703-client-type-column-down.sql create mode 100755 sandbox/auth-basic-login-signup-example/migrations/sqls/20230323132703-client-type-column-up.sql create mode 100755 sandbox/auth-basic-login-signup-example/migrations/sqls/20230524115047-login-activity-down.sql create mode 100755 sandbox/auth-basic-login-signup-example/migrations/sqls/20230524115047-login-activity-up.sql create mode 100755 sandbox/auth-basic-login-signup-example/migrations/sqls/20240116123737-sync-with-user-tenant-down.sql create mode 100755 sandbox/auth-basic-login-signup-example/migrations/sqls/20240116123737-sync-with-user-tenant-up.sql create mode 100755 sandbox/auth-basic-login-signup-example/migrations/sqls/20241105074844-add-jwt-keys-schema-down.sql create mode 100755 sandbox/auth-basic-login-signup-example/migrations/sqls/20241105074844-add-jwt-keys-schema-up.sql rename sandbox/{auth-ms-basic-example => auth-basic-login-signup-example}/package.json (52%) mode change 100644 => 100755 create mode 100755 sandbox/auth-basic-login-signup-example/public/index.html rename sandbox/{auth-ms-basic-example => auth-basic-login-signup-example}/src/__tests__/README.md (100%) mode change 100644 => 100755 rename sandbox/{auth-ms-basic-example => auth-basic-login-signup-example}/src/__tests__/acceptance/home-page.acceptance.ts (72%) mode change 100644 => 100755 rename sandbox/{auth-ms-basic-example => auth-basic-login-signup-example}/src/__tests__/acceptance/ping.controller.acceptance.ts (66%) mode change 100644 => 100755 create mode 100755 sandbox/auth-basic-login-signup-example/src/__tests__/acceptance/test-helper.ts create mode 100755 sandbox/auth-basic-login-signup-example/src/application.ts rename sandbox/{auth-ms-basic-example => auth-basic-login-signup-example}/src/controllers/README.md (100%) mode change 100644 => 100755 create mode 100755 sandbox/auth-basic-login-signup-example/src/controllers/home-page.controller.ts create mode 100755 sandbox/auth-basic-login-signup-example/src/controllers/index.ts create mode 100755 sandbox/auth-basic-login-signup-example/src/controllers/ping.controller.ts rename sandbox/{auth-ms-basic-example => auth-basic-login-signup-example}/src/datasources/README.md (100%) mode change 100644 => 100755 create mode 100755 sandbox/auth-basic-login-signup-example/src/datasources/auth.datasource.ts create mode 100755 sandbox/auth-basic-login-signup-example/src/datasources/index.ts create mode 100755 sandbox/auth-basic-login-signup-example/src/datasources/redis.datasource.ts rename sandbox/{auth-ms-basic-example => auth-basic-login-signup-example}/src/index.ts (69%) mode change 100644 => 100755 rename sandbox/{auth-ms-basic-example => auth-basic-login-signup-example}/src/models/README.md (100%) mode change 100644 => 100755 rename sandbox/{auth-ms-basic-example => auth-basic-login-signup-example}/src/models/index.ts (100%) mode change 100644 => 100755 rename sandbox/{auth-ms-basic-example => auth-basic-login-signup-example}/src/models/to-do.model.ts (100%) mode change 100644 => 100755 rename sandbox/{auth-ms-basic-example => auth-basic-login-signup-example}/src/models/user.dto.ts (100%) mode change 100644 => 100755 create mode 100755 sandbox/auth-basic-login-signup-example/src/openapi-spec.ts create mode 100755 sandbox/auth-basic-login-signup-example/src/openapi.json create mode 100755 sandbox/auth-basic-login-signup-example/src/opentelemetry-registry.ts create mode 100755 sandbox/auth-basic-login-signup-example/src/providers/index.ts rename sandbox/{auth-ms-basic-example => auth-basic-login-signup-example}/src/providers/local-signup.provider.ts (99%) mode change 100644 => 100755 create mode 100755 sandbox/auth-basic-login-signup-example/src/providers/signup-token-handler.provider.ts rename sandbox/{auth-ms-basic-example => auth-basic-login-signup-example}/src/services/index.ts (100%) mode change 100644 => 100755 rename sandbox/{auth-ms-basic-example => auth-basic-login-signup-example}/src/services/user-ops.service.ts (78%) mode change 100644 => 100755 rename sandbox/{auth-ms-basic-example => auth-basic-login-signup-example}/tsconfig.json (56%) mode change 100644 => 100755 delete mode 100644 sandbox/auth-ms-basic-example/.env.defaults delete mode 100644 sandbox/auth-ms-basic-example/.env.example delete mode 100644 sandbox/auth-ms-basic-example/.mocharc.json delete mode 100644 sandbox/auth-ms-basic-example/.prettierignore delete mode 100644 sandbox/auth-ms-basic-example/.yo-rc.json delete mode 100644 sandbox/auth-ms-basic-example/CHANGELOG.md delete mode 100644 sandbox/auth-ms-basic-example/Dockerfile delete mode 100644 sandbox/auth-ms-basic-example/README.md delete mode 100644 sandbox/auth-ms-basic-example/migrations/database.json delete mode 100644 sandbox/auth-ms-basic-example/migrations/sqls/20210421113146-seed-down.sql delete mode 100644 sandbox/auth-ms-basic-example/migrations/sqls/20210421113146-seed-up.sql delete mode 100644 sandbox/auth-ms-basic-example/migrations/sqls/20220607063927-secret-key-column-up.sql delete mode 100644 sandbox/auth-ms-basic-example/migrations/sqls/20221122072057-updated-init-up.sql delete mode 100644 sandbox/auth-ms-basic-example/openapi.md delete mode 100644 sandbox/auth-ms-basic-example/public/index.html delete mode 100644 sandbox/auth-ms-basic-example/src/__tests__/acceptance/test-helper.ts delete mode 100644 sandbox/auth-ms-basic-example/src/application.ts delete mode 100644 sandbox/auth-ms-basic-example/src/controllers/index.ts delete mode 100644 sandbox/auth-ms-basic-example/src/controllers/to-do.controller.ts delete mode 100644 sandbox/auth-ms-basic-example/src/datasources/auth-cache.datasource.ts delete mode 100644 sandbox/auth-ms-basic-example/src/datasources/auth-db.datasource.ts delete mode 100644 sandbox/auth-ms-basic-example/src/datasources/index.ts delete mode 100644 sandbox/auth-ms-basic-example/src/enums/permission.enum.ts delete mode 100644 sandbox/auth-ms-basic-example/src/migrate.ts delete mode 100644 sandbox/auth-ms-basic-example/src/openapi-spec.ts delete mode 100644 sandbox/auth-ms-basic-example/src/providers/azure-ad-signup.provider.ts delete mode 100644 sandbox/auth-ms-basic-example/src/providers/index.ts delete mode 100644 sandbox/auth-ms-basic-example/src/repositories/README.md delete mode 100644 sandbox/auth-ms-basic-example/src/repositories/index.ts delete mode 100644 sandbox/auth-ms-basic-example/src/repositories/role.repository.ts delete mode 100644 sandbox/auth-ms-basic-example/src/repositories/tenant.repository.ts delete mode 100644 sandbox/auth-ms-basic-example/src/repositories/to-do.repository.ts delete mode 100644 sandbox/auth-ms-basic-example/src/repositories/user.repository.ts delete mode 100644 sandbox/auth-ms-basic-example/src/sequence.ts delete mode 100644 sandbox/auth-ms-basic-example/src/types.ts diff --git a/sandbox/auth-ms-basic-example/.dockerignore b/sandbox/auth-basic-login-signup-example/.dockerignore old mode 100644 new mode 100755 similarity index 75% rename from sandbox/auth-ms-basic-example/.dockerignore rename to sandbox/auth-basic-login-signup-example/.dockerignore index 7aecc7e3dd..86e2a5ca75 --- a/sandbox/auth-ms-basic-example/.dockerignore +++ b/sandbox/auth-basic-login-signup-example/.dockerignore @@ -1,5 +1,6 @@ -node_modules +coverage npm-debug.log /dist # Cache used by TypeScript's incremental build *.tsbuildinfo +mochawesome-report \ No newline at end of file diff --git a/sandbox/auth-basic-login-signup-example/.env.defaults b/sandbox/auth-basic-login-signup-example/.env.defaults new file mode 100755 index 0000000000..9be445332f --- /dev/null +++ b/sandbox/auth-basic-login-signup-example/.env.defaults @@ -0,0 +1,66 @@ +NODE_ENV=production +LOG_LEVEL=info +USER_TEMP_PASSWORD=temp123!@ +GOOGLE_AUTH_URL=q +GOOGLE_AUTH_CLIENT_ID=a +GOOGLE_AUTH_CLIENT_SECRET=q +GOOGLE_AUTH_TOKEN_URL=q +GOOGLE_AUTH_CALLBACK_URL=q +GOOGLE_TOKEN_INFO_URL=q +INSTAGRAM_AUTH_URL=q +INSTAGRAM_AUTH_CLIENT_ID=a +INSTAGRAM_AUTH_CLIENT_SECRET=q +INSTAGRAM_AUTH_TOKEN_URL=q +INSTAGRAM_AUTH_CALLBACK_URL=q +SAML_URL=q +SAML_CLIENT_ID=a +SAML_CLIENT_SECRET=q +SAML_TOKEN_URL=q +SAML_CALLBACK_URL=q +APPLE_AUTH_URL=q +APPLE_AUTH_CLIENT_ID=a +APPLE_AUTH_TEAM_ID=q +APPLE_AUTH_KEY_ID=q +APPLE_AUTH_CALLBACK_URL=q +FACEBOOK_AUTH_URL=q +FACEBOOK_AUTH_CLIENT_ID=a +FACEBOOK_AUTH_CLIENT_SECRET=q +FACEBOOK_AUTH_TOKEN_URL=q +FACEBOOK_AUTH_CALLBACK_URL=q +REDIS_PORT=a +REDIS_HOST=a +REDIS_URL= +REDIS_PASSWORD=a +REDIS_DATABASE=a +FORGOT_PASSWORD_LINK_EXPIRY=30 +REQUEST_SIGNUP_LINK_EXPIRY=30 + +# AZURE AD +#boolean values will be 0 or 1 + +AZURE_AUTH_ENABLED=0 +AZURE_IDENTITY_METADATA=https://login.microsoftonline.com/common/.well-known/openid-configuration +AZURE_AUTH_CLIENT_ID=a +AZURE_AUTH_REDIRECT_URL=url +AZURE_AUTH_CLIENT_SECRET=client_secret +AZURE_AUTH_ALLOW_HTTP_REDIRECT=1 +AZURE_AUTH_COOKIE_INSTEAD_SESSION=1 +AZURE_AUTH_PASS_REQ_CALLBACK=0 +AZURE_AUTH_VALIDATE_ISSUER=0 +AZURE_AUTH_B2C_TENANT=0 +AZURE_AUTH_CLOCK_SKEW=300 +AZURE_AUTH_LOG_LEVEL= +AZURE_AUTH_LOG_PII=1 +AZURE_AUTH_NONCE_TIME=3600 +AZURE_AUTH_NONCE_COUNT=10 +AZURE_AUTH_ISSUER= + +# key is 32 bit + +AZURE_AUTH_COOKIE_KEY= + +#iv is 12 bit + +AZURE_AUTH_COOKIE_IV= + +MAX_JWT_KEYS=2 diff --git a/sandbox/auth-basic-login-signup-example/.env.example b/sandbox/auth-basic-login-signup-example/.env.example new file mode 100755 index 0000000000..93499f7eaf --- /dev/null +++ b/sandbox/auth-basic-login-signup-example/.env.example @@ -0,0 +1,87 @@ +# NODE_ENV= +# LOG_LEVEL= +# DB_HOST= +# DB_PORT= +# DB_USER= +# DB_PASSWORD= +# DB_DATABASE= +# DB_SCHEMA= +# REDIS_HOST= +# REDIS_PORT= +# REDIS_URL= +# REDIS_PASSWORD= +# REDIS_DATABASE= +# PRIVATE_DECRYPTION_KEY= +# JWT_SECRET= +# JWT_ISSUER= +# USER_TEMP_PASSWORD= +# GOOGLE_AUTH_URL= +# GOOGLE_AUTH_CLIENT_ID= +# GOOGLE_AUTH_CLIENT_SECRET= +# GOOGLE_AUTH_TOKEN_URL= +# GOOGLE_AUTH_CALLBACK_URL= +# GOOGLE_TOKEN_INFO_URL= +# SAML_URL= +# SAML_CLIENT_ID= +# SAML_CLIENT_SECRET= +# SAML_TOKEN_URL= +# SAML_CALLBACK_URL= +# INSTAGRAM_AUTH_URL= +# INSTAGRAM_AUTH_CLIENT_ID= +# INSTAGRAM_AUTH_CLIENT_SECRET= +# INSTAGRAM_AUTH_TOKEN_URL= +# INSTAGRAM_AUTH_CALLBACK_URL= +# APPLE_AUTH_URL= +# APPLE_AUTH_CLIENT_ID= +# APPLE_AUTH_TEAM_ID= +# APPLE_AUTH_KEY_ID= +# APPLE_AUTH_CALLBACK_URL= +# FACEBOOK_AUTH_URL= +# FACEBOOK_AUTH_CLIENT_ID= +# FACEBOOK_AUTH_CLIENT_SECRET= +# FACEBOOK_AUTH_TOKEN_URL= +# FACEBOOK_AUTH_CALLBACK_URL= +# FORGOT_PASSWORD_LINK_EXPIRY= +# KEYCLOAK_HOST= +# KEYCLOAK_REALM= +# KEYCLOAK_CLIENT_ID= +# KEYCLOAK_CLIENT_SECRET= +# KEYCLOAK_CALLBACK_URL= + +# # AZURE AD +# #boolean values will be 0 or 1 + +# AZURE_AUTH_ENABLED= +# AZURE_IDENTITY_METADATA= +# AZURE_AUTH_CLIENT_ID= +# AZURE_AUTH_REDIRECT_URL= +# AZURE_AUTH_CLIENT_SECRET= +# AZURE_AUTH_ALLOW_HTTP_REDIRECT= +# AZURE_AUTH_COOKIE_INSTEAD_SESSION= +# AZURE_AUTH_PASS_REQ_CALLBACK= +# AZURE_AUTH_VALIDATE_ISSUER= +# AZURE_AUTH_B2C_TENANT= +# AZURE_AUTH_CLOCK_SKEW= +# AZURE_AUTH_LOG_LEVEL= +# AZURE_AUTH_LOG_PII= +# AZURE_AUTH_NONCE_TIME= +# AZURE_AUTH_NONCE_COUNT= +# AZURE_AUTH_ISSUER= + +# # key is 32 bit + +# AZURE_AUTH_COOKIE_KEY= + +# #iv is 12 bit + +# AZURE_AUTH_COOKIE_IV= + + +# AUTH0_DOMAIN= +# AUTH0_CLIENT_ID= +# AUTH0_CLIENT_SECRET= +# AUTH0_CALLBACK_URL= + +# MAX_JWT_KEYS= +# JWT_PRIVATE_KEY_PASSPHRASE= +# API_BASE_URL= diff --git a/sandbox/auth-ms-basic-example/.eslintignore b/sandbox/auth-basic-login-signup-example/.eslintignore old mode 100644 new mode 100755 similarity index 63% rename from sandbox/auth-ms-basic-example/.eslintignore rename to sandbox/auth-basic-login-signup-example/.eslintignore index 8be0b258b7..ae1479d3e8 --- a/sandbox/auth-ms-basic-example/.eslintignore +++ b/sandbox/auth-basic-login-signup-example/.eslintignore @@ -1,6 +1,5 @@ node_modules/ dist/ coverage/ -migrations/ -migration.js .eslintrc.js +mochawesome-report \ No newline at end of file diff --git a/sandbox/auth-ms-basic-example/.eslintrc.js b/sandbox/auth-basic-login-signup-example/.eslintrc.js old mode 100644 new mode 100755 similarity index 62% rename from sandbox/auth-ms-basic-example/.eslintrc.js rename to sandbox/auth-basic-login-signup-example/.eslintrc.js index bf89b71d9f..c01d682feb --- a/sandbox/auth-ms-basic-example/.eslintrc.js +++ b/sandbox/auth-basic-login-signup-example/.eslintrc.js @@ -4,5 +4,10 @@ module.exports = { 'no-extra-boolean-cast': 'off', '@typescript-eslint/interface-name-prefix': 'off', 'no-prototype-builtins': 'off', + 'no-await-in-loop': 'error' }, -}; + parserOptions: { + project: './tsconfig.json', + tsconfigRootDir: __dirname, + }, +}; \ No newline at end of file diff --git a/sandbox/auth-ms-basic-example/.gitignore b/sandbox/auth-basic-login-signup-example/.gitignore old mode 100644 new mode 100755 similarity index 100% rename from sandbox/auth-ms-basic-example/.gitignore rename to sandbox/auth-basic-login-signup-example/.gitignore diff --git a/sandbox/auth-basic-login-signup-example/.mocharc.json b/sandbox/auth-basic-login-signup-example/.mocharc.json new file mode 100755 index 0000000000..a141fff9d2 --- /dev/null +++ b/sandbox/auth-basic-login-signup-example/.mocharc.json @@ -0,0 +1,6 @@ +{ + "exit": true, + "recursive": true, + "require": "source-map-support/register", + "reporter": "mochawesome" +} diff --git a/sandbox/auth-basic-login-signup-example/.nycrc b/sandbox/auth-basic-login-signup-example/.nycrc new file mode 100755 index 0000000000..115a4e397c --- /dev/null +++ b/sandbox/auth-basic-login-signup-example/.nycrc @@ -0,0 +1,5 @@ +{ + "extends": "@istanbuljs/nyc-config-typescript", + "all": true, + "reporter": ["html", "text-summary"] +} \ No newline at end of file diff --git a/sandbox/auth-basic-login-signup-example/.prettierignore b/sandbox/auth-basic-login-signup-example/.prettierignore new file mode 100755 index 0000000000..3f725726d0 --- /dev/null +++ b/sandbox/auth-basic-login-signup-example/.prettierignore @@ -0,0 +1,5 @@ +dist +*.json +coverage +mochawesome-report +node_modules/ \ No newline at end of file diff --git a/sandbox/auth-ms-basic-example/.prettierrc b/sandbox/auth-basic-login-signup-example/.prettierrc old mode 100644 new mode 100755 similarity index 100% rename from sandbox/auth-ms-basic-example/.prettierrc rename to sandbox/auth-basic-login-signup-example/.prettierrc diff --git a/sandbox/auth-ms-basic-example/.vscode/launch.json b/sandbox/auth-basic-login-signup-example/.vscode/launch.json old mode 100644 new mode 100755 similarity index 100% rename from sandbox/auth-ms-basic-example/.vscode/launch.json rename to sandbox/auth-basic-login-signup-example/.vscode/launch.json diff --git a/sandbox/auth-ms-basic-example/.vscode/settings.json b/sandbox/auth-basic-login-signup-example/.vscode/settings.json old mode 100644 new mode 100755 similarity index 81% rename from sandbox/auth-ms-basic-example/.vscode/settings.json rename to sandbox/auth-basic-login-signup-example/.vscode/settings.json index 07313667ec..fa3c3aea67 --- a/sandbox/auth-ms-basic-example/.vscode/settings.json +++ b/sandbox/auth-basic-login-signup-example/.vscode/settings.json @@ -5,8 +5,8 @@ "editor.trimAutoWhitespace": true, "editor.formatOnSave": true, "editor.codeActionsOnSave": { - "source.organizeImports": true, - "source.fixAll.eslint": true + "source.organizeImports": "explicit", + "source.fixAll.eslint": "explicit" }, "files.exclude": { @@ -15,7 +15,7 @@ "**/.hg": true, "**/.svn": true, "**/CVS": true, - "dist": true, + "dist": true }, "files.insertFinalNewline": true, "files.trimTrailingWhitespace": true, @@ -25,8 +25,5 @@ "typescript.preferences.quoteStyle": "single", "eslint.run": "onSave", "eslint.nodePath": "./node_modules", - "eslint.validate": [ - "javascript", - "typescript" - ] + "eslint.validate": ["javascript", "typescript"] } diff --git a/sandbox/auth-ms-basic-example/.vscode/tasks.json b/sandbox/auth-basic-login-signup-example/.vscode/tasks.json old mode 100644 new mode 100755 similarity index 100% rename from sandbox/auth-ms-basic-example/.vscode/tasks.json rename to sandbox/auth-basic-login-signup-example/.vscode/tasks.json diff --git a/sandbox/auth-basic-login-signup-example/.yo-rc.json b/sandbox/auth-basic-login-signup-example/.yo-rc.json new file mode 100755 index 0000000000..d4a996bdbb --- /dev/null +++ b/sandbox/auth-basic-login-signup-example/.yo-rc.json @@ -0,0 +1,6 @@ +{ + "@sourceloop/cli": { + "packageManager": "npm", + "version": "5.2.4" + } +} diff --git a/sandbox/auth-ms-basic-example/DEVELOPING.md b/sandbox/auth-basic-login-signup-example/DEVELOPING.md old mode 100644 new mode 100755 similarity index 100% rename from sandbox/auth-ms-basic-example/DEVELOPING.md rename to sandbox/auth-basic-login-signup-example/DEVELOPING.md diff --git a/sandbox/auth-basic-login-signup-example/Dockerfile b/sandbox/auth-basic-login-signup-example/Dockerfile new file mode 100755 index 0000000000..17580fe640 --- /dev/null +++ b/sandbox/auth-basic-login-signup-example/Dockerfile @@ -0,0 +1,88 @@ +# Check out https://hub.docker.com/_/node to select a new base image +ARG nodeVer=18-alpine + +# select a base image to build from +FROM node:$nodeVer AS BASE + +# Take the build variables for image base +ARG SERVICE_NAME +ARG FROM_FOLDER +# This command is used to install some dependencies in the Docker image. +# Nessasary for running node-prune and npm install +RUN apk update && apk add --no-cache --virtual .gyp \ + python3 \ + make \ + g++ \ + bash \ + curl + +# This is used to download and install the `node-prune` tool in the Docker image. +RUN curl -sfL https://gobinaries.com/tj/node-prune | bash -s -- -b /usr/local/bin + +# Set to a non-root built-in user `node` +USER node + +# Create app directory (with user `node`) +RUN mkdir -p /home/node/app + +# Set the working directory to `/home/node/app` +WORKDIR /home/node/app + +# Install app dependencies +# A wildcard is used to ensure both package.json AND package-lock.json are copied +# where available (npm@5+) +COPY --chown=node package*.json ./ + +# The following two commands is used to copy the `packages`,`service` directory from the local file system to the Docker image. +# The `--chown=node` flag ensures that the ownership of the copied files/directories is set to the `node` user. +# This is important because the subsequent commands in the Dockerfile are executed with the `node` user, +# and it needs the appropriate permissions to access and modify the copied files/directories. +COPY --chown=node packages ./packages + +COPY --chown=node $FROM_FOLDER/$SERVICE_NAME ./$FROM_FOLDER/$SERVICE_NAME + +# Installing all dependencies +RUN npm install + +# Building the app +# set the Working Directory to the service +WORKDIR /home/node/app/$FROM_FOLDER/$SERVICE_NAME +# Run Build Command +RUN npm run build + +# Run node-prune +RUN npm prune --production +RUN /usr/local/bin/node-prune + +# Start fresh for a smaller image size +FROM node:$nodeVer + +# Take the build variables for image stage +ARG SERVICE_NAME +ARG FROM_FOLDER + +RUN mkdir -p /home/node/app + +USER node + +WORKDIR /home/node/app + + +# These `COPY` commands are used to copy files and directories from the `BASE` +# stage of the Docker image to the current stage. +COPY --from=BASE --chown=node /home/node/app/node_modules ./node_modules +COPY --from=BASE --chown=node /home/node/app/package.json ./ +COPY --from=BASE --chown=node /home/node/app/package-lock.json ./ +COPY --from=BASE --chown=node /home/node/app/packages ./packages +COPY --from=BASE --chown=node /home/node/app/$FROM_FOLDER/$SERVICE_NAME ./$FROM_FOLDER/$SERVICE_NAME + +# Set the working directory to `/home/node/app/services/auth-service` +WORKDIR /home/node/app/$FROM_FOLDER/$SERVICE_NAME + + +# Bind to all network interfaces so that it can be mapped to the host OS +ENV HOST=0.0.0.0 PORT=3000 + +EXPOSE ${PORT} + +CMD [ "node", "." ] \ No newline at end of file diff --git a/sandbox/auth-basic-login-signup-example/README.md b/sandbox/auth-basic-login-signup-example/README.md new file mode 100755 index 0000000000..f3f2c3aa78 --- /dev/null +++ b/sandbox/auth-basic-login-signup-example/README.md @@ -0,0 +1,75 @@ +# auth-basic-login-signup-example + +This application is generated using [LoopBack 4 CLI](https://loopback.io/doc/en/lb4/Command-line-interface.html) with the +[initial project layout](https://loopback.io/doc/en/lb4/Loopback-application-layout.html). + +## Install dependencies + +By default, dependencies were installed when this application was generated. +Whenever dependencies in `package.json` are changed, run the following command: + +```sh +npm install +``` + +To only install resolved dependencies in `package-lock.json`: + +```sh +npm ci +``` + +## Run the application + +```sh +npm start +``` + +You can also run `node .` to skip the build step. + +Open http://127.0.0.1:3000 in your browser. + +## Rebuild the project + +To incrementally build the project: + +```sh +npm run build +``` + +To force a full build by cleaning up cached artifacts: + +```sh +npm run rebuild +``` + +## Fix code style and formatting issues + +```sh +npm run lint +``` + +To automatically fix such issues: + +```sh +npm run lint:fix +``` + +## Other useful commands + +- `npm run migrate`: Migrate database schemas for models +- `npm run openapi-spec`: Generate OpenAPI spec into a file +- `npm run docker:build`: Build a Docker image for this application +- `npm run docker:run`: Run this application inside a Docker container + +## Tests + +```sh +npm test +``` + +## What's next + +Please check out [LoopBack 4 documentation](https://loopback.io/doc/en/lb4/) to +understand how you can continue to add features to this application. + +[![LoopBack](https://github.com/loopbackio/loopback-next/raw/master/docs/site/imgs/branding/Powered-by-LoopBack-Badge-(blue)-@2x.png)](http://loopback.io/) diff --git a/sandbox/auth-ms-basic-example/migrations/20210421113036-init.js b/sandbox/auth-basic-login-signup-example/migrations/20210318100600-init.js old mode 100644 new mode 100755 similarity index 77% rename from sandbox/auth-ms-basic-example/migrations/20210421113036-init.js rename to sandbox/auth-basic-login-signup-example/migrations/20210318100600-init.js index 4faf7411cb..f7aa1b04c5 --- a/sandbox/auth-ms-basic-example/migrations/20210421113036-init.js +++ b/sandbox/auth-basic-login-signup-example/migrations/20210318100600-init.js @@ -5,16 +5,8 @@ var type; var seed; var fs = require('fs'); var path = require('path'); -var Promise; - -function handleFile(filePath, resolve, reject) { - fs.readFile(filePath, {encoding: 'utf-8'}, function (err, data) { - if (err) return reject(err); - console.log('received data: ' + data); - resolve(data); - }); -} +var Promise; /** * We receive the dbmigrate dependency from dbmigrate initially. @@ -28,23 +20,32 @@ exports.setup = function (options, seedLink) { }; exports.up = function (db) { - var filePath = path.join(__dirname, 'sqls', '20210421113036-init-up.sql'); + var filePath = path.join(__dirname, 'sqls', '20210318100600-init-up.sql'); return new Promise(function (resolve, reject) { - handleFile(filePath, resolve, reject); + receiveData(resolve, reject, filePath); }).then(function (data) { return db.runSql(data); }); }; exports.down = function (db) { - var filePath = path.join(__dirname, 'sqls', '20210421113036-init-down.sql'); + var filePath = path.join(__dirname, 'sqls', '20210318100600-init-down.sql'); return new Promise(function (resolve, reject) { - handleFile(filePath, resolve, reject); + receiveData(resolve, reject, filePath); }).then(function (data) { return db.runSql(data); }); }; +function receiveData(resolve, reject, filePath) { + fs.readFile(filePath, {encoding: 'utf-8'}, function (err, data) { + if (err) return reject(err); + console.log('received data: ' + data); + + resolve(data); + }); +} + exports._meta = { version: 1, }; diff --git a/sandbox/auth-ms-basic-example/migrations/20220607063927-secret-key-column.js b/sandbox/auth-basic-login-signup-example/migrations/20220607063927-secret-key-column.js old mode 100644 new mode 100755 similarity index 100% rename from sandbox/auth-ms-basic-example/migrations/20220607063927-secret-key-column.js rename to sandbox/auth-basic-login-signup-example/migrations/20220607063927-secret-key-column.js diff --git a/sandbox/auth-ms-basic-example/migrations/20221122072057-updated-init.js b/sandbox/auth-basic-login-signup-example/migrations/20221110095658-updated-init.js old mode 100644 new mode 100755 similarity index 93% rename from sandbox/auth-ms-basic-example/migrations/20221122072057-updated-init.js rename to sandbox/auth-basic-login-signup-example/migrations/20221110095658-updated-init.js index 94ea3253d7..250582cb55 --- a/sandbox/auth-ms-basic-example/migrations/20221122072057-updated-init.js +++ b/sandbox/auth-basic-login-signup-example/migrations/20221110095658-updated-init.js @@ -22,7 +22,7 @@ exports.up = function (db) { var filePath = path.join( __dirname, 'sqls', - '20221122072057-updated-init-up.sql', + '20221110095658-updated-init-up.sql', ); return new Promise(function (resolve, reject) { fs.readFile(filePath, {encoding: 'utf-8'}, function (err, data) { @@ -40,7 +40,7 @@ exports.down = function (db) { var filePath = path.join( __dirname, 'sqls', - '20221122072057-updated-init-down.sql', + '20221110095658-updated-init-down.sql', ); return new Promise(function (resolve, reject) { fs.readFile(filePath, {encoding: 'utf-8'}, function (err, data) { diff --git a/sandbox/auth-basic-login-signup-example/migrations/20230323132703-client-type-column.js b/sandbox/auth-basic-login-signup-example/migrations/20230323132703-client-type-column.js new file mode 100755 index 0000000000..2608f6e0f0 --- /dev/null +++ b/sandbox/auth-basic-login-signup-example/migrations/20230323132703-client-type-column.js @@ -0,0 +1,59 @@ +'use strict'; + +var dbm; +var type; +var seed; +var fs = require('fs'); +var path = require('path'); +var Promise; + +/** + * We receive the dbmigrate dependency from dbmigrate initially. + * This enables us to not have to rely on NODE_PATH. + */ +exports.setup = function (options, seedLink) { + dbm = options.dbmigrate; + type = dbm.dataType; + seed = seedLink; + Promise = options.Promise; +}; + +exports.up = function (db) { + var filePath = path.join( + __dirname, + 'sqls', + '20230323132703-client-type-column-up.sql', + ); + return new Promise(function (resolve, reject) { + fs.readFile(filePath, {encoding: 'utf-8'}, function (err, data) { + if (err) return reject(err); + console.log('received data: ' + data); + + resolve(data); + }); + }).then(function (data) { + return db.runSql(data); + }); +}; + +exports.down = function (db) { + var filePath = path.join( + __dirname, + 'sqls', + '20230323132703-client-type-column-down.sql', + ); + return new Promise(function (resolve, reject) { + fs.readFile(filePath, {encoding: 'utf-8'}, function (err, data) { + if (err) return reject(err); + console.log('received data: ' + data); + + resolve(data); + }); + }).then(function (data) { + return db.runSql(data); + }); +}; + +exports._meta = { + version: 1, +}; diff --git a/sandbox/auth-ms-basic-example/migrations/20210421113146-seed.js b/sandbox/auth-basic-login-signup-example/migrations/20230524115047-login-activity.js old mode 100644 new mode 100755 similarity index 55% rename from sandbox/auth-ms-basic-example/migrations/20210421113146-seed.js rename to sandbox/auth-basic-login-signup-example/migrations/20230524115047-login-activity.js index 629a05737b..fc6fbcb7c3 --- a/sandbox/auth-ms-basic-example/migrations/20210421113146-seed.js +++ b/sandbox/auth-basic-login-signup-example/migrations/20230524115047-login-activity.js @@ -7,14 +7,6 @@ var fs = require('fs'); var path = require('path'); var Promise; -function handleFile(filePath, resolve, reject) { - fs.readFile(filePath, {encoding: 'utf-8'}, function (err, data) { - if (err) return reject(err); - console.log('received data: ' + data); - - resolve(data); - }); -} /** * We receive the dbmigrate dependency from dbmigrate initially. * This enables us to not have to rely on NODE_PATH. @@ -27,18 +19,36 @@ exports.setup = function (options, seedLink) { }; exports.up = function (db) { - var filePath = path.join(__dirname, 'sqls', '20210421113146-seed-up.sql'); + var filePath = path.join( + __dirname, + 'sqls', + '20230524115047-login-activity-up.sql', + ); return new Promise(function (resolve, reject) { - handleFile(filePath, resolve, reject); + fs.readFile(filePath, {encoding: 'utf-8'}, function (err, data) { + if (err) return reject(err); + console.log('received data: ' + data); + + resolve(data); + }); }).then(function (data) { return db.runSql(data); }); }; exports.down = function (db) { - var filePath = path.join(__dirname, 'sqls', '20210421113146-seed-down.sql'); + var filePath = path.join( + __dirname, + 'sqls', + '20230524115047-login-activity-down.sql', + ); return new Promise(function (resolve, reject) { - handleFile(filePath, resolve, reject); + fs.readFile(filePath, {encoding: 'utf-8'}, function (err, data) { + if (err) return reject(err); + console.log('received data: ' + data); + + resolve(data); + }); }).then(function (data) { return db.runSql(data); }); diff --git a/sandbox/auth-basic-login-signup-example/migrations/20240116123737-sync-with-user-tenant.js b/sandbox/auth-basic-login-signup-example/migrations/20240116123737-sync-with-user-tenant.js new file mode 100755 index 0000000000..5481f600c7 --- /dev/null +++ b/sandbox/auth-basic-login-signup-example/migrations/20240116123737-sync-with-user-tenant.js @@ -0,0 +1,59 @@ +'use strict'; + +var dbm; +var type; +var seed; +var fs = require('fs'); +var path = require('path'); +var Promise; + +/** + * We receive the dbmigrate dependency from dbmigrate initially. + * This enables us to not have to rely on NODE_PATH. + */ +exports.setup = function (options, seedLink) { + dbm = options.dbmigrate; + type = dbm.dataType; + seed = seedLink; + Promise = options.Promise; +}; + +exports.up = function (db) { + var filePath = path.join( + __dirname, + 'sqls', + '20240116123737-sync-with-user-tenant-up.sql', + ); + return new Promise(function (resolve, reject) { + fs.readFile(filePath, {encoding: 'utf-8'}, function (err, data) { + if (err) return reject(err); + console.log('received data: ' + data); + + resolve(data); + }); + }).then(function (data) { + return db.runSql(data); + }); +}; + +exports.down = function (db) { + var filePath = path.join( + __dirname, + 'sqls', + '20240116123737-sync-with-user-tenant-down.sql', + ); + return new Promise(function (resolve, reject) { + fs.readFile(filePath, {encoding: 'utf-8'}, function (err, data) { + if (err) return reject(err); + console.log('received data: ' + data); + + resolve(data); + }); + }).then(function (data) { + return db.runSql(data); + }); +}; + +exports._meta = { + version: 1, +}; diff --git a/sandbox/auth-basic-login-signup-example/migrations/20241105074844-add-jwt-keys-schema.js b/sandbox/auth-basic-login-signup-example/migrations/20241105074844-add-jwt-keys-schema.js new file mode 100755 index 0000000000..b1ebc0e60c --- /dev/null +++ b/sandbox/auth-basic-login-signup-example/migrations/20241105074844-add-jwt-keys-schema.js @@ -0,0 +1,59 @@ +'use strict'; + +var dbm; +var type; +var seed; +var fs = require('fs'); +var path = require('path'); +var Promise; + +/** + * We receive the dbmigrate dependency from dbmigrate initially. + * This enables us to not have to rely on NODE_PATH. + */ +exports.setup = function (options, seedLink) { + dbm = options.dbmigrate; + type = dbm.dataType; + seed = seedLink; + Promise = options.Promise; +}; + +exports.up = function (db) { + var filePath = path.join( + __dirname, + 'sqls', + '20241105074844-add-jwt-keys-schema-up.sql', + ); + return new Promise(function (resolve, reject) { + fs.readFile(filePath, {encoding: 'utf-8'}, function (err, data) { + if (err) return reject(err); + console.log('received data: ' + data); + + resolve(data); + }); + }).then(function (data) { + return db.runSql(data); + }); +}; + +exports.down = function (db) { + var filePath = path.join( + __dirname, + 'sqls', + '20241105074844-add-jwt-keys-schema-down.sql', + ); + return new Promise(function (resolve, reject) { + fs.readFile(filePath, {encoding: 'utf-8'}, function (err, data) { + if (err) return reject(err); + console.log('received data: ' + data); + + resolve(data); + }); + }).then(function (data) { + return db.runSql(data); + }); +}; + +exports._meta = { + version: 1, +}; diff --git a/sandbox/auth-ms-basic-example/database.json b/sandbox/auth-basic-login-signup-example/migrations/database.json old mode 100644 new mode 100755 similarity index 79% rename from sandbox/auth-ms-basic-example/database.json rename to sandbox/auth-basic-login-signup-example/migrations/database.json index 24271623fd..b50814c9ad --- a/sandbox/auth-ms-basic-example/database.json +++ b/sandbox/auth-basic-login-signup-example/migrations/database.json @@ -1,6 +1,6 @@ { - "defaultEnv": "local", - "local": { + "defaultEnv": "master", + "master": { "driver": "pg", "host": { "ENV": "DB_HOST" @@ -17,5 +17,6 @@ "database": { "ENV": "DB_DATABASE" } - } -} + }, + "sql-file": true +} \ No newline at end of file diff --git a/sandbox/auth-ms-basic-example/migrations/sqls/20210421113036-init-down.sql b/sandbox/auth-basic-login-signup-example/migrations/sqls/20210318100600-init-down.sql old mode 100644 new mode 100755 similarity index 100% rename from sandbox/auth-ms-basic-example/migrations/sqls/20210421113036-init-down.sql rename to sandbox/auth-basic-login-signup-example/migrations/sqls/20210318100600-init-down.sql diff --git a/sandbox/auth-ms-basic-example/migrations/sqls/20210421113036-init-up.sql b/sandbox/auth-basic-login-signup-example/migrations/sqls/20210318100600-init-up.sql old mode 100644 new mode 100755 similarity index 59% rename from sandbox/auth-ms-basic-example/migrations/sqls/20210421113036-init-up.sql rename to sandbox/auth-basic-login-signup-example/migrations/sqls/20210318100600-init-up.sql index f860c3fc70..5d87000632 --- a/sandbox/auth-ms-basic-example/migrations/sqls/20210421113036-init-up.sql +++ b/sandbox/auth-basic-login-signup-example/migrations/sqls/20210318100600-init-up.sql @@ -1,18 +1,17 @@ -DROP SCHEMA IF EXISTS main CASCADE; -CREATE SCHEMA main; +CREATE SCHEMA IF NOT EXISTS main; SET search_path TO main,public; GRANT ALL ON SCHEMA main TO public; -CREATE TABLE main.auth_clients ( +CREATE TABLE IF NOT EXISTS main.auth_clients ( id integer NOT NULL GENERATED BY DEFAULT AS IDENTITY, client_id varchar(50) NOT NULL , - client_secret varchar(50) NOT NULL , + client_secret text NOT NULL , redirect_url varchar(200) , access_token_expiration integer DEFAULT 900 NOT NULL , refresh_token_expiration integer DEFAULT 86400 NOT NULL , auth_code_expiration integer DEFAULT 180 NOT NULL , - secret varchar(50) NOT NULL , + secret text NOT NULL , created_on timestamptz DEFAULT CURRENT_TIMESTAMP NOT NULL , modified_on timestamptz DEFAULT CURRENT_TIMESTAMP NOT NULL , deleted bool DEFAULT false NOT NULL , @@ -21,22 +20,7 @@ CREATE TABLE main.auth_clients ( CONSTRAINT pk_auth_clients_id PRIMARY KEY ( id ) ); -CREATE TABLE main.groups ( - id uuid DEFAULT md5(random()::text || clock_timestamp()::text)::uuid NOT NULL , - name varchar(200) NOT NULL , - description varchar(500) , - photo_url varchar(500) , - created_by uuid , - modified_by uuid , - created_on timestamptz DEFAULT CURRENT_TIMESTAMP , - modified_on timestamptz DEFAULT CURRENT_TIMESTAMP , - deleted bool DEFAULT false , - deleted_on timestamptz , - deleted_by uuid , - CONSTRAINT pk_groups_id PRIMARY KEY ( id ) - ); - -CREATE TABLE main.roles ( + CREATE TABLE IF NOT EXISTS main.roles ( id uuid DEFAULT md5(random()::text || clock_timestamp()::text)::uuid NOT NULL , name varchar(100) NOT NULL , created_on timestamptz DEFAULT CURRENT_TIMESTAMP NOT NULL , @@ -50,8 +34,8 @@ CREATE TABLE main.roles ( deleted_on timestamptz , CONSTRAINT pk_roles_id PRIMARY KEY ( id ) ); - -CREATE TABLE main.tenants ( + + CREATE TABLE IF NOT EXISTS main.tenants ( id uuid DEFAULT md5(random()::text || clock_timestamp()::text)::uuid NOT NULL , name varchar(100) NOT NULL , status integer DEFAULT 0 NOT NULL , @@ -72,7 +56,25 @@ CREATE TABLE main.tenants ( CONSTRAINT idx_tenants UNIQUE ( "key" ) ); -CREATE TABLE main.users ( + CREATE TABLE IF NOT EXISTS main.tenant_configs ( + id uuid DEFAULT md5(random()::text || clock_timestamp()::text)::uuid NOT NULL , + config_key varchar(100) NOT NULL , + config_value jsonb NOT NULL , + created_on timestamptz DEFAULT CURRENT_TIMESTAMP NOT NULL , + modified_on timestamptz DEFAULT CURRENT_TIMESTAMP NOT NULL , + created_by integer , + modified_by integer , + deleted bool DEFAULT false NOT NULL , + tenant_id uuid NOT NULL , + deleted_by uuid , + deleted_on timestamptz , + CONSTRAINT pk_tenant_configs_id PRIMARY KEY ( id ), + CONSTRAINT fk_tenant_configs_tenants FOREIGN KEY ( tenant_id ) REFERENCES main.tenants( id ) + + ); + + +CREATE TABLE IF NOT EXISTS main.users ( id uuid DEFAULT md5(random()::text || clock_timestamp()::text)::uuid NOT NULL , first_name varchar(50) NOT NULL , middle_name varchar(50) , @@ -86,40 +88,16 @@ CREATE TABLE main.users ( modified_by uuid , deleted bool DEFAULT false NOT NULL , last_login timestamptz , - photo_url varchar(250) , auth_client_ids integer[] , gender char(1) , dob date , - designation varchar(50) , default_tenant_id uuid , deleted_by uuid , deleted_on timestamptz , CONSTRAINT pk_users_id PRIMARY KEY ( id ) ); -CREATE TABLE main.todo ( - id uuid DEFAULT md5(random()::text || clock_timestamp()::text)::uuid NOT NULL , - title varchar(50) NOT NULL , - description varchar(150) NOT NULL , - items _text - ); - -CREATE TABLE main.tenant_configs ( - id uuid DEFAULT md5(random()::text || clock_timestamp()::text)::uuid NOT NULL , - config_key varchar(100) NOT NULL , - config_value jsonb NOT NULL , - created_on timestamptz DEFAULT CURRENT_TIMESTAMP NOT NULL , - modified_on timestamptz DEFAULT CURRENT_TIMESTAMP NOT NULL , - created_by integer , - modified_by integer , - deleted bool DEFAULT false NOT NULL , - tenant_id uuid NOT NULL , - deleted_by uuid , - deleted_on timestamptz , - CONSTRAINT pk_tenant_configs_id PRIMARY KEY ( id ) - ); - -CREATE TABLE main.user_credentials ( +CREATE TABLE IF NOT EXISTS main.user_credentials ( id uuid DEFAULT md5(random()::text || clock_timestamp()::text)::uuid NOT NULL , user_id uuid NOT NULL , auth_provider varchar(50) DEFAULT 'internal'::character varying NOT NULL , @@ -132,10 +110,12 @@ CREATE TABLE main.user_credentials ( deleted_on timestamptz , deleted_by uuid , CONSTRAINT pk_user_credentials_id PRIMARY KEY ( id ), - CONSTRAINT idx_user_credentials_user_id UNIQUE ( user_id ) + CONSTRAINT idx_user_credentials_user_id UNIQUE ( user_id ), + CONSTRAINT idx_user_credentials_uniq UNIQUE ( auth_provider, auth_id, auth_token, "password" ), + CONSTRAINT fk_user_credentials_users FOREIGN KEY ( user_id ) REFERENCES main.users( id ) ); - -CREATE TABLE main.user_tenants ( + + CREATE TABLE IF NOT EXISTS main.user_tenants ( id uuid DEFAULT md5(random()::text || clock_timestamp()::text)::uuid NOT NULL , user_id uuid NOT NULL , tenant_id uuid NOT NULL , @@ -147,38 +127,48 @@ CREATE TABLE main.user_tenants ( locale varchar(5) , deleted_by uuid , deleted_on timestamptz , - CONSTRAINT pk_user_tenants_id PRIMARY KEY ( id ) + CONSTRAINT pk_user_tenants_id PRIMARY KEY ( id ), + CONSTRAINT fk_user_tenants_users FOREIGN KEY ( user_id ) REFERENCES main.users( id ) , + CONSTRAINT fk_user_tenants_tenants FOREIGN KEY ( tenant_id ) REFERENCES main.tenants( id ) , + CONSTRAINT fk_user_tenants_roles FOREIGN KEY ( role_id ) REFERENCES main.roles( id ) ); -CREATE TABLE main.user_groups ( + CREATE TABLE IF NOT EXISTS main.user_permissions ( id uuid DEFAULT md5(random()::text || clock_timestamp()::text)::uuid NOT NULL , user_tenant_id uuid NOT NULL , - group_id uuid NOT NULL , - created_on timestamptz DEFAULT CURRENT_TIMESTAMP , - modified_on timestamptz DEFAULT CURRENT_TIMESTAMP , - deleted bool DEFAULT false , + permission text NOT NULL , + allowed bool NOT NULL , + created_on timestamptz DEFAULT CURRENT_TIMESTAMP NOT NULL , + modified_on timestamptz DEFAULT CURRENT_TIMESTAMP NOT NULL , created_by uuid , modified_by uuid , + deleted bool DEFAULT false NOT NULL , deleted_on timestamptz , deleted_by uuid , - CONSTRAINT pk_user_groups_id PRIMARY KEY ( id ) + CONSTRAINT pk_user_permissions_id PRIMARY KEY ( id ), + CONSTRAINT fk_user_permissions FOREIGN KEY ( user_tenant_id ) REFERENCES main.user_tenants( id ) + ); -CREATE TABLE main.user_permissions ( - id uuid DEFAULT md5(random()::text || clock_timestamp()::text)::uuid NOT NULL , - user_tenant_id uuid NOT NULL , - permission varchar(50) NOT NULL , - allowed bool NOT NULL , +CREATE TABLE IF NOT EXISTS main.user_resources ( + deleted bool DEFAULT false NOT NULL , + deleted_on timestamptz , + deleted_by uuid , created_on timestamptz DEFAULT CURRENT_TIMESTAMP NOT NULL , modified_on timestamptz DEFAULT CURRENT_TIMESTAMP NOT NULL , created_by uuid , modified_by uuid , - deleted bool DEFAULT false NOT NULL , - deleted_on timestamptz , - deleted_by uuid , - CONSTRAINT pk_user_permissions_id PRIMARY KEY ( id ) + id uuid DEFAULT md5(random()::text || clock_timestamp()::text)::uuid NOT NULL , + user_tenant_id uuid , + resource_name varchar(50) , + resource_value varchar(100) , + allowed bool DEFAULT true NOT NULL , + CONSTRAINT user_resources_pkey PRIMARY KEY ( id ), + CONSTRAINT fk_user_resources FOREIGN KEY ( user_tenant_id ) REFERENCES main.user_tenants( id ) + ); + CREATE OR REPLACE FUNCTION main.moddatetime() RETURNS trigger LANGUAGE plpgsql @@ -190,35 +180,18 @@ END; $function$ ; -CREATE TRIGGER mdt_auth_clients BEFORE UPDATE ON main.auth_clients FOR EACH ROW EXECUTE PROCEDURE main.moddatetime('modified_on'); - -CREATE TRIGGER mdt_roles BEFORE UPDATE ON main.roles FOR EACH ROW EXECUTE PROCEDURE main.moddatetime('modified_on'); - -CREATE TRIGGER mdt_tenant_configs BEFORE UPDATE ON main.tenant_configs FOR EACH ROW EXECUTE PROCEDURE main.moddatetime('modified_on'); - -CREATE TRIGGER mdt_tenants BEFORE UPDATE ON main.tenants FOR EACH ROW EXECUTE PROCEDURE main.moddatetime('modified_on'); - -CREATE TRIGGER mdt_user_credentials BEFORE UPDATE ON main.user_credentials FOR EACH ROW EXECUTE PROCEDURE main.moddatetime('modified_on'); - -CREATE TRIGGER mdt_user_permissions BEFORE UPDATE ON main.user_permissions FOR EACH ROW EXECUTE PROCEDURE main.moddatetime('modified_on'); - -CREATE TRIGGER mdt_user_tenants BEFORE UPDATE ON main.user_tenants FOR EACH ROW EXECUTE PROCEDURE main.moddatetime('modified_on'); - -CREATE TRIGGER mdt_users BEFORE UPDATE ON main.users FOR EACH ROW EXECUTE PROCEDURE main.moddatetime('modified_on'); - -ALTER TABLE main.tenant_configs ADD CONSTRAINT fk_tenant_configs_tenants FOREIGN KEY ( tenant_id ) REFERENCES main.tenants( id ); - -ALTER TABLE main.user_credentials ADD CONSTRAINT fk_user_credentials_users FOREIGN KEY ( user_id ) REFERENCES main.users( id ); +CREATE OR REPLACE TRIGGER mdt_auth_clients BEFORE UPDATE ON main.auth_clients FOR EACH ROW EXECUTE PROCEDURE main.moddatetime('modified_on'); -ALTER TABLE main.user_groups ADD CONSTRAINT fk_user_tenant FOREIGN KEY ( user_tenant_id ) REFERENCES main.user_tenants( id ); +CREATE OR REPLACE TRIGGER mdt_roles BEFORE UPDATE ON main.roles FOR EACH ROW EXECUTE PROCEDURE main.moddatetime('modified_on'); -ALTER TABLE main.user_groups ADD CONSTRAINT fk_groups FOREIGN KEY ( group_id ) REFERENCES main.groups( id ); +CREATE OR REPLACE TRIGGER mdt_tenant_configs BEFORE UPDATE ON main.tenant_configs FOR EACH ROW EXECUTE PROCEDURE main.moddatetime('modified_on'); -ALTER TABLE main.user_permissions ADD CONSTRAINT fk_user_permissions FOREIGN KEY ( user_tenant_id ) REFERENCES main.user_tenants( id ); +CREATE OR REPLACE TRIGGER mdt_tenants BEFORE UPDATE ON main.tenants FOR EACH ROW EXECUTE PROCEDURE main.moddatetime('modified_on'); -ALTER TABLE main.user_tenants ADD CONSTRAINT fk_user_tenants_users FOREIGN KEY ( user_id ) REFERENCES main.users( id ); +CREATE OR REPLACE TRIGGER mdt_user_credentials BEFORE UPDATE ON main.user_credentials FOR EACH ROW EXECUTE PROCEDURE main.moddatetime('modified_on'); -ALTER TABLE main.user_tenants ADD CONSTRAINT fk_user_tenants_tenants FOREIGN KEY ( tenant_id ) REFERENCES main.tenants( id ); +CREATE OR REPLACE TRIGGER mdt_user_permissions BEFORE UPDATE ON main.user_permissions FOR EACH ROW EXECUTE PROCEDURE main.moddatetime('modified_on'); -ALTER TABLE main.user_tenants ADD CONSTRAINT fk_user_tenants_roles FOREIGN KEY ( role_id ) REFERENCES main.roles( id ); +CREATE OR REPLACE TRIGGER mdt_user_tenants BEFORE UPDATE ON main.user_tenants FOR EACH ROW EXECUTE PROCEDURE main.moddatetime('modified_on'); +CREATE OR REPLACE TRIGGER mdt_users BEFORE UPDATE ON main.users FOR EACH ROW EXECUTE PROCEDURE main.moddatetime('modified_on'); \ No newline at end of file diff --git a/sandbox/auth-ms-basic-example/migrations/sqls/20220607063927-secret-key-column-down.sql b/sandbox/auth-basic-login-signup-example/migrations/sqls/20220607063927-secret-key-column-down.sql old mode 100644 new mode 100755 similarity index 100% rename from sandbox/auth-ms-basic-example/migrations/sqls/20220607063927-secret-key-column-down.sql rename to sandbox/auth-basic-login-signup-example/migrations/sqls/20220607063927-secret-key-column-down.sql diff --git a/sandbox/auth-basic-login-signup-example/migrations/sqls/20220607063927-secret-key-column-up.sql b/sandbox/auth-basic-login-signup-example/migrations/sqls/20220607063927-secret-key-column-up.sql new file mode 100755 index 0000000000..570a7ab069 --- /dev/null +++ b/sandbox/auth-basic-login-signup-example/migrations/sqls/20220607063927-secret-key-column-up.sql @@ -0,0 +1,2 @@ +ALTER TABLE main.user_credentials +ADD IF NOT EXISTS secret_key text; diff --git a/sandbox/auth-ms-basic-example/migrations/sqls/20221122072057-updated-init-down.sql b/sandbox/auth-basic-login-signup-example/migrations/sqls/20221110095658-updated-init-down.sql old mode 100644 new mode 100755 similarity index 100% rename from sandbox/auth-ms-basic-example/migrations/sqls/20221122072057-updated-init-down.sql rename to sandbox/auth-basic-login-signup-example/migrations/sqls/20221110095658-updated-init-down.sql diff --git a/sandbox/auth-basic-login-signup-example/migrations/sqls/20221110095658-updated-init-up.sql b/sandbox/auth-basic-login-signup-example/migrations/sqls/20221110095658-updated-init-up.sql new file mode 100755 index 0000000000..22c5208465 --- /dev/null +++ b/sandbox/auth-basic-login-signup-example/migrations/sqls/20221110095658-updated-init-up.sql @@ -0,0 +1,11 @@ +ALTER TABLE main.auth_clients +ADD IF NOT EXISTS created_by varchar(100), +ADD IF NOT EXISTS modified_by varchar(100); + +ALTER TABLE main.user_credentials +ADD IF NOT EXISTS created_by varchar(100), +ADD IF NOT EXISTS modified_by varchar(100); + +ALTER TABLE main.user_tenants +ADD IF NOT EXISTS created_by varchar(100), +ADD IF NOT EXISTS modified_by varchar(100); \ No newline at end of file diff --git a/sandbox/auth-basic-login-signup-example/migrations/sqls/20230323132703-client-type-column-down.sql b/sandbox/auth-basic-login-signup-example/migrations/sqls/20230323132703-client-type-column-down.sql new file mode 100755 index 0000000000..752870fd2f --- /dev/null +++ b/sandbox/auth-basic-login-signup-example/migrations/sqls/20230323132703-client-type-column-down.sql @@ -0,0 +1,3 @@ +/* Replace with your SQL commands */ + +ALTER TABLE main.auth_clients DROP COLUMN client_type; diff --git a/sandbox/auth-basic-login-signup-example/migrations/sqls/20230323132703-client-type-column-up.sql b/sandbox/auth-basic-login-signup-example/migrations/sqls/20230323132703-client-type-column-up.sql new file mode 100755 index 0000000000..c9c45ba9b1 --- /dev/null +++ b/sandbox/auth-basic-login-signup-example/migrations/sqls/20230323132703-client-type-column-up.sql @@ -0,0 +1,4 @@ +/* Replace with your SQL commands */ + +ALTER TABLE main.auth_clients +ADD IF NOT EXISTS client_type varchar(100) DEFAULT 'public'; diff --git a/sandbox/auth-basic-login-signup-example/migrations/sqls/20230524115047-login-activity-down.sql b/sandbox/auth-basic-login-signup-example/migrations/sqls/20230524115047-login-activity-down.sql new file mode 100755 index 0000000000..fa7e8d10a1 --- /dev/null +++ b/sandbox/auth-basic-login-signup-example/migrations/sqls/20230524115047-login-activity-down.sql @@ -0,0 +1,6 @@ +/* Replace with your SQL commands */ + +SET search_path TO main,public; +GRANT ALL ON SCHEMA main TO public; + +drop table main.login_activity; \ No newline at end of file diff --git a/sandbox/auth-basic-login-signup-example/migrations/sqls/20230524115047-login-activity-up.sql b/sandbox/auth-basic-login-signup-example/migrations/sqls/20230524115047-login-activity-up.sql new file mode 100755 index 0000000000..075c744eac --- /dev/null +++ b/sandbox/auth-basic-login-signup-example/migrations/sqls/20230524115047-login-activity-up.sql @@ -0,0 +1,16 @@ +/* Replace with your SQL commands */ + +SET search_path TO main,public; +GRANT ALL ON SCHEMA main TO public; + +CREATE TABLE main.login_activity ( + id uuid DEFAULT md5(random()::text || clock_timestamp()::text)::uuid NOT NULL , + actor text NOT NULL, + tenant_id text, + login_time timestamptz DEFAULT CURRENT_TIMESTAMP NOT NULL, + token_payload text NOT NULL, + login_type text NOT NULL, + device_info text, + ip_address text, + CONSTRAINT pk_login_activity PRIMARY KEY ( id ) +); \ No newline at end of file diff --git a/sandbox/auth-basic-login-signup-example/migrations/sqls/20240116123737-sync-with-user-tenant-down.sql b/sandbox/auth-basic-login-signup-example/migrations/sqls/20240116123737-sync-with-user-tenant-down.sql new file mode 100755 index 0000000000..44f074ea89 --- /dev/null +++ b/sandbox/auth-basic-login-signup-example/migrations/sqls/20240116123737-sync-with-user-tenant-down.sql @@ -0,0 +1 @@ +/* Replace with your SQL commands */ \ No newline at end of file diff --git a/sandbox/auth-basic-login-signup-example/migrations/sqls/20240116123737-sync-with-user-tenant-up.sql b/sandbox/auth-basic-login-signup-example/migrations/sqls/20240116123737-sync-with-user-tenant-up.sql new file mode 100755 index 0000000000..98849b18b4 --- /dev/null +++ b/sandbox/auth-basic-login-signup-example/migrations/sqls/20240116123737-sync-with-user-tenant-up.sql @@ -0,0 +1,15 @@ +/* Replace with your SQL commands */ + +ALTER TABLE main.roles +ADD IF NOT EXISTS tenant_id uuid NOT NULL, +ADD IF NOT EXISTS allowed_clients text[], +ADD IF NOT EXISTS description varchar(500); + +ALTER TABLE main.tenants +ADD IF NOT EXISTS website varchar(100); + +ALTER TABLE main.users +ADD IF NOT EXISTS photo_url text, +ADD IF NOT EXISTS designation varchar(50); + + diff --git a/sandbox/auth-basic-login-signup-example/migrations/sqls/20241105074844-add-jwt-keys-schema-down.sql b/sandbox/auth-basic-login-signup-example/migrations/sqls/20241105074844-add-jwt-keys-schema-down.sql new file mode 100755 index 0000000000..fbcccb9d0c --- /dev/null +++ b/sandbox/auth-basic-login-signup-example/migrations/sqls/20241105074844-add-jwt-keys-schema-down.sql @@ -0,0 +1 @@ +DROP TABLE main.jwt_keys; diff --git a/sandbox/auth-basic-login-signup-example/migrations/sqls/20241105074844-add-jwt-keys-schema-up.sql b/sandbox/auth-basic-login-signup-example/migrations/sqls/20241105074844-add-jwt-keys-schema-up.sql new file mode 100755 index 0000000000..f644e574f5 --- /dev/null +++ b/sandbox/auth-basic-login-signup-example/migrations/sqls/20241105074844-add-jwt-keys-schema-up.sql @@ -0,0 +1,7 @@ +CREATE TABLE main.jwt_keys ( + id SERIAL PRIMARY KEY, + key_id VARCHAR(100) UNIQUE NOT NULL, + public_key TEXT NOT NULL, -- Public key in PEM format + private_key TEXT NOT NULL, -- Private key in PEM format + created_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); diff --git a/sandbox/auth-ms-basic-example/package.json b/sandbox/auth-basic-login-signup-example/package.json old mode 100644 new mode 100755 similarity index 52% rename from sandbox/auth-ms-basic-example/package.json rename to sandbox/auth-basic-login-signup-example/package.json index 4b5fcade71..a5b821e3b7 --- a/sandbox/auth-ms-basic-example/package.json +++ b/sandbox/auth-basic-login-signup-example/package.json @@ -1,19 +1,18 @@ { - "name": "@sourceloop/auth-ms-basic-example", - "version": "0.14.7", - "description": "Auth microservice basic example.", + "name": "-auth-basic-login-signup-example", + "version": "0.0.1", + "description": "auth-basic-login-signup-example", "keywords": [ - "loopback-application", + "loopback-microservice", "loopback" ], - "private": true, "main": "dist/index.js", "types": "dist/index.d.ts", "engines": { - "node": "18 || 20" + "node": ">=18" }, "scripts": { - "build": "npm run clean && lb-tsc", + "build": "lb-tsc", "build:watch": "lb-tsc --watch", "lint": "npm run eslint && npm run prettier:check", "lint:fix": "npm run eslint:fix && npm run prettier:fix", @@ -23,18 +22,25 @@ "eslint": "eslint --report-unused-disable-directives .", "eslint:fix": "npm run eslint -- --fix", "pretest": "npm run rebuild", - "test": "echo 'No Tests'", + "test": "lb-mocha --allow-console-logs \"dist/__tests__\"", "test:dev": "lb-mocha --allow-console-logs dist/__tests__/**/*.js", - "docker:build": "docker build -t auth-multitenant-example .", - "docker:run": "docker run -p 3000:3000 -d auth-multitenant-example", + "docker:build": "DOCKER_BUILDKIT=1 sudo docker build --build-arg NR_ENABLED=$NR_ENABLED_VALUE --build-arg FROM_FOLDER=services --build-arg SERVICE_NAME=authentication-service -t $IMAGE_REPO_NAME/$npm_package_name:$npm_package_version ../../. -f ./Dockerfile", + "docker:run": "docker run -p 3000:3000 -d auth-basic-login-signup-example", + "symlink-resolver": "symlink-resolver", + "resolve-links": "npm run symlink-resolver build ./node_modules/@local", "premigrate": "npm run build", "migrate": "node ./dist/migrate", "preopenapi-spec": "npm run build", "openapi-spec": "node ./dist/openapi-spec", - "rebuild": "npm run clean && npm run build", - "prestart": "npm run rebuild", - "start": "node -r source-map-support/register .", + "prestart": "npm run clean && npm run openapi-spec", + "start": "node -r ./dist/opentelemetry-registry.js -r source-map-support/register .", + "dev": "nodemon --watch src -e ts --exec \"npm run start\"", "clean": "lb-clean dist *.tsbuildinfo .eslintcache", + "rebuild": "npm run clean && npm run build", + "docker:push": " docker push $IMAGE_REPO_NAME/$npm_package_name:$npm_package_version", + "docker:build:dev": "DOCKER_BUILDKIT=1 sudo docker build --build-arg NR_ENABLED=$NR_ENABLED_VALUE --build-arg FROM_FOLDER=services --build-arg SERVICE_NAME=authentication-service -t $IMAGE_REPO_NAME/$npm_package_name:$npm_package_version ../../. -f ./Dockerfile", + "docker:push:dev": " docker push $IMAGE_REPO_NAME/$npm_package_name:$npm_package_version", + "coverage": "nyc npm run test", "db:migrate": "./node_modules/db-migrate/bin/db-migrate up --config './migrations/database.json'", "db:migrate:down": "./node_modules/db-migrate/bin/db-migrate down --config './migrations/database.json'", "db:migrate:reset": "./node_modules/db-migrate/bin/db-migrate reset --config './migrations/database.json'" @@ -43,7 +49,7 @@ "type": "git", "url": "" }, - "author": "Akshat Dubey ", + "author": "Tyagi-Sunny", "license": "MIT", "files": [ "README.md", @@ -55,41 +61,43 @@ "@loopback/boot": "^7.0.9", "@loopback/context": "^7.0.9", "@loopback/core": "^6.1.6", + "@loopback/openapi-v3": "^10.0.9", "@loopback/repository": "^7.0.9", - "@loopback/repository-json-schema": "^8.0.9", "@loopback/rest": "^14.0.9", "@loopback/rest-explorer": "^7.0.9", "@loopback/service-proxy": "^7.0.9", + "@opentelemetry/exporter-jaeger": "^1.15.0", + "@opentelemetry/plugin-dns": "^0.15.0", + "@opentelemetry/plugin-http": "^0.18.2", + "@opentelemetry/plugin-https": "^0.18.2", + "@opentelemetry/plugin-pg": "^0.15.0", + "@opentelemetry/plugin-pg-pool": "^0.15.0", + "@opentelemetry/sdk-trace-base": "^1.15.0", + "@opentelemetry/sdk-trace-node": "^1.15.0", "@sourceloop/authentication-service": "^20.0.2", "@sourceloop/core": "^15.0.2", - "ajv": "^8.11.0", - "ajv-errors": "^3.0.0", - "bcrypt": "^5.0.1", - "db-migrate": "^1.0.0-beta.21", - "db-migrate-pg": "^1.3.0", + "bcrypt": "^5.1.1", "dotenv": "^16.4.5", "dotenv-extended": "^2.9.0", "loopback-connector-kv-redis": "^4.0.0", "loopback-connector-postgresql": "^7.1.8", "loopback4-authentication": "^12.1.1", "loopback4-authorization": "^7.0.3", - "loopback4-soft-delete": "^10.0.3", - "prom-client": "^14.0.1", + "swagger-stats": "^0.99.5", + "symlink-resolver": "0.2.1", "tslib": "^2.6.2" }, "devDependencies": { + "@istanbuljs/nyc-config-typescript": "^1.0.2", "@loopback/build": "^11.0.8", "@loopback/eslint-config": "^15.0.4", "@loopback/testlab": "^7.0.8", - "@types/bcrypt": "^5.0.0", + "@types/bcrypt": "^5.0.2", "@types/node": "^20.12.7", "eslint": "^8.57.0", + "nodemon": "^2.0.21", + "nyc": "^15.1.0", "source-map-support": "^0.5.21", "typescript": "^5.4.5" - }, - "overrides": { - "check-code-coverage": { - "lodash": "^4.17.21" - } } -} +} \ No newline at end of file diff --git a/sandbox/auth-basic-login-signup-example/public/index.html b/sandbox/auth-basic-login-signup-example/public/index.html new file mode 100755 index 0000000000..7da3205e28 --- /dev/null +++ b/sandbox/auth-basic-login-signup-example/public/index.html @@ -0,0 +1,103 @@ + + + + auth-basic-login-signup-example + + + + + + + + + + +
+

auth-basic-login-signup-example

+

Version 1.0.0

+ +

+ OpenAPI spec: + /openapi.json +

+

API Explorer: /explorer

+

Monitoring: /monitor

+
+ + + + diff --git a/sandbox/auth-ms-basic-example/src/__tests__/README.md b/sandbox/auth-basic-login-signup-example/src/__tests__/README.md old mode 100644 new mode 100755 similarity index 100% rename from sandbox/auth-ms-basic-example/src/__tests__/README.md rename to sandbox/auth-basic-login-signup-example/src/__tests__/README.md diff --git a/sandbox/auth-ms-basic-example/src/__tests__/acceptance/home-page.acceptance.ts b/sandbox/auth-basic-login-signup-example/src/__tests__/acceptance/home-page.acceptance.ts old mode 100644 new mode 100755 similarity index 72% rename from sandbox/auth-ms-basic-example/src/__tests__/acceptance/home-page.acceptance.ts rename to sandbox/auth-basic-login-signup-example/src/__tests__/acceptance/home-page.acceptance.ts index feb86d5242..cf2f2fda75 --- a/sandbox/auth-ms-basic-example/src/__tests__/acceptance/home-page.acceptance.ts +++ b/sandbox/auth-basic-login-signup-example/src/__tests__/acceptance/home-page.acceptance.ts @@ -1,13 +1,9 @@ -// Copyright (c) 2023 Sourcefuse Technologies -// -// This software is released under the MIT License. -// https://opensource.org/licenses/MIT import {Client} from '@loopback/testlab'; -import {AuthMultitenantExampleApplication} from '../..'; +import {AuthBasicLoginSignupExampleApplication} from '../..'; import {setupApplication} from './test-helper'; describe('HomePage', () => { - let app: AuthMultitenantExampleApplication; + let app: AuthBasicLoginSignupExampleApplication; let client: Client; before('setupApplication', async () => { diff --git a/sandbox/auth-ms-basic-example/src/__tests__/acceptance/ping.controller.acceptance.ts b/sandbox/auth-basic-login-signup-example/src/__tests__/acceptance/ping.controller.acceptance.ts old mode 100644 new mode 100755 similarity index 66% rename from sandbox/auth-ms-basic-example/src/__tests__/acceptance/ping.controller.acceptance.ts rename to sandbox/auth-basic-login-signup-example/src/__tests__/acceptance/ping.controller.acceptance.ts index ba9b5e2058..1cc44b8987 --- a/sandbox/auth-ms-basic-example/src/__tests__/acceptance/ping.controller.acceptance.ts +++ b/sandbox/auth-basic-login-signup-example/src/__tests__/acceptance/ping.controller.acceptance.ts @@ -1,13 +1,9 @@ -// Copyright (c) 2023 Sourcefuse Technologies -// -// This software is released under the MIT License. -// https://opensource.org/licenses/MIT import {Client, expect} from '@loopback/testlab'; -import {AuthMultitenantExampleApplication} from '../..'; +import {AuthBasicLoginSignupExampleApplication} from '../..'; import {setupApplication} from './test-helper'; describe('PingController', () => { - let app: AuthMultitenantExampleApplication; + let app: AuthBasicLoginSignupExampleApplication; let client: Client; before('setupApplication', async () => { diff --git a/sandbox/auth-basic-login-signup-example/src/__tests__/acceptance/test-helper.ts b/sandbox/auth-basic-login-signup-example/src/__tests__/acceptance/test-helper.ts new file mode 100755 index 0000000000..3d1159a0c4 --- /dev/null +++ b/sandbox/auth-basic-login-signup-example/src/__tests__/acceptance/test-helper.ts @@ -0,0 +1,53 @@ +import {AuthBasicLoginSignupExampleApplication} from '../..'; +import { + createRestAppClient, + givenHttpServerConfig, + Client, +} from '@loopback/testlab'; + +export async function setupApplication(): Promise { + const restConfig = givenHttpServerConfig({ + // Customize the server configuration here. + // Empty values (undefined, '') will be ignored by the helper. + // + // host: process.env.HOST, + // port: +process.env.PORT, + }); + setUpEnv(); + + const app = new AuthBasicLoginSignupExampleApplication({ + rest: restConfig, + }); + + app.bind('datasources.config.db').to({ + name: 'db', + connector: 'memory', + }); + + + app.bind(`datasources.config.${process.env.REDIS_NAME}`).to({ + name: process.env.REDIS_NAME, + connector: 'kv-memory', + }); + + + await app.boot(); + await app.start(); + + const client = createRestAppClient(app); + + return {app, client}; +} + +function setUpEnv() { + process.env.NODE_ENV = 'test'; + process.env.ENABLE_TRACING = '0'; + process.env.ENABLE_OBF = '0'; + process.env.REDIS_NAME = 'redis'; + process.env.HOST='localhost'; +} + +export interface AppWithClient { + app: AuthBasicLoginSignupExampleApplication; + client: Client; +} diff --git a/sandbox/auth-basic-login-signup-example/src/application.ts b/sandbox/auth-basic-login-signup-example/src/application.ts new file mode 100755 index 0000000000..d5863cba98 --- /dev/null +++ b/sandbox/auth-basic-login-signup-example/src/application.ts @@ -0,0 +1,139 @@ +import {BootMixin} from '@loopback/boot'; +import {ApplicationConfig} from '@loopback/core'; +import { + RestExplorerBindings, + RestExplorerComponent, +} from '@loopback/rest-explorer'; +import * as dotenv from 'dotenv'; +import * as dotenvExt from 'dotenv-extended'; +import {AuthenticationBindings, AuthenticationComponent, AuthStrategyProvider, Strategies} from 'loopback4-authentication'; +import { + AuthorizationBindings, + AuthorizationComponent, +} from 'loopback4-authorization'; +import { + ServiceSequence, + SFCoreBindings, + BearerVerifierBindings, + BearerVerifierComponent, + BearerVerifierConfig, + BearerVerifierType, + SECURITY_SCHEME_SPEC, +} from '@sourceloop/core'; +import {AuthenticationServiceComponent, AuthServiceBindings, SignUpBindings} from '@sourceloop/authentication-service' +import {RepositoryMixin} from '@loopback/repository'; +import {RestApplication} from '@loopback/rest'; +import {ServiceMixin} from '@loopback/service-proxy'; +import path from 'path'; +import * as openapi from './openapi.json'; +import { LocalPasswordStrategyFactoryProvider } from 'loopback4-authentication/passport-local'; +import { LocalSignupProvider, SignupTokenHandlerProvider } from './providers'; + +export {ApplicationConfig}; + +export class AuthBasicLoginSignupExampleApplication extends BootMixin( + ServiceMixin(RepositoryMixin(RestApplication)), +) { + constructor(options: ApplicationConfig = {}) { + const port = 3000; + dotenv.config(); + dotenvExt.load({ + schema: '.env.example', + errorOnMissing: process.env.NODE_ENV !== 'test', + includeProcessEnv: true, + }); + options.rest = options.rest ?? {}; + options.rest.basePath = process.env.BASE_PATH ?? ''; + options.rest.port = +(process.env.PORT ?? port); + options.rest.host = process.env.HOST; + options.rest.openApiSpec = { + endpointMapping: { + [`${options.rest.basePath}/openapi.json`]: { + version: '3.0.0', + format: 'json', + }, + }, + }; + + super(options); + + // To check if monitoring is enabled from env or not + const enableObf = !!+(process.env.ENABLE_OBF ?? 0); + // To check if authorization is enabled for swagger stats or not + const authentication = + process.env.SWAGGER_USER && process.env.SWAGGER_PASSWORD ? true : false; + const obj={ + enableObf, + obfPath: process.env.OBF_PATH ?? '/obf', + openapiSpec: openapi, + authentication: authentication, + swaggerUsername: process.env.SWAGGER_USER, + swaggerPassword: process.env.SWAGGER_PASSWORD, + + } + this.bind(SFCoreBindings.config).to(obj); + + // Set up the custom sequence + this.sequence(ServiceSequence); + + // Add authentication component + this.component(AuthenticationComponent); + this.bind(AuthServiceBindings.Config).to({ + useSymmetricEncryption: true, + }); + + + this.bind(Strategies.Passport.LOCAL_STRATEGY_FACTORY).toProvider(LocalPasswordStrategyFactoryProvider); + this.component(AuthenticationServiceComponent); + this.bind(SignUpBindings.LOCAL_SIGNUP_PROVIDER).toProvider( + LocalSignupProvider, + ); + this.bind(SignUpBindings.SIGNUP_HANDLER_PROVIDER).toProvider(SignupTokenHandlerProvider); + + // Add bearer verifier component + this.bind(BearerVerifierBindings.Config).to({ + type: BearerVerifierType.service, + } as BearerVerifierConfig); + this.component(BearerVerifierComponent); + // Add authorization component + this.bind(AuthorizationBindings.CONFIG).to({ + allowAlwaysPaths: ['/explorer', '/openapi.json'], + }); + this.component(AuthorizationComponent); + + // Set up default home page + this.static('/', path.join(__dirname, '../public')); + + // Customize @loopback/rest-explorer configuration here + this.configure(RestExplorerBindings.COMPONENT).to({ + path: '/explorer', + }); + + this.component(RestExplorerComponent); + + + this.projectRoot = __dirname; + // Customize @loopback/boot Booter Conventions here + this.bootOptions = { + controllers: { + // Customize ControllerBooter Conventions here + dirs: ['controllers'], + extensions: ['.controller.js'], + nested: true, + }, + }; + + this.api({ + openapi: '3.0.0', + info: { + title: 'auth-basic-login-signup-example', + version: '1.0.0', + }, + paths: {}, + components: { + securitySchemes: SECURITY_SCHEME_SPEC, + }, + servers: [{url: '/'}], + }); + } +} diff --git a/sandbox/auth-ms-basic-example/src/controllers/README.md b/sandbox/auth-basic-login-signup-example/src/controllers/README.md old mode 100644 new mode 100755 similarity index 100% rename from sandbox/auth-ms-basic-example/src/controllers/README.md rename to sandbox/auth-basic-login-signup-example/src/controllers/README.md diff --git a/sandbox/auth-basic-login-signup-example/src/controllers/home-page.controller.ts b/sandbox/auth-basic-login-signup-example/src/controllers/home-page.controller.ts new file mode 100755 index 0000000000..aa0100d87c --- /dev/null +++ b/sandbox/auth-basic-login-signup-example/src/controllers/home-page.controller.ts @@ -0,0 +1,42 @@ +import {get} from '@loopback/openapi-v3'; +import * as fs from 'fs'; +import * as path from 'path'; +import {inject} from '@loopback/context'; +import {RestBindings, Response} from '@loopback/rest'; +import {authorize} from 'loopback4-authorization'; +import {STATUS_CODE} from '@sourceloop/core'; + +export class HomePageController { + private readonly html: string; + constructor( + @inject(RestBindings.Http.RESPONSE) + private readonly response: Response, + ) { + this.html = fs.readFileSync( + path.join(__dirname, '../../public/index.html'), + 'utf-8', + ); + // Replace base path placeholder from env + this.html = this.html.replace( + /\$\{basePath\}/g, + process.env.BASE_PATH ?? '', + ); + } + + @authorize({permissions: ['*']}) + @get('/', { + responses: { + [STATUS_CODE.OK]: { + description: 'Home Page', + content: {'text/html': {schema: {type: 'string'}}}, + }, + }, + }) + homePage() { + this.response + .status(STATUS_CODE.OK) + .contentType('html') + .send(this.html); + return this.response; + } +} \ No newline at end of file diff --git a/sandbox/auth-basic-login-signup-example/src/controllers/index.ts b/sandbox/auth-basic-login-signup-example/src/controllers/index.ts new file mode 100755 index 0000000000..d20736dff8 --- /dev/null +++ b/sandbox/auth-basic-login-signup-example/src/controllers/index.ts @@ -0,0 +1,2 @@ +export * from './ping.controller'; +export * from './home-page.controller'; diff --git a/sandbox/auth-basic-login-signup-example/src/controllers/ping.controller.ts b/sandbox/auth-basic-login-signup-example/src/controllers/ping.controller.ts new file mode 100755 index 0000000000..008dfbb01b --- /dev/null +++ b/sandbox/auth-basic-login-signup-example/src/controllers/ping.controller.ts @@ -0,0 +1,60 @@ +import {inject} from '@loopback/core'; +import { + Request, + RestBindings, + get, + ResponseObject, +} from '@loopback/rest'; +import {authorize} from 'loopback4-authorization'; +import {STATUS_CODE} from '@sourceloop/core'; + +/** + * OpenAPI response for ping() + */ +const PING_RESPONSE: ResponseObject = { + description: 'Ping Response', + content: { + 'application/json': { + schema: { + type: 'object', + title: 'PingResponse', + properties: { + greeting: {type: 'string'}, + date: {type: 'string'}, + url: {type: 'string'}, + headers: { + type: 'object', + properties: { + 'Content-Type': {type: 'string'}, + }, + additionalProperties: true, + }, + }, + }, + }, + }, +}; + +/** + * A simple controller to bounce back http requests + */ +export class PingController { + constructor(@inject(RestBindings.Http.REQUEST) private readonly req: Request) {} + + // Map to `GET /ping` + @authorize({permissions: ['*']}) + @get('/ping', { + responses: { + [STATUS_CODE.OK]: PING_RESPONSE, + }, + }) + ping(): object { + // Reply with a greeting, the current time, the url, and request headers + return { + greeting: 'Hello from LoopBack', + date: new Date(), + url: this.req.url, + headers: {...this.req.headers}, + }; + } +} diff --git a/sandbox/auth-ms-basic-example/src/datasources/README.md b/sandbox/auth-basic-login-signup-example/src/datasources/README.md old mode 100644 new mode 100755 similarity index 100% rename from sandbox/auth-ms-basic-example/src/datasources/README.md rename to sandbox/auth-basic-login-signup-example/src/datasources/README.md diff --git a/sandbox/auth-basic-login-signup-example/src/datasources/auth.datasource.ts b/sandbox/auth-basic-login-signup-example/src/datasources/auth.datasource.ts new file mode 100755 index 0000000000..2ac2d2e7ea --- /dev/null +++ b/sandbox/auth-basic-login-signup-example/src/datasources/auth.datasource.ts @@ -0,0 +1,54 @@ +import {inject, lifeCycleObserver, LifeCycleObserver} from '@loopback/core'; +import {juggler} from '@loopback/repository'; +import {AuthDbSourceName} from '@sourceloop/authentication-service' + +const DEFAULT_MAX_CONNECTIONS = 25; +const DEFAULT_DB_IDLE_TIMEOUT_MILLIS = 60000; +const DEFAULT_DB_CONNECTION_TIMEOUT_MILLIS = 2000; + +const config = { + name: 'auth', + connector: 'postgresql', + host: process.env.DB_HOST, + port: process.env.DB_PORT, + user: process.env.DB_USER, + schema: process.env.DB_SCHEMA, + password: process.env.DB_PASSWORD, + database: process.env.DB_DATABASE +}; + +// Observe application's life cycle to disconnect the datasource when +// application is stopped. This allows the application to be shut down +// gracefully. The `stop()` method is inherited from `juggler.DataSource`. +// Learn more at https://loopback.io/doc/en/lb4/Life-cycle.html +@lifeCycleObserver('datasource') +export class AuthDataSource extends juggler.DataSource + implements LifeCycleObserver { + + static dataSourceName = AuthDbSourceName; + + + static readonly defaultConfig = config; + + constructor( + @inject('datasources.config.auth', {optional: true}) + dsConfig: object = config, + ) { + if (!!+(process.env.ENABLE_DB_CONNECTION_POOLING ?? 0)) { + const dbPool = { + max: +(process.env.DB_MAX_CONNECTIONS ?? DEFAULT_MAX_CONNECTIONS), + idleTimeoutMillis: +( + process.env.DB_IDLE_TIMEOUT_MILLIS ?? DEFAULT_DB_IDLE_TIMEOUT_MILLIS + ), + connectionTimeoutMillis: +( + process.env.DB_CONNECTION_TIMEOUT_MILLIS ?? + DEFAULT_DB_CONNECTION_TIMEOUT_MILLIS + ), + }; + + dsConfig = {...dsConfig, ...dbPool}; + } + + super(dsConfig); + } +} \ No newline at end of file diff --git a/sandbox/auth-basic-login-signup-example/src/datasources/index.ts b/sandbox/auth-basic-login-signup-example/src/datasources/index.ts new file mode 100755 index 0000000000..d3aaddf849 --- /dev/null +++ b/sandbox/auth-basic-login-signup-example/src/datasources/index.ts @@ -0,0 +1,2 @@ +export * from './auth.datasource'; +export * from './redis.datasource'; diff --git a/sandbox/auth-basic-login-signup-example/src/datasources/redis.datasource.ts b/sandbox/auth-basic-login-signup-example/src/datasources/redis.datasource.ts new file mode 100755 index 0000000000..8af9e0d40f --- /dev/null +++ b/sandbox/auth-basic-login-signup-example/src/datasources/redis.datasource.ts @@ -0,0 +1,65 @@ +import {inject, lifeCycleObserver, LifeCycleObserver} from '@loopback/core'; +import {AnyObject, juggler} from '@loopback/repository'; +import {readFileSync} from 'fs'; +import {AuthCacheSourceName} from '@sourceloop/authentication-service' + +const config = { + name: process.env.REDIS_NAME, + connector: 'kv-redis', + host: process.env.REDIS_HOST, + port: process.env.REDIS_PORT, + password: process.env.REDIS_PASSWORD, + db: process.env.REDIS_DATABASE, + url: process.env.REDIS_URL, + tls: + +process.env.REDIS_TLS_ENABLED! || + (process.env.REDIS_TLS_CERT + ? { + ca: readFileSync(process.env.REDIS_TLS_CERT), + } + : undefined), + sentinels: + +process.env.REDIS_HAS_SENTINELS! && process.env.REDIS_SENTINELS + ? JSON.parse(process.env.REDIS_SENTINELS) + : undefined, + sentinelPassword: + +process.env.REDIS_HAS_SENTINELS! && process.env.REDIS_SENTINEL_PASSWORD + ? process.env.REDIS_SENTINEL_PASSWORD + : undefined, + role: + +process.env.REDIS_HAS_SENTINELS! && process.env.REDIS_SENTINEL_ROLE + ? process.env.REDIS_SENTINEL_ROLE + : undefined, +}; + +// Observe application's life cycle to disconnect the datasource when +// application is stopped. This allows the application to be shut down +// gracefully. The `stop()` method is inherited from `juggler.DataSource`. +// Learn more at https://loopback.io/doc/en/lb4/Life-cycle.html +@lifeCycleObserver('datasource') +export class RedisDataSource + extends juggler.DataSource + implements LifeCycleObserver +{ + static dataSourceName = AuthCacheSourceName; + static readonly defaultConfig = config; + + constructor( + @inject(`datasources.config.${process.env.REDIS_NAME}`, {optional: true}) + dsConfig: AnyObject = config, + ) { + if ( + +process.env.REDIS_HAS_SENTINELS! && + !!process.env.REDIS_SENTINEL_HOST && + !!process.env.REDIS_SENTINEL_PORT + ) { + dsConfig.sentinels = [ + { + host: process.env.REDIS_SENTINEL_HOST, + port: +process.env.REDIS_SENTINEL_PORT, + }, + ]; + } + super(dsConfig); + } +} diff --git a/sandbox/auth-ms-basic-example/src/index.ts b/sandbox/auth-basic-login-signup-example/src/index.ts old mode 100644 new mode 100755 similarity index 69% rename from sandbox/auth-ms-basic-example/src/index.ts rename to sandbox/auth-basic-login-signup-example/src/index.ts index 52165d5193..5d29bcb899 --- a/sandbox/auth-ms-basic-example/src/index.ts +++ b/sandbox/auth-basic-login-signup-example/src/index.ts @@ -1,25 +1,11 @@ -// Copyright (c) 2023 Sourcefuse Technologies -// -// This software is released under the MIT License. -// https://opensource.org/licenses/MIT -import dotenv from 'dotenv'; -import dotenvExt from 'dotenv-extended'; -import { - ApplicationConfig, - AuthMultitenantExampleApplication, -} from './application'; +import {ApplicationConfig, AuthBasicLoginSignupExampleApplication} from './application'; + export * from './application'; -dotenv.config(); -dotenvExt.load({ - schema: '.env.example', - errorOnMissing: true, - includeProcessEnv: true, -}); const PORT = 3000; export async function main(options: ApplicationConfig = {}) { - const app = new AuthMultitenantExampleApplication(options); + const app = new AuthBasicLoginSignupExampleApplication(options); await app.boot(); await app.start(); diff --git a/sandbox/auth-ms-basic-example/src/models/README.md b/sandbox/auth-basic-login-signup-example/src/models/README.md old mode 100644 new mode 100755 similarity index 100% rename from sandbox/auth-ms-basic-example/src/models/README.md rename to sandbox/auth-basic-login-signup-example/src/models/README.md diff --git a/sandbox/auth-ms-basic-example/src/models/index.ts b/sandbox/auth-basic-login-signup-example/src/models/index.ts old mode 100644 new mode 100755 similarity index 100% rename from sandbox/auth-ms-basic-example/src/models/index.ts rename to sandbox/auth-basic-login-signup-example/src/models/index.ts diff --git a/sandbox/auth-ms-basic-example/src/models/to-do.model.ts b/sandbox/auth-basic-login-signup-example/src/models/to-do.model.ts old mode 100644 new mode 100755 similarity index 100% rename from sandbox/auth-ms-basic-example/src/models/to-do.model.ts rename to sandbox/auth-basic-login-signup-example/src/models/to-do.model.ts diff --git a/sandbox/auth-ms-basic-example/src/models/user.dto.ts b/sandbox/auth-basic-login-signup-example/src/models/user.dto.ts old mode 100644 new mode 100755 similarity index 100% rename from sandbox/auth-ms-basic-example/src/models/user.dto.ts rename to sandbox/auth-basic-login-signup-example/src/models/user.dto.ts diff --git a/sandbox/auth-basic-login-signup-example/src/openapi-spec.ts b/sandbox/auth-basic-login-signup-example/src/openapi-spec.ts new file mode 100755 index 0000000000..b78a2056f1 --- /dev/null +++ b/sandbox/auth-basic-login-signup-example/src/openapi-spec.ts @@ -0,0 +1,31 @@ +import {ApplicationConfig} from '@loopback/core'; +import {AuthBasicLoginSignupExampleApplication} from './application'; + +const ARGV_INDEX = 2; +/** + * Export the OpenAPI spec from the application + */ +async function exportOpenApiSpec(): Promise { + const config: ApplicationConfig = { + rest: { + port: +(process.env.PORT ?? 3000), + host: process.env.HOST ?? 'localhost', + }, + }; + const outFile = process.argv[ARGV_INDEX] ?? './src/openapi.json'; + const app = new AuthBasicLoginSignupExampleApplication(config); + await app.boot(); + await app.exportOpenApiSpec(outFile); +} + +exportOpenApiSpec() + .then(() => { + process.exit(0); + }) + .catch(err => { + console.error( + 'Fail to export OpenAPI spec from the application.', + err, + ); + process.exit(1); + }); diff --git a/sandbox/auth-basic-login-signup-example/src/openapi.json b/sandbox/auth-basic-login-signup-example/src/openapi.json new file mode 100755 index 0000000000..761b4af63b --- /dev/null +++ b/sandbox/auth-basic-login-signup-example/src/openapi.json @@ -0,0 +1,3036 @@ +{ + "openapi": "3.0.0", + "info": { + "title": "auth-basic-login-signup-example", + "version": "1.0.0", + "description": "auth-basic-login-signup-example", + "contact": { + "name": "Tyagi-Sunny", + "email": "sunny.tyagi@sourcefuse.com" + } + }, + "paths": { + "/.well-known/openid-configuration": { + "get": { + "x-controller-name": "IdentityServerController", + "x-operation-name": "getConfig", + "tags": [ + "IdentityServerController" + ], + "security": [ + { + "HTTPBearer": [] + } + ], + "description": "To get the openid configuration", + "responses": { + "200": { + "description": "OpenId Configuration", + "content": {} + }, + "400": { + "description": "The syntax of the request entity is incorrect." + }, + "401": { + "description": "Invalid Credentials." + }, + "404": { + "description": "The entity requested does not exist." + }, + "422": { + "description": "The syntax of the request entity is incorrect" + } + }, + "operationId": "IdentityServerController.getConfig" + } + }, + "/active-users/{range}": { + "get": { + "x-controller-name": "LoginActivityController", + "x-operation-name": "getActiveUsers", + "tags": [ + "LoginActivityController" + ], + "security": [ + { + "HTTPBearer": [] + } + ], + "responses": { + "200": { + "description": "LoginActivity model instance", + "content": { + "application/json": { + "schema": {} + } + } + } + }, + "description": "\n\n| Permissions |\n| ------- |\n| ViewLoginActivity |\n", + "parameters": [ + { + "name": "range", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "startDate", + "in": "query", + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "name": "endDate", + "in": "query", + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "name": "filter", + "in": "query", + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": true + } + } + } + } + ], + "operationId": "LoginActivityController.getActiveUsers" + } + }, + "/auth/apple-oauth-redirect": { + "get": { + "x-controller-name": "AppleLoginController", + "x-operation-name": "appleCallback", + "tags": [ + "AppleLoginController" + ], + "responses": { + "200": { + "description": "Apple Redirect Token Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TokenResponse" + } + } + } + } + }, + "description": "", + "parameters": [ + { + "name": "code", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "state", + "in": "query", + "schema": { + "type": "string" + } + } + ], + "operationId": "AppleLoginController.appleCallback" + } + }, + "/auth/auth0": { + "post": { + "x-controller-name": "Auth0LoginController", + "x-operation-name": "postLoginViaAuth0", + "tags": [ + "Auth0LoginController" + ], + "responses": { + "200": { + "description": "POST Call for auth0 based login", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TokenResponse" + } + } + } + } + }, + "description": "", + "requestBody": { + "content": { + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/ClientAuthRequest" + } + } + } + }, + "operationId": "Auth0LoginController.postLoginViaAuth0" + }, + "get": { + "x-controller-name": "Auth0LoginController", + "x-operation-name": "loginViaAuth0", + "tags": [ + "Auth0LoginController" + ], + "responses": { + "200": { + "description": "POST Call for auth0 based login", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TokenResponse" + } + } + } + } + }, + "description": "", + "deprecated": true, + "parameters": [ + { + "name": "client_id", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "client_secret", + "in": "query", + "schema": { + "type": "string" + } + } + ], + "operationId": "Auth0LoginController.loginViaAuth0" + } + }, + "/auth/auth0-auth-redirect": { + "get": { + "x-controller-name": "Auth0LoginController", + "x-operation-name": "auth0Callback", + "tags": [ + "Auth0LoginController" + ], + "responses": { + "200": { + "description": "Redirect Token Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TokenResponse" + } + } + } + } + }, + "description": "", + "parameters": [ + { + "name": "code", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "state", + "in": "query", + "schema": { + "type": "string" + } + } + ], + "operationId": "Auth0LoginController.auth0Callback" + } + }, + "/auth/azure": { + "post": { + "x-controller-name": "AzureLoginController", + "x-operation-name": "postLoginViaAzure", + "tags": [ + "AzureLoginController" + ], + "description": "POST Call for azure based login", + "responses": { + "200": { + "description": "Azure Token Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TokenResponse" + } + } + } + } + }, + "requestBody": { + "content": { + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/ClientAuthRequest" + } + } + } + }, + "operationId": "AzureLoginController.postLoginViaAzure" + }, + "get": { + "x-controller-name": "AzureLoginController", + "x-operation-name": "getLoginViaAzure", + "tags": [ + "AzureLoginController" + ], + "description": "POST Call for azure based login", + "responses": { + "200": { + "description": "Azure Token Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TokenResponse" + } + } + } + } + }, + "deprecated": true, + "parameters": [ + { + "name": "client_id", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "client_secret", + "in": "query", + "schema": { + "type": "string" + } + } + ], + "operationId": "AzureLoginController.getLoginViaAzure" + } + }, + "/auth/azure-oauth-redirect": { + "get": { + "x-controller-name": "AzureLoginController", + "x-operation-name": "azureCallback", + "tags": [ + "AzureLoginController" + ], + "responses": { + "200": { + "description": "Azure Redirect Token Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TokenResponse" + } + } + } + } + }, + "description": "", + "parameters": [ + { + "name": "code", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "state", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "session_state", + "in": "query", + "schema": { + "type": "string" + } + } + ], + "operationId": "AzureLoginController.azureCallback" + } + }, + "/auth/change-password": { + "patch": { + "x-controller-name": "LoginController", + "x-operation-name": "resetPassword", + "tags": [ + "LoginController" + ], + "security": [ + { + "HTTPBearer": [] + } + ], + "responses": { + "200": { + "description": "If User password successfully changed." + } + }, + "description": "", + "parameters": [ + { + "name": "Authorization", + "in": "header", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ResetPasswordPartial" + } + } + } + }, + "operationId": "LoginController.resetPassword" + } + }, + "/auth/check-qr-code": { + "get": { + "x-controller-name": "OtpController", + "x-operation-name": "checkQr", + "tags": [ + "OtpController" + ], + "description": "Returns isGenerated:true if secret_key already exist", + "responses": { + "200": { + "description": "secret_key already exists", + "content": {} + }, + "400": { + "description": "The syntax of the request entity is incorrect." + }, + "401": { + "description": "Invalid Credentials." + }, + "404": { + "description": "The entity requested does not exist." + }, + "422": { + "description": "The syntax of the request entity is incorrect" + } + }, + "parameters": [ + { + "name": "code", + "in": "header", + "schema": { + "type": "string" + } + }, + { + "name": "clientId", + "in": "header", + "schema": { + "type": "string" + } + } + ], + "operationId": "OtpController.checkQr" + } + }, + "/auth/cognito": { + "post": { + "x-controller-name": "CognitoLoginController", + "x-operation-name": "postLoginViaCognito", + "tags": [ + "CognitoLoginController" + ], + "responses": { + "200": { + "description": "POST Call for Cognito based login", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TokenResponse" + } + } + } + } + }, + "description": "", + "requestBody": { + "content": { + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/ClientAuthRequest" + } + } + } + }, + "operationId": "CognitoLoginController.postLoginViaCognito" + }, + "get": { + "x-controller-name": "CognitoLoginController", + "x-operation-name": "loginViaCognito", + "tags": [ + "CognitoLoginController" + ], + "responses": { + "200": { + "description": "Cognito Token Response (Deprecated: Possible security issue if secret is passed via query params, please use the post endpoint)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TokenResponse" + } + } + } + } + }, + "description": "", + "deprecated": true, + "parameters": [ + { + "name": "client_id", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "client_secret", + "in": "query", + "schema": { + "type": "string" + } + } + ], + "operationId": "CognitoLoginController.loginViaCognito" + } + }, + "/auth/cognito-auth-redirect": { + "get": { + "x-controller-name": "CognitoLoginController", + "x-operation-name": "cognitoCallback", + "tags": [ + "CognitoLoginController" + ], + "responses": { + "200": { + "description": "Cognito Redirect Token Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TokenResponse" + } + } + } + } + }, + "description": "", + "parameters": [ + { + "name": "code", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "state", + "in": "query", + "schema": { + "type": "string" + } + } + ], + "operationId": "CognitoLoginController.cognitoCallback" + } + }, + "/auth/create-qr-code": { + "post": { + "x-controller-name": "OtpController", + "x-operation-name": "createQr", + "tags": [ + "OtpController" + ], + "description": "Generates a new qrCode for Authenticator App", + "responses": { + "200": { + "description": "qrCode that you can use to generate codes in Authenticator App", + "content": {} + }, + "400": { + "description": "The syntax of the request entity is incorrect." + }, + "401": { + "description": "Invalid Credentials." + }, + "404": { + "description": "The entity requested does not exist." + }, + "422": { + "description": "The syntax of the request entity is incorrect" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AuthTokenRequest" + } + } + } + }, + "operationId": "OtpController.createQr" + } + }, + "/auth/facebook": { + "post": { + "x-controller-name": "FacebookLoginController", + "x-operation-name": "postLoginViaFacebook", + "tags": [ + "FacebookLoginController" + ], + "responses": { + "200": { + "description": "POST Call for Facebook based login", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TokenResponse" + } + } + } + } + }, + "description": "", + "requestBody": { + "content": { + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/ClientAuthRequest" + } + } + } + }, + "operationId": "FacebookLoginController.postLoginViaFacebook" + } + }, + "/auth/facebook-auth-redirect": { + "get": { + "x-controller-name": "FacebookLoginController", + "x-operation-name": "facebookCallback", + "tags": [ + "FacebookLoginController" + ], + "responses": { + "200": { + "description": "Facebook Redirect Token Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TokenResponse" + } + } + } + } + }, + "description": "", + "parameters": [ + { + "name": "code", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "state", + "in": "query", + "schema": { + "type": "string" + } + } + ], + "operationId": "FacebookLoginController.facebookCallback" + } + }, + "/auth/forget-password": { + "post": { + "x-controller-name": "ForgetPasswordController", + "x-operation-name": "forgetPassword", + "tags": [ + "ForgetPasswordController" + ], + "security": [ + { + "HTTPBearer": [] + } + ], + "responses": { + "204": { + "description": "Success Response." + }, + "400": { + "description": "The syntax of the request entity is incorrect." + }, + "401": { + "description": "Invalid Credentials." + }, + "404": { + "description": "The entity requested does not exist." + }, + "422": { + "description": "The syntax of the request entity is incorrect" + } + }, + "description": "", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ForgetPasswordDto" + } + } + } + }, + "operationId": "ForgetPasswordController.forgetPassword" + } + }, + "/auth/google": { + "post": { + "x-controller-name": "GoogleLoginController", + "x-operation-name": "postLoginViaGoogle", + "tags": [ + "GoogleLoginController" + ], + "responses": { + "200": { + "description": "POST Call for Google based login", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TokenResponse" + } + } + } + } + }, + "description": "", + "requestBody": { + "content": { + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/ClientAuthRequest" + } + } + } + }, + "operationId": "GoogleLoginController.postLoginViaGoogle" + }, + "get": { + "x-controller-name": "GoogleLoginController", + "x-operation-name": "loginViaGoogle", + "tags": [ + "GoogleLoginController" + ], + "responses": { + "200": { + "description": "Google Token Response,\n (Deprecated: Possible security issue if secret is passed via query params,\n please use the post endpoint)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TokenResponse" + } + } + } + } + }, + "description": "", + "deprecated": true, + "parameters": [ + { + "name": "client_id", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "client_secret", + "in": "query", + "schema": { + "type": "string" + } + } + ], + "operationId": "GoogleLoginController.loginViaGoogle" + } + }, + "/auth/google-auth-redirect": { + "get": { + "x-controller-name": "GoogleLoginController", + "x-operation-name": "googleCallback", + "tags": [ + "GoogleLoginController" + ], + "responses": { + "200": { + "description": "Google Redirect Token Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TokenResponse" + } + } + } + } + }, + "description": "", + "parameters": [ + { + "name": "code", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "state", + "in": "query", + "schema": { + "type": "string" + } + } + ], + "operationId": "GoogleLoginController.googleCallback" + } + }, + "/auth/instagram": { + "post": { + "x-controller-name": "InstagramLoginController", + "x-operation-name": "postLoginViaInstagram", + "tags": [ + "InstagramLoginController" + ], + "responses": { + "200": { + "description": "POST Call for Instagram based login", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TokenResponse" + } + } + } + } + }, + "description": "", + "requestBody": { + "content": { + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/ClientAuthRequest" + } + } + } + }, + "operationId": "InstagramLoginController.postLoginViaInstagram" + } + }, + "/auth/instagram-auth-redirect": { + "get": { + "x-controller-name": "InstagramLoginController", + "x-operation-name": "instagramCallback", + "tags": [ + "InstagramLoginController" + ], + "responses": { + "200": { + "description": "Instagram Redirect Token Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TokenResponse" + } + } + } + } + }, + "description": "", + "parameters": [ + { + "name": "code", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "state", + "in": "query", + "schema": { + "type": "string" + } + } + ], + "operationId": "InstagramLoginController.instagramCallback" + } + }, + "/auth/keycloak": { + "post": { + "x-controller-name": "KeycloakLoginController", + "x-operation-name": "postLoginViaKeycloak", + "tags": [ + "KeycloakLoginController" + ], + "description": "POST Call for keycloak based login", + "responses": { + "200": { + "description": "Keycloak Token Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TokenResponse" + } + } + } + } + }, + "requestBody": { + "content": { + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/ClientAuthRequest" + } + } + } + }, + "operationId": "KeycloakLoginController.postLoginViaKeycloak" + }, + "get": { + "x-controller-name": "KeycloakLoginController", + "x-operation-name": "loginViaKeycloak", + "tags": [ + "KeycloakLoginController" + ], + "responses": { + "200": { + "description": "Keycloak Token Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TokenResponse" + } + } + } + } + }, + "description": "", + "deprecated": true, + "parameters": [ + { + "name": "client_id", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "client_secret", + "in": "query", + "schema": { + "type": "string" + } + } + ], + "operationId": "KeycloakLoginController.loginViaKeycloak" + } + }, + "/auth/keycloak-auth-redirect": { + "get": { + "x-controller-name": "KeycloakLoginController", + "x-operation-name": "keycloakCallback", + "tags": [ + "KeycloakLoginController" + ], + "responses": { + "200": { + "description": "Keycloak Redirect Token Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TokenResponse" + } + } + } + } + }, + "description": "", + "parameters": [ + { + "name": "code", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "state", + "in": "query", + "schema": { + "type": "string" + } + } + ], + "operationId": "KeycloakLoginController.keycloakCallback" + } + }, + "/auth/login": { + "post": { + "x-controller-name": "LoginController", + "x-operation-name": "login", + "tags": [ + "LoginController" + ], + "description": "Gets you the code that will be used for getting token (webapps)", + "responses": { + "200": { + "description": "Auth Code that you can use to generate access and refresh tokens using the POST /auth/token API", + "content": {} + }, + "400": { + "description": "The syntax of the request entity is incorrect." + }, + "401": { + "description": "Invalid Credentials." + }, + "404": { + "description": "The entity requested does not exist." + }, + "422": { + "description": "The syntax of the request entity is incorrect" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LoginRequest" + } + } + } + }, + "operationId": "LoginController.login" + } + }, + "/auth/login-token": { + "post": { + "x-controller-name": "LoginController", + "x-operation-name": "loginWithClientUser", + "tags": [ + "LoginController" + ], + "description": "Gets you refresh token and access token in one hit. (mobile app)", + "responses": { + "200": { + "description": "Token Response Model", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TokenResponse" + } + } + } + }, + "400": { + "description": "The syntax of the request entity is incorrect." + }, + "401": { + "description": "Invalid Credentials." + }, + "404": { + "description": "The entity requested does not exist." + }, + "422": { + "description": "The syntax of the request entity is incorrect" + } + }, + "deprecated": true, + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LoginRequest" + } + } + } + }, + "operationId": "LoginController.loginWithClientUser" + } + }, + "/auth/me": { + "get": { + "x-controller-name": "LoginController", + "x-operation-name": "me", + "tags": [ + "LoginController" + ], + "security": [ + { + "HTTPBearer": [] + } + ], + "description": "To get the user details", + "responses": { + "200": { + "description": "User Object", + "content": {} + }, + "400": { + "description": "The syntax of the request entity is incorrect." + }, + "401": { + "description": "Invalid Credentials." + }, + "404": { + "description": "The entity requested does not exist." + }, + "422": { + "description": "The syntax of the request entity is incorrect" + } + }, + "operationId": "LoginController.me" + } + }, + "/auth/oauth-apple": { + "post": { + "x-controller-name": "AppleLoginController", + "x-operation-name": "postLoginViaApple", + "tags": [ + "AppleLoginController" + ], + "responses": { + "200": { + "description": "POST Call for Apple based login", + "content": {} + } + }, + "description": "", + "requestBody": { + "content": { + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/ClientAuthRequest" + } + } + } + }, + "operationId": "AppleLoginController.postLoginViaApple" + } + }, + "/auth/reset-password": { + "patch": { + "x-controller-name": "ForgetPasswordController", + "x-operation-name": "resetPassword", + "tags": [ + "ForgetPasswordController" + ], + "security": [ + { + "HTTPBearer": [] + } + ], + "responses": { + "204": { + "description": "If User password successfully changed." + } + }, + "description": "", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ResetPasswordWithClient" + } + } + } + }, + "operationId": "ForgetPasswordController.resetPassword" + } + }, + "/auth/saml": { + "post": { + "x-controller-name": "SamlLoginController", + "x-operation-name": "postLoginViaSaml", + "tags": [ + "SamlLoginController" + ], + "description": "POST Call for saml based login", + "responses": { + "200": { + "description": "Saml Token Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TokenResponse" + } + } + } + } + }, + "requestBody": { + "content": { + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/ClientAuthRequest" + } + } + } + }, + "operationId": "SamlLoginController.postLoginViaSaml" + } + }, + "/auth/saml-redirect": { + "post": { + "x-controller-name": "SamlLoginController", + "x-operation-name": "oktaSamlCallback", + "tags": [ + "SamlLoginController" + ], + "responses": { + "200": { + "description": "okta auth callback", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TokenResponse" + } + } + } + } + }, + "description": "", + "parameters": [ + { + "name": "client", + "in": "query", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/x-www-form-urlencoded": { + "schema": { + "type": "object" + } + } + }, + "x-parameter-index": 1 + }, + "operationId": "SamlLoginController.oktaSamlCallback" + } + }, + "/auth/send-otp": { + "post": { + "x-controller-name": "OtpController", + "x-operation-name": "sendOtp", + "tags": [ + "OtpController" + ], + "description": "Sends OTP", + "responses": { + "200": { + "description": "Sends otp to user", + "content": {} + }, + "400": { + "description": "The syntax of the request entity is incorrect." + }, + "401": { + "description": "Invalid Credentials." + }, + "404": { + "description": "The entity requested does not exist." + }, + "422": { + "description": "The syntax of the request entity is incorrect" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OtpSendRequest" + } + } + } + }, + "operationId": "OtpController.sendOtp" + } + }, + "/auth/sign-up/create-token": { + "post": { + "x-controller-name": "SignupRequestController", + "x-operation-name": "requestSignup", + "tags": [ + "SignupRequestController" + ], + "responses": { + "204": { + "description": "Sucess Response." + }, + "400": { + "description": "The syntax of the request entity is incorrect." + }, + "401": { + "description": "Invalid Credentials." + }, + "404": { + "description": "The entity requested does not exist." + }, + "422": { + "description": "The syntax of the request entity is incorrect" + } + }, + "description": "", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SignupRequestDto" + } + } + } + }, + "operationId": "SignupRequestController.requestSignup" + } + }, + "/auth/sign-up/create-user": { + "post": { + "x-controller-name": "SignupRequestController", + "x-operation-name": "signupWithToken", + "tags": [ + "SignupRequestController" + ], + "security": [ + { + "HTTPBearer": [] + } + ], + "responses": { + "200": { + "description": "Sucess Response.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LocalUserProfileDto" + } + } + } + }, + "400": { + "description": "The syntax of the request entity is incorrect." + }, + "401": { + "description": "Invalid Credentials." + }, + "404": { + "description": "The entity requested does not exist." + }, + "422": { + "description": "The syntax of the request entity is incorrect" + } + }, + "description": "", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LocalUserProfileDto" + } + } + } + }, + "operationId": "SignupRequestController.signupWithToken" + } + }, + "/auth/sign-up/verify-token": { + "get": { + "x-controller-name": "SignupRequestController", + "x-operation-name": "verifyInviteToken", + "tags": [ + "SignupRequestController" + ], + "security": [ + { + "HTTPBearer": [] + } + ], + "responses": { + "200": { + "description": "Sucess Response." + }, + "400": { + "description": "The syntax of the request entity is incorrect." + }, + "401": { + "description": "Invalid Credentials." + }, + "404": { + "description": "The entity requested does not exist." + }, + "422": { + "description": "The syntax of the request entity is incorrect" + } + }, + "description": "", + "operationId": "SignupRequestController.verifyInviteToken" + } + }, + "/auth/switch-token": { + "post": { + "x-controller-name": "LoginController", + "x-operation-name": "switchToken", + "tags": [ + "LoginController" + ], + "security": [ + { + "HTTPBearer": [] + } + ], + "description": "To switch the access-token", + "responses": { + "200": { + "description": "Switch access token with the tenant id provided.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TokenResponse" + } + } + } + }, + "400": { + "description": "The syntax of the request entity is incorrect." + }, + "401": { + "description": "Invalid Credentials." + }, + "404": { + "description": "The entity requested does not exist." + }, + "422": { + "description": "The syntax of the request entity is incorrect" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AuthRefreshTokenRequest" + } + } + } + }, + "operationId": "LoginController.switchToken" + } + }, + "/auth/token": { + "post": { + "x-controller-name": "LoginController", + "x-operation-name": "getToken", + "tags": [ + "LoginController" + ], + "description": "Send the code received from the POST /auth/login api and get refresh token and access token (webapps)", + "responses": { + "200": { + "description": "Token Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TokenResponse" + } + } + } + }, + "400": { + "description": "The syntax of the request entity is incorrect." + }, + "401": { + "description": "Invalid Credentials." + }, + "404": { + "description": "The entity requested does not exist." + }, + "422": { + "description": "The syntax of the request entity is incorrect" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AuthTokenRequest" + } + } + } + }, + "operationId": "LoginController.getToken" + } + }, + "/auth/token-refresh": { + "post": { + "x-controller-name": "LoginController", + "x-operation-name": "exchangeToken", + "tags": [ + "LoginController" + ], + "security": [ + { + "HTTPBearer": [] + } + ], + "description": "Gets you a new access and refresh token once your access token is expired", + "responses": { + "200": { + "description": "New Token Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TokenResponse" + } + } + } + }, + "400": { + "description": "The syntax of the request entity is incorrect." + }, + "401": { + "description": "Invalid Credentials." + }, + "404": { + "description": "The entity requested does not exist." + }, + "422": { + "description": "The syntax of the request entity is incorrect" + } + }, + "parameters": [ + { + "name": "device_id", + "in": "header", + "schema": { + "type": "string" + } + }, + { + "name": "Authorization", + "in": "header", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AuthRefreshTokenRequest" + } + } + } + }, + "operationId": "LoginController.exchangeToken" + } + }, + "/auth/verify-otp": { + "post": { + "x-controller-name": "OtpController", + "x-operation-name": "verifyOtp", + "tags": [ + "OtpController" + ], + "description": "Gets you the code that will be used for getting token (webapps)", + "responses": { + "200": { + "description": "Auth Code that you can use to generate access and refresh tokens using the POST /auth/token API", + "content": {} + }, + "400": { + "description": "The syntax of the request entity is incorrect." + }, + "401": { + "description": "Invalid Credentials." + }, + "404": { + "description": "The entity requested does not exist." + }, + "422": { + "description": "The syntax of the request entity is incorrect" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OtpLoginRequest" + } + } + } + }, + "operationId": "OtpController.verifyOtp" + } + }, + "/auth/verify-reset-password-link": { + "get": { + "x-controller-name": "ForgetPasswordController", + "x-operation-name": "verifyResetPasswordLink", + "tags": [ + "ForgetPasswordController" + ], + "responses": { + "200": { + "description": "Check if Token Is Valid and not Expired." + } + }, + "description": "", + "parameters": [ + { + "name": "token", + "in": "query", + "schema": { + "type": "string" + }, + "required": true + } + ], + "operationId": "ForgetPasswordController.verifyResetPasswordLink" + } + }, + "/cognito/logout": { + "post": { + "x-controller-name": "LogoutController", + "x-operation-name": "cognitoLogout", + "tags": [ + "LogoutController" + ], + "security": [ + { + "HTTPBearer": [] + } + ], + "description": "This API will log out the user from application as well as cognito", + "responses": { + "200": { + "description": "Success Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "The syntax of the request entity is incorrect." + }, + "401": { + "description": "Invalid Credentials." + }, + "404": { + "description": "The entity requested does not exist." + }, + "422": { + "description": "The syntax of the request entity is incorrect" + } + }, + "parameters": [ + { + "name": "Authorization", + "in": "header", + "schema": { + "type": "string" + }, + "description": "This is the access token which is required to authenticate user." + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RefreshTokenRequestPartial" + } + } + }, + "x-parameter-index": 1 + }, + "operationId": "LogoutController.cognitoLogout" + } + }, + "/connect/endsession": { + "post": { + "x-controller-name": "IdentityServerController", + "x-operation-name": "logout", + "tags": [ + "IdentityServerController" + ], + "security": [ + { + "HTTPBearer": [] + } + ], + "description": "To logout", + "responses": { + "200": { + "description": "Success Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "The syntax of the request entity is incorrect." + }, + "401": { + "description": "Invalid Credentials." + }, + "404": { + "description": "The entity requested does not exist." + }, + "422": { + "description": "The syntax of the request entity is incorrect" + } + }, + "parameters": [ + { + "name": "Authorization", + "in": "header", + "schema": { + "type": "string" + }, + "description": "This is the access token which is required to authenticate user." + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AuthRefreshTokenRequestPartial" + } + } + }, + "x-parameter-index": 1 + }, + "operationId": "IdentityServerController.logout" + } + }, + "/connect/generate-keys": { + "post": { + "x-controller-name": "IdentityServerController", + "x-operation-name": "generateKeys", + "tags": [ + "IdentityServerController" + ], + "description": "Generate the set of public and private keys", + "responses": { + "200": { + "description": "JWKS Keys" + }, + "400": { + "description": "The syntax of the request entity is incorrect." + }, + "401": { + "description": "Invalid Credentials." + }, + "404": { + "description": "The entity requested does not exist." + }, + "422": { + "description": "The syntax of the request entity is incorrect" + } + }, + "operationId": "IdentityServerController.generateKeys" + } + }, + "/connect/get-keys": { + "get": { + "x-controller-name": "IdentityServerController", + "x-operation-name": "getKeys", + "tags": [ + "IdentityServerController" + ], + "description": "Get the public keys", + "responses": { + "200": { + "description": "JWKS Keys" + }, + "400": { + "description": "The syntax of the request entity is incorrect." + }, + "401": { + "description": "Invalid Credentials." + }, + "404": { + "description": "The entity requested does not exist." + }, + "422": { + "description": "The syntax of the request entity is incorrect" + } + }, + "operationId": "IdentityServerController.getKeys" + } + }, + "/connect/rotate-keys": { + "post": { + "x-controller-name": "IdentityServerController", + "x-operation-name": "rotateKeys", + "tags": [ + "IdentityServerController" + ], + "description": "Generate the set of public and private keys", + "responses": { + "200": { + "description": "JWKS Keys" + }, + "400": { + "description": "The syntax of the request entity is incorrect." + }, + "401": { + "description": "Invalid Credentials." + }, + "404": { + "description": "The entity requested does not exist." + }, + "422": { + "description": "The syntax of the request entity is incorrect" + } + }, + "operationId": "IdentityServerController.rotateKeys" + } + }, + "/connect/token": { + "post": { + "x-controller-name": "IdentityServerController", + "x-operation-name": "getToken", + "tags": [ + "IdentityServerController" + ], + "description": "Send the code received from the POST /auth/login api and get refresh token and access token (webapps)", + "responses": { + "200": { + "description": "Token Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TokenResponse" + } + } + } + }, + "400": { + "description": "The syntax of the request entity is incorrect." + }, + "401": { + "description": "Invalid Credentials." + }, + "404": { + "description": "The entity requested does not exist." + }, + "422": { + "description": "The syntax of the request entity is incorrect" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AuthTokenRequest" + } + } + } + }, + "operationId": "IdentityServerController.getToken" + } + }, + "/connect/userinfo": { + "get": { + "x-controller-name": "IdentityServerController", + "x-operation-name": "me", + "tags": [ + "IdentityServerController" + ], + "security": [ + { + "HTTPBearer": [] + } + ], + "description": "To get the user details", + "responses": { + "200": { + "description": "User Object", + "content": {} + }, + "400": { + "description": "The syntax of the request entity is incorrect." + }, + "401": { + "description": "Invalid Credentials." + }, + "404": { + "description": "The entity requested does not exist." + }, + "422": { + "description": "The syntax of the request entity is incorrect" + } + }, + "operationId": "IdentityServerController.me" + } + }, + "/google/logout": { + "post": { + "x-controller-name": "LogoutController", + "x-operation-name": "googleLogout", + "tags": [ + "LogoutController" + ], + "security": [ + { + "HTTPBearer": [] + } + ], + "description": "This API will log out the user from application as well as google", + "responses": { + "200": { + "description": "Success Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "The syntax of the request entity is incorrect." + }, + "401": { + "description": "Invalid Credentials." + }, + "404": { + "description": "The entity requested does not exist." + }, + "422": { + "description": "The syntax of the request entity is incorrect" + } + }, + "parameters": [ + { + "name": "Authorization", + "in": "header", + "schema": { + "type": "string" + }, + "description": "This is the access token which is required to authenticate user." + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RefreshTokenRequestPartial" + } + } + }, + "x-parameter-index": 1 + }, + "operationId": "LogoutController.googleLogout" + } + }, + "/keycloak/logout": { + "post": { + "x-controller-name": "LogoutController", + "x-operation-name": "keycloakLogout", + "tags": [ + "LogoutController" + ], + "security": [ + { + "HTTPBearer": [] + } + ], + "description": "This API will log out the user from application as well as keycloak", + "responses": { + "200": { + "description": "Success Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "The syntax of the request entity is incorrect." + }, + "401": { + "description": "Invalid Credentials." + }, + "404": { + "description": "The entity requested does not exist." + }, + "422": { + "description": "The syntax of the request entity is incorrect" + } + }, + "parameters": [ + { + "name": "Authorization", + "in": "header", + "schema": { + "type": "string" + }, + "description": "This is the access token which is required to authenticate user." + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RefreshTokenRequestPartial" + } + } + }, + "x-parameter-index": 1 + }, + "operationId": "LogoutController.keycloakLogout" + } + }, + "/login-activity/count": { + "get": { + "x-controller-name": "LoginActivityController", + "x-operation-name": "count", + "tags": [ + "LoginActivityController" + ], + "security": [ + { + "HTTPBearer": [] + } + ], + "responses": { + "200": { + "description": "LoginActivity model count", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/loopback.Count" + } + } + } + } + }, + "description": "\n\n| Permissions |\n| ------- |\n| ViewLoginActivity |\n", + "parameters": [ + { + "name": "where", + "in": "query", + "content": { + "application/json": { + "schema": { + "type": "object", + "title": "login_activity.WhereFilter", + "additionalProperties": true, + "x-typescript-type": "@loopback/repository#Where" + } + } + } + } + ], + "operationId": "LoginActivityController.count" + } + }, + "/login-activity/{id}": { + "get": { + "x-controller-name": "LoginActivityController", + "x-operation-name": "findById", + "tags": [ + "LoginActivityController" + ], + "security": [ + { + "HTTPBearer": [] + } + ], + "responses": { + "200": { + "description": "LoginActivity model instance", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LoginActivityWithRelations" + } + } + } + } + }, + "description": "\n\n| Permissions |\n| ------- |\n| ViewLoginActivity |\n", + "parameters": [ + { + "name": "id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "filter", + "in": "query", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/login_activity.Filter" + } + } + } + } + ], + "operationId": "LoginActivityController.findById" + } + }, + "/login-activity": { + "get": { + "x-controller-name": "LoginActivityController", + "x-operation-name": "find", + "tags": [ + "LoginActivityController" + ], + "security": [ + { + "HTTPBearer": [] + } + ], + "responses": { + "200": { + "description": "Array of LoginActivity model instances", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/LoginActivityWithRelations" + } + } + } + } + } + }, + "description": "\n\n| Permissions |\n| ------- |\n| ViewLoginActivity |\n", + "parameters": [ + { + "name": "filter", + "in": "query", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/login_activity.Filter" + } + } + } + } + ], + "operationId": "LoginActivityController.find" + } + }, + "/logout": { + "post": { + "x-controller-name": "LogoutController", + "x-operation-name": "logout", + "tags": [ + "LogoutController" + ], + "security": [ + { + "HTTPBearer": [] + } + ], + "description": "To logout", + "responses": { + "200": { + "description": "Success Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "The syntax of the request entity is incorrect." + }, + "401": { + "description": "Invalid Credentials." + }, + "404": { + "description": "The entity requested does not exist." + }, + "422": { + "description": "The syntax of the request entity is incorrect" + } + }, + "parameters": [ + { + "name": "Authorization", + "in": "header", + "schema": { + "type": "string" + }, + "description": "This is the access token which is required to authenticate user." + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RefreshTokenRequestPartial" + } + } + }, + "x-parameter-index": 1 + }, + "operationId": "LogoutController.logout" + } + }, + "/ping": { + "get": { + "x-controller-name": "PingController", + "x-operation-name": "ping", + "tags": [ + "PingController" + ], + "responses": { + "200": { + "description": "Ping Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PingResponse" + } + } + } + } + }, + "description": "", + "operationId": "PingController.ping" + } + }, + "/": { + "get": { + "x-controller-name": "HomePageController", + "x-operation-name": "homePage", + "tags": [ + "HomePageController" + ], + "responses": { + "200": { + "description": "Home Page", + "content": { + "text/html": { + "schema": { + "type": "string" + } + } + } + } + }, + "description": "", + "operationId": "HomePageController.homePage" + } + } + }, + "components": { + "securitySchemes": { + "HTTPBearer": { + "type": "http", + "scheme": "bearer", + "bearerFormat": "JWT" + } + }, + "schemas": { + "LoginRequest": { + "title": "LoginRequest", + "type": "object", + "description": "This is the signature for login request.", + "properties": { + "client_id": { + "type": "string", + "description": "This property is supposed to be a string and is a required field" + }, + "client_secret": { + "type": "string", + "description": "This property is supposed to be a string and is a required field" + }, + "username": { + "type": "string", + "description": "This property is supposed to be a string and is a required field" + }, + "password": { + "type": "string", + "description": "This property is supposed to be a string and is a required field" + } + }, + "required": [ + "client_id", + "username", + "password" + ], + "additionalProperties": false + }, + "TokenResponse": { + "title": "TokenResponse", + "type": "object", + "description": "This is signature for successful token response.", + "properties": { + "accessToken": { + "type": "string", + "description": "This property is supposed to be a string and is a required field" + }, + "refreshToken": { + "type": "string", + "description": "This property is supposed to be a string and is a required field" + }, + "expires": { + "type": "number" + }, + "pubnubToken": { + "type": "string" + } + }, + "required": [ + "accessToken", + "refreshToken", + "expires" + ], + "additionalProperties": false + }, + "AuthTokenRequest": { + "title": "AuthTokenRequest", + "type": "object", + "description": "This is the signature for requesting the accessToken and refreshToken.", + "properties": { + "code": { + "type": "string" + }, + "clientId": { + "type": "string" + } + }, + "required": [ + "code", + "clientId" + ], + "additionalProperties": false + }, + "AuthRefreshTokenRequest": { + "title": "AuthRefreshTokenRequest", + "type": "object", + "properties": { + "refreshToken": { + "type": "string" + }, + "tenantId": { + "type": "string" + } + }, + "required": [ + "refreshToken" + ], + "additionalProperties": false + }, + "ResetPasswordPartial": { + "title": "ResetPasswordPartial", + "type": "object", + "description": "This is a signature for reset password. (tsType: Partial, schemaOptions: { partial: true })", + "properties": { + "refreshToken": { + "type": "string" + }, + "username": { + "type": "string", + "description": "This property is supposed to be a string and is a required field" + }, + "password": { + "type": "string", + "description": "This property is supposed to be a string and is a required field" + }, + "oldPassword": { + "type": "string", + "description": "This property is supposed to be a string and is a required field" + } + }, + "additionalProperties": false + }, + "ResetPassword": { + "title": "ResetPassword", + "type": "object", + "description": "This is a signature for reset password.", + "properties": { + "refreshToken": { + "type": "string" + }, + "username": { + "type": "string", + "description": "This property is supposed to be a string and is a required field" + }, + "password": { + "type": "string", + "description": "This property is supposed to be a string and is a required field" + }, + "oldPassword": { + "type": "string", + "description": "This property is supposed to be a string and is a required field" + } + }, + "required": [ + "refreshToken", + "username", + "password" + ], + "additionalProperties": false + }, + "ClientAuthRequest": { + "title": "ClientAuthRequest", + "type": "object", + "description": "This is signature for client authentication request.", + "properties": { + "client_id": { + "type": "string", + "description": "This property is supposed to be a string and is a required field" + }, + "client_secret": { + "type": "string", + "description": "This property is supposed to be a string and is a required field" + } + }, + "required": [ + "client_id", + "client_secret" + ], + "additionalProperties": false + }, + "SuccessResponse": { + "title": "SuccessResponse", + "type": "object", + "properties": { + "success": { + "type": "boolean" + } + }, + "additionalProperties": true + }, + "RefreshTokenRequestPartial": { + "title": "RefreshTokenRequestPartial", + "type": "object", + "description": "(tsType: Partial, schemaOptions: { partial: true })", + "properties": { + "refreshToken": { + "type": "string" + } + }, + "additionalProperties": false, + "x-typescript-type": "Partial" + }, + "RefreshTokenRequest": { + "title": "RefreshTokenRequest", + "type": "object", + "properties": { + "refreshToken": { + "type": "string" + } + }, + "required": [ + "refreshToken" + ], + "additionalProperties": false + }, + "OtpSendRequest": { + "title": "OtpSendRequest", + "type": "object", + "description": "This is the signature for OTP login request.", + "properties": { + "client_id": { + "type": "string", + "description": "This property is supposed to be a string and is a required field" + }, + "client_secret": { + "type": "string", + "description": "This property is supposed to be a string and is a required field" + }, + "key": { + "type": "string", + "description": "This property is supposed to be a string and is a required field" + } + }, + "required": [ + "client_id", + "client_secret", + "key" + ], + "additionalProperties": false + }, + "OtpLoginRequest": { + "title": "OtpLoginRequest", + "type": "object", + "description": "This is the signature for OTP login request.", + "properties": { + "key": { + "type": "string", + "description": "This property is supposed to be a string and is a required field" + }, + "otp": { + "type": "string", + "description": "This property is supposed to be a string and is a required field" + }, + "clientId": { + "type": "string" + } + }, + "required": [ + "key", + "otp" + ], + "additionalProperties": false + }, + "AuthUser": { + "title": "AuthUser", + "type": "object", + "description": "This is the signature for authenticated user which holds permissions and role.", + "properties": { + "deleted": { + "type": "boolean" + }, + "deletedOn": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "deletedBy": { + "type": "string", + "nullable": true + }, + "createdOn": { + "type": "string", + "format": "date-time" + }, + "modifiedOn": { + "type": "string", + "format": "date-time" + }, + "createdBy": { + "type": "string" + }, + "modifiedBy": { + "type": "string" + }, + "id": { + "type": "string" + }, + "firstName": { + "type": "string" + }, + "lastName": { + "type": "string" + }, + "middleName": { + "type": "string" + }, + "username": { + "type": "string" + }, + "email": { + "type": "string" + }, + "phone": { + "type": "string", + "pattern": "^\\+?[1-9]\\d{1,14}$" + }, + "authClientIds": { + "type": "string" + }, + "lastLogin": { + "type": "string", + "format": "date-time" + }, + "photoUrl": { + "type": "string" + }, + "designation": { + "type": "string" + }, + "dob": { + "type": "string", + "format": "date-time" + }, + "gender": { + "type": "string", + "description": "This field takes a single character as input in database.\n 'M' for male and 'F' for female.", + "enum": [ + "M", + "F", + "O" + ] + }, + "defaultTenantId": { + "type": "string" + }, + "permissions": { + "type": "array", + "items": { + "type": "string" + } + }, + "role": { + "type": "string" + }, + "externalAuthToken": { + "type": "string" + }, + "deviceInfo": { + "type": "object", + "description": "This property consists of two optional fields.\n 1. userAgent\n 2. deviceId " + }, + "age": { + "type": "number" + }, + "externalRefreshToken": { + "type": "string" + }, + "authClientId": { + "type": "number" + }, + "userPreferences": { + "type": "object" + }, + "tenantId": { + "type": "string" + }, + "userTenantId": { + "type": "string" + }, + "passwordExpiryTime": { + "type": "string", + "format": "date-time" + }, + "status": { + "type": "number", + "enum": [ + 1, + 2, + 3, + 0, + 4 + ] + } + }, + "required": [ + "firstName", + "username", + "role" + ], + "additionalProperties": false + }, + "Function": {}, + "ForgetPasswordDto": { + "title": "ForgetPasswordDto", + "type": "object", + "properties": { + "username": { + "type": "string" + }, + "client_id": { + "type": "string" + }, + "client_secret": { + "type": "string" + } + }, + "required": [ + "username", + "client_id", + "client_secret" + ], + "additionalProperties": false + }, + "AuthClient": { + "title": "AuthClient", + "type": "object", + "properties": { + "deleted": { + "type": "boolean" + }, + "deletedOn": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "deletedBy": { + "type": "string", + "nullable": true + }, + "createdOn": { + "type": "string", + "format": "date-time" + }, + "modifiedOn": { + "type": "string", + "format": "date-time" + }, + "createdBy": { + "type": "string" + }, + "modifiedBy": { + "type": "string" + }, + "id": { + "type": "number" + }, + "clientId": { + "type": "string" + }, + "clientSecret": { + "type": "string" + }, + "secret": { + "type": "string", + "description": "Value can be a string or a private key." + }, + "redirectUrl": { + "type": "string" + }, + "accessTokenExpiration": { + "type": "number" + }, + "refreshTokenExpiration": { + "type": "number" + }, + "authCodeExpiration": { + "type": "number" + } + }, + "required": [ + "clientId", + "clientSecret", + "secret", + "accessTokenExpiration", + "refreshTokenExpiration", + "authCodeExpiration" + ], + "additionalProperties": false + }, + "ResetPasswordWithClient": { + "title": "ResetPasswordWithClient", + "type": "object", + "properties": { + "token": { + "type": "string" + }, + "password": { + "type": "string" + }, + "client_id": { + "type": "string" + }, + "client_secret": { + "type": "string" + } + }, + "required": [ + "token", + "password", + "client_id", + "client_secret" + ], + "additionalProperties": false + }, + "SignupRequestDto": { + "title": "SignupRequestDto", + "type": "object", + "properties": { + "email": { + "type": "string" + }, + "data": { + "type": "object" + } + }, + "required": [ + "email" + ], + "additionalProperties": false + }, + "LocalUserProfileDto": { + "title": "LocalUserProfileDto", + "type": "object", + "properties": { + "email": { + "type": "string" + }, + "password": { + "type": "string" + } + }, + "required": [ + "email", + "password" + ], + "additionalProperties": true + }, + "SignupRequest": { + "title": "SignupRequest", + "type": "object", + "properties": { + "email": { + "type": "string" + }, + "expiry": { + "type": "string" + } + }, + "required": [ + "email" + ], + "additionalProperties": false + }, + "LoginActivityWithRelations": { + "title": "LoginActivityWithRelations", + "type": "object", + "description": "This is to maintain the daily login activity. (tsType: LoginActivityWithRelations, schemaOptions: { includeRelations: true })", + "properties": { + "id": { + "type": "string" + }, + "actor": { + "type": "string" + }, + "tenantId": { + "type": "string" + }, + "loginTime": { + "type": "string", + "format": "date-time" + }, + "tokenPayload": { + "type": "string" + }, + "loginType": { + "type": "string" + }, + "deviceInfo": { + "type": "string" + }, + "ipAddress": { + "type": "string" + } + }, + "additionalProperties": false + }, + "Date": {}, + "ActiveUsersFilter": { + "title": "ActiveUsersFilter", + "type": "object", + "properties": { + "inclusion": { + "type": "boolean" + }, + "userIdentity": { + "type": "string" + }, + "userIdentifier": { + "type": "object" + } + }, + "required": [ + "inclusion", + "userIdentity", + "userIdentifier" + ], + "additionalProperties": false + }, + "AuthRefreshTokenRequestPartial": { + "title": "AuthRefreshTokenRequestPartial", + "type": "object", + "description": "(tsType: Partial, schemaOptions: { partial: true })", + "properties": { + "refreshToken": { + "type": "string" + }, + "tenantId": { + "type": "string" + } + }, + "additionalProperties": false, + "x-typescript-type": "Partial" + }, + "loopback.Count": { + "type": "object", + "title": "loopback.Count", + "x-typescript-type": "@loopback/repository#Count", + "properties": { + "count": { + "type": "number" + } + } + }, + "login_activity.Filter": { + "type": "object", + "title": "login_activity.Filter", + "properties": { + "offset": { + "type": "integer", + "minimum": 0 + }, + "limit": { + "type": "integer", + "minimum": 1, + "example": 100 + }, + "skip": { + "type": "integer", + "minimum": 0 + }, + "order": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "type": "string" + } + } + ] + }, + "where": { + "title": "login_activity.WhereFilter", + "type": "object", + "additionalProperties": true + }, + "fields": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { + "type": "boolean" + }, + "actor": { + "type": "boolean" + }, + "tenantId": { + "type": "boolean" + }, + "loginTime": { + "type": "boolean" + }, + "tokenPayload": { + "type": "boolean" + }, + "loginType": { + "type": "boolean" + }, + "deviceInfo": { + "type": "boolean" + }, + "ipAddress": { + "type": "boolean" + } + }, + "additionalProperties": false + }, + { + "type": "array", + "items": { + "type": "string", + "enum": [ + "id", + "actor", + "tenantId", + "loginTime", + "tokenPayload", + "loginType", + "deviceInfo", + "ipAddress" + ], + "example": "id" + }, + "uniqueItems": true + } + ], + "title": "login_activity.Fields" + } + }, + "additionalProperties": false, + "x-typescript-type": "@loopback/repository#Filter" + }, + "PingResponse": { + "type": "object", + "title": "PingResponse", + "properties": { + "greeting": { + "type": "string" + }, + "date": { + "type": "string" + }, + "url": { + "type": "string" + }, + "headers": { + "type": "object", + "properties": { + "Content-Type": { + "type": "string" + } + }, + "additionalProperties": true + } + } + } + } + }, + "servers": [ + { + "url": "/" + } + ] +} \ No newline at end of file diff --git a/sandbox/auth-basic-login-signup-example/src/opentelemetry-registry.ts b/sandbox/auth-basic-login-signup-example/src/opentelemetry-registry.ts new file mode 100755 index 0000000000..6376fe3373 --- /dev/null +++ b/sandbox/auth-basic-login-signup-example/src/opentelemetry-registry.ts @@ -0,0 +1,35 @@ +import {JaegerExporter} from '@opentelemetry/exporter-jaeger'; +import {NodeTracerProvider} from '@opentelemetry/sdk-trace-node'; +import { + BatchSpanProcessor, + ConsoleSpanExporter, +} from '@opentelemetry/sdk-trace-base'; +import * as dotenv from 'dotenv'; +import * as dotenvExt from 'dotenv-extended'; + +dotenv.config(); +dotenvExt.load({ + schema: '.env.example', + errorOnMissing: true, + includeProcessEnv: true, +}); + +if (!!+(process.env.ENABLE_TRACING ?? 0)) { + const provider = new NodeTracerProvider(); + const option = { + serviceName: process.env.SERVICE_NAME ?? '', + tags: [], + // You can use the default UDPSender + host: process.env.OPENTELEMETRY_HOST ?? '', + port: process.env.OPENTELEMETRY_PORT + ? +process.env.OPENTELEMETRY_PORT + : 0, + }; + // Configure span processor to send spans to the exporter + const exporter = new JaegerExporter(option); + provider.addSpanProcessor(new BatchSpanProcessor(exporter)); + provider.addSpanProcessor( + new BatchSpanProcessor(new ConsoleSpanExporter()), + ); + provider.register(); +} \ No newline at end of file diff --git a/sandbox/auth-basic-login-signup-example/src/providers/index.ts b/sandbox/auth-basic-login-signup-example/src/providers/index.ts new file mode 100755 index 0000000000..4d8a58859a --- /dev/null +++ b/sandbox/auth-basic-login-signup-example/src/providers/index.ts @@ -0,0 +1,2 @@ +export * from './local-signup.provider'; +export * from './signup-token-handler.provider'; \ No newline at end of file diff --git a/sandbox/auth-ms-basic-example/src/providers/local-signup.provider.ts b/sandbox/auth-basic-login-signup-example/src/providers/local-signup.provider.ts old mode 100644 new mode 100755 similarity index 99% rename from sandbox/auth-ms-basic-example/src/providers/local-signup.provider.ts rename to sandbox/auth-basic-login-signup-example/src/providers/local-signup.provider.ts index 1026a2f2d5..9982546b39 --- a/sandbox/auth-ms-basic-example/src/providers/local-signup.provider.ts +++ b/sandbox/auth-basic-login-signup-example/src/providers/local-signup.provider.ts @@ -16,6 +16,8 @@ export class LocalSignupProvider ) {} value(): UserSignupFn { + + return async (model, token) => this.userOps.createUser(model, {}); } } diff --git a/sandbox/auth-basic-login-signup-example/src/providers/signup-token-handler.provider.ts b/sandbox/auth-basic-login-signup-example/src/providers/signup-token-handler.provider.ts new file mode 100755 index 0000000000..998421fe8c --- /dev/null +++ b/sandbox/auth-basic-login-signup-example/src/providers/signup-token-handler.provider.ts @@ -0,0 +1,21 @@ +// Copyright (c) 2023 Sourcefuse Technologies +// +// This software is released under the MIT License. +// https://opensource.org/licenses/MIT +import {Provider, service} from '@loopback/core'; +import {HttpErrors} from '@loopback/rest'; +import { SignupTokenHandlerFn } from '@sourceloop/authentication-service'; +import { UserOpsService } from '../services'; + +export class SignupTokenHandlerProvider + implements Provider +{ + + constructor( + @service(UserOpsService) + private readonly userOps: UserOpsService, + ) {} + value(): SignupTokenHandlerFn { + return async (dto)=>this.userOps.createUserToken(dto); + } +} diff --git a/sandbox/auth-ms-basic-example/src/services/index.ts b/sandbox/auth-basic-login-signup-example/src/services/index.ts old mode 100644 new mode 100755 similarity index 100% rename from sandbox/auth-ms-basic-example/src/services/index.ts rename to sandbox/auth-basic-login-signup-example/src/services/index.ts diff --git a/sandbox/auth-ms-basic-example/src/services/user-ops.service.ts b/sandbox/auth-basic-login-signup-example/src/services/user-ops.service.ts old mode 100644 new mode 100755 similarity index 78% rename from sandbox/auth-ms-basic-example/src/services/user-ops.service.ts rename to sandbox/auth-basic-login-signup-example/src/services/user-ops.service.ts index 6724047870..eae8a9aaf3 --- a/sandbox/auth-ms-basic-example/src/services/user-ops.service.ts +++ b/sandbox/auth-basic-login-signup-example/src/services/user-ops.service.ts @@ -3,11 +3,14 @@ // This software is released under the MIT License. // https://opensource.org/licenses/MIT import {BindingScope, injectable} from '@loopback/core'; -import {AnyObject, repository} from '@loopback/repository'; +import {AnyObject, DataObject, repository} from '@loopback/repository'; import {HttpErrors} from '@loopback/rest'; import { AuthClientRepository, + LocalUserProfileDto, + Role, RoleRepository, + SignupRequestResponseDto, User, UserCredentials, UserRepository, @@ -33,12 +36,25 @@ export class UserOpsService { private readonly authClientsRepository: AuthClientRepository, ) {} - async createUser(user: UserDto, options: AnyObject) { - this.validateUserCreation(user, options); + createUserToken(dto:DataObject){ + console.log(dto); + } + + async createUser(user: LocalUserProfileDto, options: AnyObject) { + const tenantId="91afb1b3-15ef-66f9-b5c3-d9c4daaa0b34"; // tenant with this id needs to be present in db + + let userDto:UserDto=new UserDto({ + ...user, + tenantId:tenantId, + username:user.email, + firstName:'test', + lastName:'NA' + }) + this.validateUserCreation(userDto, options); const authClient = await this.authClientsRepository.findOne({ where: { - clientId: user.clientId, + clientId: userDto.clientId, }, }); @@ -48,24 +64,31 @@ export class UserOpsService { const userExists = await this.userRepository.findOne({ where: { - or: [{username: user.username}, {email: user.email}], + or: [{username: userDto.username}, {email: user.email}], }, fields: { id: true, }, }); + const role:Role=await this.roleRepository.create(new Role({ + name:'USER', + tenantId:userDto.tenantId, + roleType:1 + })) + userDto.roleId=role.id??''; + if (userExists) { const userTenantExists = await this.utRepository.findOne({ where: { userId: userExists.id, - tenantId: user.tenantId, + tenantId: userDto.tenantId, }, }); if (userTenantExists) { throw new HttpErrors.BadRequest('User already exists'); } else { const userTenant: UserTenant = await this.createUserTenantData( - user, + userDto, UserStatus.ACTIVE, userExists?.id, options, @@ -79,24 +102,24 @@ export class UserOpsService { } } - const username = user.username; - user.username = username.toLowerCase(); + const username = user.email; + userDto.username = username.toLowerCase(); //Override default tenant id const userSaved = await this.userRepository.createWithoutPassword( new User({ - username: user.username, - firstName: user.firstName, - lastName: user.lastName, - email: user.email, - phone: user.phone, - defaultTenantId: user.tenantId, + username: userDto.username??'NA', + firstName: userDto.firstName??'NA', + lastName: userDto.lastName??'NA', + email: userDto.email??'NA', + phone: userDto.phone??'NA', + defaultTenantId: userDto.tenantId??'NA', authClientIds: `{${authClient?.id}}`, }), options, ); const userTenantData = await this.createUserTenantData( - user, + userDto, UserStatus.ACTIVE, userSaved?.id, options, @@ -179,4 +202,6 @@ export class UserOpsService { await this.userRepository.credentials(user.id).create(creds); return true; } + + } diff --git a/sandbox/auth-ms-basic-example/tsconfig.json b/sandbox/auth-basic-login-signup-example/tsconfig.json old mode 100644 new mode 100755 similarity index 56% rename from sandbox/auth-ms-basic-example/tsconfig.json rename to sandbox/auth-basic-login-signup-example/tsconfig.json index 3309600f03..c7b8e49eac --- a/sandbox/auth-ms-basic-example/tsconfig.json +++ b/sandbox/auth-basic-login-signup-example/tsconfig.json @@ -1,14 +1,9 @@ { "$schema": "http://json.schemastore.org/tsconfig", "extends": "@loopback/build/config/tsconfig.common.json", - "experimentalDecorators": true, "compilerOptions": { "outDir": "dist", - "rootDir": "src", - "composite": true + "rootDir": "src" }, - "include": [ - "src" - ], - "references": [] + "include": ["src"] } diff --git a/sandbox/auth-ms-basic-example/.env.defaults b/sandbox/auth-ms-basic-example/.env.defaults deleted file mode 100644 index 45b8b86598..0000000000 --- a/sandbox/auth-ms-basic-example/.env.defaults +++ /dev/null @@ -1,12 +0,0 @@ -REDIS_HOST= -REDIS_PORT= -REDIS_PASSWORD= -REDIS_DB= -DB_HOST= -DB_PORT= -DB_USER= -DB_PASSWORD= -DB_DATABASE= -DB_SCHEMA= -JWT_SECRET= -JWT_ISSUER= diff --git a/sandbox/auth-ms-basic-example/.env.example b/sandbox/auth-ms-basic-example/.env.example deleted file mode 100644 index 376f9a7e59..0000000000 --- a/sandbox/auth-ms-basic-example/.env.example +++ /dev/null @@ -1,11 +0,0 @@ -DB_HOST= -DB_PORT= -DB_USER= -DB_PASSWORD= -DB_DATABASE= -REDIS_HOST= -REDIS_PORT= -REDIS_PASSWORD= -REDIS_DB= -JWT_SECRET= -JWT_ISSUER= diff --git a/sandbox/auth-ms-basic-example/.mocharc.json b/sandbox/auth-ms-basic-example/.mocharc.json deleted file mode 100644 index 7b523c3163..0000000000 --- a/sandbox/auth-ms-basic-example/.mocharc.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "exit": true, - "recursive": true, - "require": "source-map-support/register" -} diff --git a/sandbox/auth-ms-basic-example/.prettierignore b/sandbox/auth-ms-basic-example/.prettierignore deleted file mode 100644 index c6911da9e1..0000000000 --- a/sandbox/auth-ms-basic-example/.prettierignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -*.json diff --git a/sandbox/auth-ms-basic-example/.yo-rc.json b/sandbox/auth-ms-basic-example/.yo-rc.json deleted file mode 100644 index 74a31dc8cc..0000000000 --- a/sandbox/auth-ms-basic-example/.yo-rc.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "@loopback/cli": { - "packageManager": "npm", - "version": "2.18.0" - } -} diff --git a/sandbox/auth-ms-basic-example/CHANGELOG.md b/sandbox/auth-ms-basic-example/CHANGELOG.md deleted file mode 100644 index 89f6de39b5..0000000000 --- a/sandbox/auth-ms-basic-example/CHANGELOG.md +++ /dev/null @@ -1,809 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. -See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. - -## 0.14.7 (2025-01-07) - -* chore(deps): version update (#2227) ([6d6b00e](https://github.com/sourcefuse/loopback4-microservice-catalog/commit/6d6b00e)), closes [#2227](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/2227) - - - - - -## 0.14.6 (2024-12-20) - -**Note:** Version bump only for package @sourceloop/auth-ms-basic-example - - - - - -## 0.14.5 (2024-12-05) - -**Note:** Version bump only for package @sourceloop/auth-ms-basic-example - - - - - -## 0.14.4 (2024-11-22) - -**Note:** Version bump only for package @sourceloop/auth-ms-basic-example - - - - - -## 0.14.3 (2024-10-22) - -**Note:** Version bump only for package @sourceloop/auth-ms-basic-example - - - - - -## 0.14.2 (2024-10-16) - -**Note:** Version bump only for package @sourceloop/auth-ms-basic-example - - - - - -## 0.14.1 (2024-09-30) - -**Note:** Version bump only for package @sourceloop/auth-ms-basic-example - - - - - -## 0.14.0 (2024-09-30) - -* feat(authentication-service): add the implementation of auth0 strategy (#2164) ([ba0752d](https://github.com/sourcefuse/loopback4-microservice-catalog/commit/ba0752d)), closes [#2164](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/2164) [#2163](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/2163) [#2163](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/2163) - - - - - -## 0.13.1 (2024-09-26) - -**Note:** Version bump only for package @sourceloop/auth-ms-basic-example - - - - - -## 0.13.0 (2024-08-05) - -* chore(sandbox): fix the docker compose for sandbox (#2132) ([13a4945](https://github.com/sourcefuse/loopback4-microservice-catalog/commit/13a4945)), closes [#2132](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/2132) [#1962](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/1962) [#1962](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/1962) [#1962](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/1962) [#1962](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/1962) [#1962](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/1962) - - - - - -## 0.12.3 (2024-06-11) - -* chore: publish release ([89d1599](https://github.com/sourcefuse/loopback4-microservice-catalog/commit/89d1599)) -* chore(deps): version update in sandbox (#2109) ([615d7f5](https://github.com/sourcefuse/loopback4-microservice-catalog/commit/615d7f5)), closes [#2109](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/2109) [#2104](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/2104) [#2104](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/2104) -* chore(deps): version bump commit (#2111) ([c87bc75](https://github.com/sourcefuse/loopback4-microservice-catalog/commit/c87bc75)), closes [#2111](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/2111) [#00](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/00) -* fix(all-services): revert to pr 2072 (#2106) ([502812f](https://github.com/sourcefuse/loopback4-microservice-catalog/commit/502812f)), closes [#2106](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/2106) [#0](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/0) [#0](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/0) - - - - - -## 0.12.2 (2024-06-10) - -* fix(all-services): revert to pr 2072 (#2106) ([502812f](https://github.com/sourcefuse/loopback4-microservice-catalog/commit/502812f)), closes [#2106](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/2106) [#0](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/0) [#0](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/0) - - - - - -## 0.12.1 (2024-06-04) - -**Note:** Version bump only for package @sourceloop/auth-ms-basic-example - - - - - -## 0.12.0 (2024-05-20) - -* feat(all-services): Follow solid for repositories in all services (#2072) ([82c934b](https://github.com/sourcefuse/loopback4-microservice-catalog/commit/82c934b)), closes [#2072](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/2072) [#2037](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/2037) - - - - - -## 0.11.13 (2024-05-07) - -**Note:** Version bump only for package @sourceloop/auth-ms-basic-example - - - - - -## 0.11.12 (2024-04-05) - -**Note:** Version bump only for package @sourceloop/auth-ms-basic-example - - - - - -## 0.11.11 (2024-04-02) - -**Note:** Version bump only for package @sourceloop/auth-ms-basic-example - - - - - -## 0.11.10 (2024-03-26) - -**Note:** Version bump only for package @sourceloop/auth-ms-basic-example - - - - - -## 0.11.9 (2024-03-20) - -**Note:** Version bump only for package @sourceloop/auth-ms-basic-example - - - - - -## 0.11.8 (2024-03-12) - -**Note:** Version bump only for package @sourceloop/auth-ms-basic-example - - - - - -## 0.11.7 (2024-03-06) - -* fix(all-services): fix sonar issues in all services (#2018) ([33dfa77](https://github.com/sourcefuse/loopback4-microservice-catalog/commit/33dfa77)), closes [#2018](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/2018) [#2013](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/2013) -* chore(deps): update versions in sandbox and fix vulnerabilities (#1941) ([5e37add](https://github.com/sourcefuse/loopback4-microservice-catalog/commit/5e37add)), closes [#1941](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/1941) [#1934](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/1934) - - - - - -## 0.11.6 (2024-02-02) - -**Note:** Version bump only for package @sourceloop/auth-ms-basic-example - - - - - -## 0.11.5 (2024-01-19) - -**Note:** Version bump only for package @sourceloop/auth-ms-basic-example - - - - - -## 0.11.4 (2024-01-09) - -**Note:** Version bump only for package @sourceloop/auth-ms-basic-example - - - - - -## 0.11.3 (2024-01-01) - -**Note:** Version bump only for package @sourceloop/auth-ms-basic-example - - - - - -## 0.11.2 (2023-12-22) - -**Note:** Version bump only for package @sourceloop/auth-ms-basic-example - - - - - -## 0.11.1 (2023-12-07) - -**Note:** Version bump only for package @sourceloop/auth-ms-basic-example - - - - - -## 0.11.0 (2023-12-07) - -* feat(chore): migrate to use npm workspaces (#1684) ([72d8f6e](https://github.com/sourcefuse/loopback4-microservice-catalog/commit/72d8f6e)), closes [#1684](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/1684) [#1673](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/1673) [#1673](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/1673) [#1673](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/1673) [#1673](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/1673) [#1673](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/1673) [#1673](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/1673) [#1673](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/1673) [#1673](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/1673) [#1673](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/1673) - - -### BREAKING CHANGE - -* lerna bootstrap command will not be supported -* lerna bootstrap command will not be supported -* lerna bootstrap command will not be supported -* lerna bootstrap will not be supported -* lerna bootstrap will not be supported - - - - -## 0.10.10 (2023-10-19) - -**Note:** Version bump only for package @sourceloop/auth-ms-basic-example - - - - - -## 0.10.9 (2023-10-05) - -* refactor(all-services): remove redundant `posttest` script (#1677) ([4b252cf](https://github.com/sourcefuse/loopback4-microservice-catalog/commit/4b252cf)), closes [#1677](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/1677) [#1657](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/1657) - - - - - -## 0.10.8 (2023-09-01) - -**Note:** Version bump only for package @sourceloop/auth-ms-basic-example - - - - - -## 0.10.7 (2023-08-10) - -**Note:** Version bump only for package @sourceloop/auth-ms-basic-example - - - - - -## 0.10.6 (2023-08-09) - -**Note:** Version bump only for package @sourceloop/auth-ms-basic-example - - - - - -## 0.10.5 (2023-07-28) - -* refactor(sandbox): remove useless constructors (#1578) ([703b612](https://github.com/sourcefuse/loopback4-microservice-catalog/commit/703b612)), closes [#1578](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/1578) -* fix(deps): multiple vulnerabilities fix in sandbox examples (#1571) ([1bd6226](https://github.com/sourcefuse/loopback4-microservice-catalog/commit/1bd6226)), closes [#1571](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/1571) - - - - - -## 0.10.4 (2023-07-18) - -**Note:** Version bump only for package @sourceloop/auth-ms-basic-example - - - - - -## 0.10.3 (2023-07-11) - -* chore(deps): package lock upgrade (#1519) ([5aaddbf](https://github.com/sourcefuse/loopback4-microservice-catalog/commit/5aaddbf)), closes [#1519](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/1519) - - - - - -## 0.10.2 (2023-06-19) - -**Note:** Version bump only for package @sourceloop/auth-ms-basic-example - - - - - -## 0.10.1 (2023-06-10) - -**Note:** Version bump only for package @sourceloop/auth-ms-basic-example - - - - - -## 0.10.0 (2023-06-08) - -* feat(authentication-service): maintain the entries for active users when a user login to the app (#1 ([0b6fa82](https://github.com/sourcefuse/loopback4-microservice-catalog/commit/0b6fa82)), closes [#1425](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/1425) [#1424](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/1424) - - - - - -## 0.9.12 (2023-06-08) - -**Note:** Version bump only for package @sourceloop/auth-ms-basic-example - - - - - -## 0.9.11 (2023-06-07) - -**Note:** Version bump only for package @sourceloop/auth-ms-basic-example - - - - - -## 0.9.10 (2023-05-11) - -**Note:** Version bump only for package @sourceloop/auth-ms-basic-example - - - - - -## 0.9.9 (2023-05-03) - -* chore(all-services): update license and copyright headers (#1405) ([7493640](https://github.com/sourcefuse/loopback4-microservice-catalog/commit/7493640)), closes [#1405](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/1405) - - - - - -## 0.9.8 (2023-04-27) - -**Note:** Version bump only for package @sourceloop/auth-ms-basic-example - - - - - -## 0.9.7 (2023-04-10) - -**Note:** Version bump only for package @sourceloop/auth-ms-basic-example - - - - - -## 0.9.6 (2023-03-15) - -**Note:** Version bump only for package @sourceloop/auth-ms-basic-example - - - - - -## 0.9.5 (2023-03-06) - -* refactor(chore): resolve sonar code smells (#1264) ([70d3fc5](https://github.com/sourcefuse/loopback4-microservice-catalog/commit/70d3fc5)), closes [#1264](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/1264) [#1200](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/1200) - - - - - -## 0.9.4 (2023-02-01) - -**Note:** Version bump only for package @sourceloop/auth-ms-basic-example - - - - - -## 0.9.3 (2023-01-31) - -**Note:** Version bump only for package @sourceloop/auth-ms-basic-example - - - - - -## 0.9.2 (2023-01-20) - -**Note:** Version bump only for package @sourceloop/auth-ms-basic-example - - - - - -## 0.9.1 (2023-01-17) - -**Note:** Version bump only for package @sourceloop/auth-ms-basic-example - - - - - -## 0.9.0 (2023-01-12) - -* refactor(chore): changes in the docker-compose (#1123) ([5704835](https://github.com/sourcefuse/loopback4-microservice-catalog/commit/5704835)), closes [#1123](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/1123) [#00](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/00) [#00](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/00) [#00](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/00) - - - - - -## 0.8.1 (2022-12-07) - -**Note:** Version bump only for package @sourceloop/auth-ms-basic-example - - - - - -## 0.8.0 (2022-11-25) - -* feat(authentication-service): feat(authentication-service): change parent class AuthClient (#1081) ([537cc75](https://github.com/sourcefuse/loopback4-microservice-catalog/commit/537cc75)), closes [#1081](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/1081) -* fix(sandbox): add missing migrations to auth-examples (#1079) ([bf9f641](https://github.com/sourcefuse/loopback4-microservice-catalog/commit/bf9f641)), closes [#1079](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/1079) - - - - - -## 0.7.5 (2022-10-17) - -**Note:** Version bump only for package @sourceloop/auth-ms-basic-example - - - - - -## 0.7.4 (2022-10-10) - -**Note:** Version bump only for package @sourceloop/auth-ms-basic-example - - - - - -## 0.7.3 (2022-09-26) - -**Note:** Version bump only for package @sourceloop/auth-ms-basic-example - - - - - -## 0.7.2 (2022-09-21) - -**Note:** Version bump only for package @sourceloop/auth-ms-basic-example - - - - - -## 0.7.1 (2022-09-21) - -**Note:** Version bump only for package @sourceloop/auth-ms-basic-example - - - - - -## 0.7.0 (2022-09-20) - -* feat(sandbox): Add an example for azure Ad auth in sandbox (#977) ([c67cf7d](https://github.com/sourcefuse/loopback4-microservice-catalog/commit/c67cf7d)), closes [#977](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/977) [#976](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/976) [#976](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/976) - - - - - -## 0.6.6 (2022-09-12) - -**Note:** Version bump only for package @sourceloop/auth-ms-basic-example - - - - - -## 0.6.5 (2022-09-12) - -**Note:** Version bump only for package @sourceloop/auth-ms-basic-example - - - - - -## 0.6.4 (2022-09-02) - -* chore(deps): fixing typescript version for cli (#1005) ([9e561f2](https://github.com/sourcefuse/loopback4-microservice-catalog/commit/9e561f2)), closes [#1005](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/1005) [#00](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/00) - - - - - -## 0.6.3 (2022-09-02) - -**Note:** Version bump only for package @sourceloop/auth-ms-basic-example - - - - - -## 0.6.2 (2022-08-30) - -* chore(deps): ignore angular libraries for release (#998) ([f2a8e8c](https://github.com/sourcefuse/loopback4-microservice-catalog/commit/f2a8e8c)), closes [#998](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/998) [#00](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/00) - - - - - -## 0.6.1 (2022-08-26) - -* build(packages): versions update in packages (#979) ([149edf7](https://github.com/sourcefuse/loopback4-microservice-catalog/commit/149edf7)), closes [#979](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/979) [#0](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/0) -* build(sandbox): update versions in all examples (#996) ([ebafab0](https://github.com/sourcefuse/loopback4-microservice-catalog/commit/ebafab0)), closes [#996](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/996) - - - - - -## 0.6.0 (2022-08-20) - -* feat(sandbox): Example of sending push notification via socketio (#935) ([e08cb71](https://github.com/sourcefuse/loopback4-microservice-catalog/commit/e08cb71)), closes [#935](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/935) [#934](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/934) [#934](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/934) [#9934](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/9934) [#934](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/934) - - - - - -## 0.5.7 (2022-08-04) - -**Note:** Version bump only for package @sourceloop/auth-ms-basic-example - - - - - -## 0.5.6 (2022-08-04) - -* build(sandbox): upgrade sandbox examples versions (#929) ([2b56e9e](https://github.com/sourcefuse/loopback4-microservice-catalog/commit/2b56e9e)), closes [#929](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/929) - - - - - -## 0.5.5 (2022-07-27) - -* chore(core): update license, add copywrite to all ts files (#794) ([8753452](https://github.com/sourcefuse/loopback4-microservice-catalog/commit/8753452)), closes [#794](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/794) [#754](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/754) - - - - - -## 0.5.4 (2022-07-11) - -**Note:** Version bump only for package @sourceloop/auth-ms-basic-example - - - - - -## 0.5.3 (2022-07-06) - -* chore: publish release ([3523386](https://github.com/sourcefuse/loopback4-microservice-catalog/commit/3523386)) - - - - - -## 0.5.2 (2022-07-06) - -**Note:** Version bump only for package @sourceloop/auth-ms-basic-example - - - - - -## 0.5.1 (2022-06-30) - -**Note:** Version bump only for package @sourceloop/auth-ms-basic-example - - - - - -## 0.5.0 (2022-06-24) - -* chore(deps): update deps in sandbox-examples (#832) ([5f38bac](https://github.com/sourcefuse/loopback4-microservice-catalog/commit/5f38bac)), closes [#832](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/832) [#831](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/831) - - - - - -## 0.4.14 (2022-05-30) - -**Note:** Version bump only for package @sourceloop/auth-ms-basic-example - - - - - -## 0.4.13 (2022-05-27) - -**Note:** Version bump only for package @sourceloop/auth-ms-basic-example - - - - - -## 0.4.12 (2022-05-27) - -**Note:** Version bump only for package @sourceloop/auth-ms-basic-example - - - - - -## 0.4.11 (2022-05-27) - -**Note:** Version bump only for package @sourceloop/auth-ms-basic-example - - - - - -## 0.4.10 (2022-05-26) - -**Note:** Version bump only for package @sourceloop/auth-ms-basic-example - - - - - -## 0.4.9 (2022-05-17) - -**Note:** Version bump only for package @sourceloop/auth-ms-basic-example - - - - - -## 0.4.8 (2022-05-11) - -**Note:** Version bump only for package @sourceloop/auth-ms-basic-example - - - - - -## 0.4.7 (2022-05-10) - -**Note:** Version bump only for package @sourceloop/auth-ms-basic-example - - - - - -## 0.4.6 (2022-05-09) - -* chore(deps): bump moment in /sandbox/auth-ms-basic-example (#656) ([e30cde6](https://github.com/sourcefuse/loopback4-microservice-catalog/commit/e30cde6)), closes [#656](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/656) -* chore(deps): bump swagger-ui-dist in /sandbox/auth-ms-basic-example (#608) ([a578d57](https://github.com/sourcefuse/loopback4-microservice-catalog/commit/a578d57)), closes [#608](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/608) -* chore(deps): update deps for sandbox (#731) ([c4a5ee5](https://github.com/sourcefuse/loopback4-microservice-catalog/commit/c4a5ee5)), closes [#731](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/731) -* fix(core): fix versions in package locks and update references in tsconfig ([36b563e](https://github.com/sourcefuse/loopback4-microservice-catalog/commit/36b563e)), closes [#0](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/0) -* fix(docs): add badge for node and npm version ([caaa1bd](https://github.com/sourcefuse/loopback4-microservice-catalog/commit/caaa1bd)) -* fix(version): microservice-catalog sandbox examples latest version (#452) ([6866f89](https://github.com/sourcefuse/loopback4-microservice-catalog/commit/6866f89)), closes [#452](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/452) - - - - - -## 0.4.5 (2021-12-17) - -* fix(core): upgrade all deps (#438) ([c52b7f1](https://github-personal/sourcefuse/loopback4-microservice-catalog/commit/c52b7f1)), closes [#438](https://github-personal/sourcefuse/loopback4-microservice-catalog/issues/438) - - - - - -## 0.4.4 (2021-11-11) - -**Note:** Version bump only for package @sourceloop/auth-ms-basic-example - - - - - -## 0.4.3 (2021-11-09) - -**Note:** Version bump only for package @sourceloop/auth-ms-basic-example - - - - - -## 0.4.2 (2021-11-09) - -**Note:** Version bump only for package @sourceloop/auth-ms-basic-example - - - - - -## 0.4.1 (2021-10-24) - -* fix(core): fix all version problems ([7847008](https://github.com/sourcefuse/loopback4-microservice-catalog/commit/7847008)), closes [#0](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/0) - - - - - -## 0.3.0 (2021-09-12) - -* feat(sandbox): example of pubnub as a provider in notification service (#279) ([e30a0ed](https://github.com/sourcefuse/loopback4-microservice-catalog/commit/e30a0ed)), closes [#279](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/279) [#208](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/208) [#208](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/208) [#0](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/0) [#278](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/278) [#211](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/211) [#263](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/263) [#280](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/280) [#208](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/208) [#208](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/208) [#298](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/298) [#208](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/208) [#263](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/263) [#280](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/280) [#208](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/208) [#208](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/208) - - - - - -## 0.2.2 (2021-08-02) - -**Note:** Version bump only for package @sourceloop/auth-ms-basic-example - - - - - -## 0.2.1 (2021-07-24) - -* fix(core): upgrade loopback4-soft-delete ([f653e0c](https://github.com/sourcefuse/loopback4-microservice-catalog/commit/f653e0c)), closes [#0](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/0) - - - - - -## 0.2.0 (2021-07-14) - -* feat(authentication-service): apple-oauth2 (#243) ([98fdb0f](https://github.com/sourcefuse/loopback4-microservice-catalog/commit/98fdb0f)), closes [#243](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/243) -* feat(authentication-service): facebook oauth added (#247) ([3c3cae8](https://github.com/sourcefuse/loopback4-microservice-catalog/commit/3c3cae8)), closes [#247](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/247) -* perf(all services): added security property in all the controllers an… (#232) ([e37a5a1](https://github.com/sourcefuse/loopback4-microservice-catalog/commit/e37a5a1)), closes [#232](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/232) - - - - - -## 0.1.2 (2021-06-14) - -* docs: add openapi spec docs in examples and improve the docs in services (#215) ([baec0f1](https://github.com/sourcefuse/loopback4-microservice-catalog/commit/baec0f1)), closes [#215](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/215) -* fix(core): update nodejs version in docker file to latest (#227) ([b12ce80](https://github.com/sourcefuse/loopback4-microservice-catalog/commit/b12ce80)), closes [#227](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/227) - - - - - -## 0.1.1 (2021-05-19) - -**Note:** Version bump only for package @sourceloop/auth-ms-basic-example - - - - - -## 0.1.0 (2021-05-12) - -**Note:** Version bump only for package @sourceloop/auth-ms-basic-example - - - - - -## 0.1.0-alpha.1 (2021-05-12) - -* fix(authentication-service): fixed version of loopback packages in all services (#191) ([7eb9a60](https://github.com/sourcefuse/loopback4-microservice-catalog/commit/7eb9a60)), closes [#191](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/191) -* feat(sandbox): scheduler-example (#183) ([7f6df63](https://github.com/sourcefuse/loopback4-microservice-catalog/commit/7f6df63)), closes [#183](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/183) - - - - - -## 0.1.0-alpha.0 (2021-04-30) - -* fix(sandbox): fix loopback versions issue ([60db6a0](https://github.com/sourcefuse/loopback4-microservice-catalog/commit/60db6a0)), closes [#0](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/0) -* feat(sandbox): added basic example, fixed auth-multitenant-example, changed readme (#169) ([0a849fe](https://github.com/sourcefuse/loopback4-microservice-catalog/commit/0a849fe)), closes [#169](https://github.com/sourcefuse/loopback4-microservice-catalog/issues/169) diff --git a/sandbox/auth-ms-basic-example/Dockerfile b/sandbox/auth-ms-basic-example/Dockerfile deleted file mode 100644 index cc8be23e28..0000000000 --- a/sandbox/auth-ms-basic-example/Dockerfile +++ /dev/null @@ -1,28 +0,0 @@ -# Check out https://hub.docker.com/_/node to select a new base image -FROM node:18-alpine - -# Set to a non-root built-in user `node` -USER node - -# Create app directory (with user `node`) -RUN mkdir -p /home/node/app - -WORKDIR /home/node/app - -# Install app dependencies -# A wildcard is used to ensure both package.json AND package-lock.json are copied -# where available (npm@5+) -COPY --chown=node package*.json ./ - -RUN npm install - -# Bundle app source code -COPY --chown=node . . - -RUN npm run build - -# Bind to all network interfaces so that it can be mapped to the host OS -ENV HOST=0.0.0.0 PORT=3000 - -EXPOSE ${PORT} -CMD [ "node", "." ] diff --git a/sandbox/auth-ms-basic-example/README.md b/sandbox/auth-ms-basic-example/README.md deleted file mode 100644 index 915a1c1459..0000000000 --- a/sandbox/auth-ms-basic-example/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# auth-basic-example - -[![LoopBack](https://github.com/strongloop/loopback-next/raw/master/docs/site/imgs/branding/Powered-by-LoopBack-Badge-(blue)-@2x.png)](http://loopback.io/) - -#### API Details - -Visit the [OpenAPI spec docs](./openapi.md) \ No newline at end of file diff --git a/sandbox/auth-ms-basic-example/migrations/database.json b/sandbox/auth-ms-basic-example/migrations/database.json deleted file mode 100644 index 414a359e8c..0000000000 --- a/sandbox/auth-ms-basic-example/migrations/database.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "defaultEnv": "master", - "master": { - "driver": "pg", - "host": { - "ENV": "DB_HOST" - }, - "port": { - "ENV": "DB_PORT" - }, - "user": { - "ENV": "DB_USER" - }, - "password": { - "ENV": "DB_PASSWORD" - }, - "database": { - "ENV": "DB_DATABASE" - } - }, - "sql-file": true -} \ No newline at end of file diff --git a/sandbox/auth-ms-basic-example/migrations/sqls/20210421113146-seed-down.sql b/sandbox/auth-ms-basic-example/migrations/sqls/20210421113146-seed-down.sql deleted file mode 100644 index 0e68c90bbe..0000000000 --- a/sandbox/auth-ms-basic-example/migrations/sqls/20210421113146-seed-down.sql +++ /dev/null @@ -1,8 +0,0 @@ -SET search_path TO main,public; - -DELETE FROM user_credentials; -DELETE FROM user_tenants; -DELETE FROM users; -DELETE FROM tenants; -DELETE FROM roles; -DELETE FROM auth_clients; diff --git a/sandbox/auth-ms-basic-example/migrations/sqls/20210421113146-seed-up.sql b/sandbox/auth-ms-basic-example/migrations/sqls/20210421113146-seed-up.sql deleted file mode 100644 index 378ed3f55c..0000000000 --- a/sandbox/auth-ms-basic-example/migrations/sqls/20210421113146-seed-up.sql +++ /dev/null @@ -1,60 +0,0 @@ -SET search_path TO main, public; - -ALTER TABLE main.roles -ADD IF NOT EXISTS tenant_id uuid NOT NULL, -ADD IF NOT EXISTS allowed_clients text[], -ADD IF NOT EXISTS description varchar(500); - -ALTER TABLE main.tenants -ADD IF NOT EXISTS website varchar(100); - -ALTER TABLE main.users -ADD IF NOT EXISTS photo_url varchar(250), -ADD IF NOT EXISTS designation varchar(50); - -INSERT INTO main.auth_clients(id, client_id, client_secret, redirect_url, access_token_expiration, refresh_token_expiration, auth_code_expiration, secret) - VALUES ('1', 'test_client_id', 'test_client_secret', '', '900', '3600', '300', 'dGVsZXNjb3BlLWhlYWx0aA=='); - -INSERT INTO main.tenants(name, status, key) - VALUES ('demo', 0, 'demo'); - -INSERT INTO main.roles(name, permissions, role_type, tenant_id) - VALUES ('SuperAdmin', '{CreateTenant,ViewTenant,UpdateTenant,DeleteTenant,CreateTenantUser,10200,10201,10202,10203,10204,10216,10205,10206,10207,10208,10209,10210,10211,10212,10213,10214,10215,2,7008,8000,8001,8002,8003,7001,7002,7003,7004,7005,7006,7007,7008,7009,7010,7011,7012,7013,7014,7015,7016,7017,7018,7019,7020,7021,7022,7023,7024,7025,7026,7027,7028}', 0,( - SELECT - id - FROM - main.tenants - WHERE - key = 'demo')); - -INSERT INTO main.users(first_name, last_name, username, email, auth_client_ids, default_tenant_id) -SELECT 'name', -'', -'admin@example.com', -'admin@example.com', -'{1}', - id -FROM - main.tenants -WHERE - key = 'demo'; - - -insert into user_tenants - (user_id, tenant_id, status, role_id) -select (select id - from users - where username = 'admin@example.com'), (select id - from tenants - where key = 'demo'), 1, id -from roles -where name = 'SuperAdmin'; - - -insert into user_credentials - (user_id, auth_provider, password) -select id, 'internal', '$2a$10$TOLMGK43MjbibS8Jap2RXeHl3.4sJcR3eFbms2dBll2LTMggSK9hG' -from users -where username = 'admin@example.com'; -update users set auth_client_ids = ARRAY[(select id from auth_clients where client_id = 'test_client_id')::integer]; - diff --git a/sandbox/auth-ms-basic-example/migrations/sqls/20220607063927-secret-key-column-up.sql b/sandbox/auth-ms-basic-example/migrations/sqls/20220607063927-secret-key-column-up.sql deleted file mode 100644 index d66c203490..0000000000 --- a/sandbox/auth-ms-basic-example/migrations/sqls/20220607063927-secret-key-column-up.sql +++ /dev/null @@ -1,2 +0,0 @@ -ALTER TABLE main.user_credentials -ADD secret_key varchar(100); diff --git a/sandbox/auth-ms-basic-example/migrations/sqls/20221122072057-updated-init-up.sql b/sandbox/auth-ms-basic-example/migrations/sqls/20221122072057-updated-init-up.sql deleted file mode 100644 index 7a3da56364..0000000000 --- a/sandbox/auth-ms-basic-example/migrations/sqls/20221122072057-updated-init-up.sql +++ /dev/null @@ -1,11 +0,0 @@ -ALTER TABLE main.auth_clients -ADD created_by varchar(100), -ADD modified_by varchar(100); - -ALTER TABLE main.user_credentials -ADD created_by varchar(100), -ADD modified_by varchar(100); - -ALTER TABLE main.user_tenants -ADD created_by varchar(100), -ADD modified_by varchar(100); \ No newline at end of file diff --git a/sandbox/auth-ms-basic-example/openapi.md b/sandbox/auth-ms-basic-example/openapi.md deleted file mode 100644 index 0765255c83..0000000000 --- a/sandbox/auth-ms-basic-example/openapi.md +++ /dev/null @@ -1,3934 +0,0 @@ ---- -title: Authentication Service v1.0.0 -language_tabs: - - "'javascript": JavaScript - - "'javascript--nodejs": Node.JS' -language_clients: - - "'javascript": request' - - "'javascript--nodejs": "" -toc_footers: [] -includes: [] -search: false -highlight_theme: darkula -headingLevel: 2 - ---- - - - -

Authentication Service v1.0.0

- -> Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu. - -Auth microservice basic example - -Base URLs: - -* http://localhost:3000 - -# Authentication - -- HTTP Authentication, scheme: bearer - -

LoginController

- -## LoginController.resetPassword - - - -> Code samples - -```'javascript--nodejs -const fetch = require('node-fetch'); -const inputBody = { - "refreshToken": "string", - "username": "string", - "password": "string", - "oldPassword": "string" -}; -const headers = { - 'Content-Type':'application/json', - 'Authorization':'string' -}; - -fetch('http://localhost:3000/auth/change-password', -{ - method: 'PATCH', - body: JSON.stringify(inputBody), - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`PATCH /auth/change-password` - -> Body parameter - -```json -{ - "refreshToken": "string", - "username": "string", - "password": "string", - "oldPassword": "string" -} -``` - -

Parameters

- -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|Authorization|header|string|false|none| -|body|body|[ResetPasswordPartial](#schemaresetpasswordpartial)|false|none| - -

Responses

- -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|If User password successfully changed.|None| - - - -## LoginController.postLoginViaGoogle - - - -> Code samples - -```'javascript--nodejs -const fetch = require('node-fetch'); -const inputBody = { - "client_id": "string", - "client_secret": "string" -}; -const headers = { - 'Content-Type':'application/x-www-form-urlencoded', - 'Accept':'application/json' -}; - -fetch('http://localhost:3000/auth/google', -{ - method: 'POST', - body: JSON.stringify(inputBody), - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`POST /auth/google` - -> Body parameter - -```yaml -client_id: string -client_secret: string - -``` - -

Parameters

- -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|body|body|[ClientAuthRequest](#schemaclientauthrequest)|false|none| - -> Example responses - -> 200 Response - -```json -{ - "accessToken": "string", - "refreshToken": "string", - "expires": 0, - "pubnubToken": "string" -} -``` - -

Responses

- -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|POST Call for Google based login|[TokenResponse](#schematokenresponse)| - - - -## LoginController.loginViaGoogle - - - -> Code samples - -```'javascript--nodejs -const fetch = require('node-fetch'); - -const headers = { - 'Accept':'application/json' -}; - -fetch('http://localhost:3000/auth/google', -{ - method: 'GET', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`GET /auth/google` - -

Parameters

- -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|client_id|query|string|false|none| -|client_secret|query|string|false|none| - -> Example responses - -> 200 Response - -```json -{ - "accessToken": "string", - "refreshToken": "string", - "expires": 0, - "pubnubToken": "string" -} -``` - -

Responses

- -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Google Token Response (Deprecated: Possible security issue if secret is passed via query params, please use the post endpoint)|[TokenResponse](#schematokenresponse)| - - - -## LoginController.googleCallback - - - -> Code samples - -```'javascript--nodejs -const fetch = require('node-fetch'); - -const headers = { - 'Accept':'application/json' -}; - -fetch('http://localhost:3000/auth/google-auth-redirect', -{ - method: 'GET', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`GET /auth/google-auth-redirect` - -

Parameters

- -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|code|query|string|false|none| -|state|query|string|false|none| - -> Example responses - -> 200 Response - -```json -{ - "accessToken": "string", - "refreshToken": "string", - "expires": 0, - "pubnubToken": "string" -} -``` - -

Responses

- -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Google Redirect Token Response|[TokenResponse](#schematokenresponse)| - - - -## LoginController.postLoginViaInstagram - - - -> Code samples - -```'javascript--nodejs -const fetch = require('node-fetch'); -const inputBody = { - "client_id": "string", - "client_secret": "string" -}; -const headers = { - 'Content-Type':'application/x-www-form-urlencoded', - 'Accept':'application/json' -}; - -fetch('http://localhost:3000/auth/instagram', -{ - method: 'POST', - body: JSON.stringify(inputBody), - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`POST /auth/instagram` - -> Body parameter - -```yaml -client_id: string -client_secret: string - -``` - -

Parameters

- -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|body|body|[ClientAuthRequest](#schemaclientauthrequest)|false|none| - -> Example responses - -> 200 Response - -```json -{ - "accessToken": "string", - "refreshToken": "string", - "expires": 0, - "pubnubToken": "string" -} -``` - -

Responses

- -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|POST Call for Instagram based login|[TokenResponse](#schematokenresponse)| - - - -## LoginController.instagramCallback - - - -> Code samples - -```'javascript--nodejs -const fetch = require('node-fetch'); - -const headers = { - 'Accept':'application/json' -}; - -fetch('http://localhost:3000/auth/instagram-auth-redirect', -{ - method: 'GET', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`GET /auth/instagram-auth-redirect` - -

Parameters

- -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|code|query|string|false|none| -|state|query|string|false|none| - -> Example responses - -> 200 Response - -```json -{ - "accessToken": "string", - "refreshToken": "string", - "expires": 0, - "pubnubToken": "string" -} -``` - -

Responses

- -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Instagram Redirect Token Response|[TokenResponse](#schematokenresponse)| - - - -## LoginController.postLoginViaKeycloak - - - -> Code samples - -```'javascript--nodejs -const fetch = require('node-fetch'); -const inputBody = { - "client_id": "string", - "client_secret": "string" -}; -const headers = { - 'Content-Type':'application/x-www-form-urlencoded', - 'Accept':'application/json' -}; - -fetch('http://localhost:3000/auth/keycloak', -{ - method: 'POST', - body: JSON.stringify(inputBody), - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`POST /auth/keycloak` - -POST Call for keycloak based login - -> Body parameter - -```yaml -client_id: string -client_secret: string - -``` - -

Parameters

- -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|body|body|[ClientAuthRequest](#schemaclientauthrequest)|false|none| - -> Example responses - -> 200 Response - -```json -{ - "accessToken": "string", - "refreshToken": "string", - "expires": 0, - "pubnubToken": "string" -} -``` - -

Responses

- -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Keycloak Token Response|[TokenResponse](#schematokenresponse)| - - - -## LoginController.loginViaKeycloak - - - -> Code samples - -```'javascript--nodejs -const fetch = require('node-fetch'); - -const headers = { - 'Accept':'application/json' -}; - -fetch('http://localhost:3000/auth/keycloak', -{ - method: 'GET', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`GET /auth/keycloak` - -

Parameters

- -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|client_id|query|string|false|none| -|client_secret|query|string|false|none| - -> Example responses - -> 200 Response - -```json -{ - "accessToken": "string", - "refreshToken": "string", - "expires": 0, - "pubnubToken": "string" -} -``` - -

Responses

- -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Keycloak Token Response (Deprecated: Possible security issue if secret is passed via query params, please use the post endpoint)|[TokenResponse](#schematokenresponse)| - - - -## LoginController.keycloakCallback - - - -> Code samples - -```'javascript--nodejs -const fetch = require('node-fetch'); - -const headers = { - 'Accept':'application/json' -}; - -fetch('http://localhost:3000/auth/keycloak-auth-redirect', -{ - method: 'GET', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`GET /auth/keycloak-auth-redirect` - -

Parameters

- -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|code|query|string|false|none| -|state|query|string|false|none| - -> Example responses - -> 200 Response - -```json -{ - "accessToken": "string", - "refreshToken": "string", - "expires": 0, - "pubnubToken": "string" -} -``` - -

Responses

- -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Keycloak Redirect Token Response|[TokenResponse](#schematokenresponse)| - - - -## LoginController.login - - - -> Code samples - -```'javascript--nodejs -const fetch = require('node-fetch'); -const inputBody = { - "client_id": "string", - "client_secret": "string", - "username": "string", - "password": "string" -}; -const headers = { - 'Content-Type':'application/json' -}; - -fetch('http://localhost:3000/auth/login', -{ - method: 'POST', - body: JSON.stringify(inputBody), - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`POST /auth/login` - -Gets you the code that will be used for getting token (webapps) - -> Body parameter - -```json -{ - "client_id": "string", - "client_secret": "string", - "username": "string", - "password": "string" -} -``` - -

Parameters

- -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|body|body|[LoginRequest](#schemaloginrequest)|false|none| - -> Example responses - -

Responses

- -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Auth Code|None| -|400|[Bad Request](https://tools.ietf.org/html/rfc7231#section-6.5.1)|The syntax of the request entity is incorrect.|None| -|401|[Unauthorized](https://tools.ietf.org/html/rfc7235#section-3.1)|Invalid Credentials.|None| -|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|The entity requested does not exist.|None| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|The syntax of the request entity is incorrect|None| - -

Response Schema

- - - -## LoginController.loginWithClientUser - - - -> Code samples - -```'javascript--nodejs -const fetch = require('node-fetch'); -const inputBody = { - "client_id": "string", - "client_secret": "string", - "username": "string", - "password": "string" -}; -const headers = { - 'Content-Type':'application/json', - 'Accept':'application/json', - 'device_id':'string' -}; - -fetch('http://localhost:3000/auth/login-token', -{ - method: 'POST', - body: JSON.stringify(inputBody), - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`POST /auth/login-token` - -Gets you refresh token and access token in one hit. (mobile app) - -> Body parameter - -```json -{ - "client_id": "string", - "client_secret": "string", - "username": "string", - "password": "string" -} -``` - -

Parameters

- -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|device_id|header|string|false|none| -|body|body|[LoginRequest](#schemaloginrequest)|false|none| - -> Example responses - -> 200 Response - -```json -{ - "accessToken": "string", - "refreshToken": "string", - "expires": 0, - "pubnubToken": "string" -} -``` - -

Responses

- -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Token Response Model|[TokenResponse](#schematokenresponse)| -|400|[Bad Request](https://tools.ietf.org/html/rfc7231#section-6.5.1)|The syntax of the request entity is incorrect.|None| -|401|[Unauthorized](https://tools.ietf.org/html/rfc7235#section-3.1)|Invalid Credentials.|None| -|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|The entity requested does not exist.|None| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|The syntax of the request entity is incorrect|None| - - - -## LoginController.me - - - -> Code samples - -```'javascript--nodejs -const fetch = require('node-fetch'); - -const headers = { - 'Authorization':'Bearer {access-token}' -}; - -fetch('http://localhost:3000/auth/me', -{ - method: 'GET', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`GET /auth/me` - -To get the user details - -> Example responses - -

Responses

- -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|User Object|None| -|400|[Bad Request](https://tools.ietf.org/html/rfc7231#section-6.5.1)|The syntax of the request entity is incorrect.|None| -|401|[Unauthorized](https://tools.ietf.org/html/rfc7235#section-3.1)|Invalid Credentials.|None| -|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|The entity requested does not exist.|None| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|The syntax of the request entity is incorrect|None| - -

Response Schema

- - - -## LoginController.getToken - - - -> Code samples - -```'javascript--nodejs -const fetch = require('node-fetch'); -const inputBody = { - "code": "string", - "clientId": "string" -}; -const headers = { - 'Content-Type':'application/json', - 'Accept':'application/json', - 'device_id':'string' -}; - -fetch('http://localhost:3000/auth/token', -{ - method: 'POST', - body: JSON.stringify(inputBody), - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`POST /auth/token` - - Send the code received from the above api and this api will send you refresh token and access token (webapps) - -> Body parameter - -```json -{ - "code": "string", - "clientId": "string" -} -``` - -

Parameters

- -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|device_id|header|string|false|none| -|body|body|[AuthTokenRequest](#schemaauthtokenrequest)|false|none| - -> Example responses - -> 200 Response - -```json -{ - "accessToken": "string", - "refreshToken": "string", - "expires": 0, - "pubnubToken": "string" -} -``` - -

Responses

- -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Token Response|[TokenResponse](#schematokenresponse)| -|400|[Bad Request](https://tools.ietf.org/html/rfc7231#section-6.5.1)|The syntax of the request entity is incorrect.|None| -|401|[Unauthorized](https://tools.ietf.org/html/rfc7235#section-3.1)|Invalid Credentials.|None| -|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|The entity requested does not exist.|None| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|The syntax of the request entity is incorrect|None| - - - -## LoginController.exchangeToken - - - -> Code samples - -```'javascript--nodejs -const fetch = require('node-fetch'); -const inputBody = { - "refreshToken": "string" -}; -const headers = { - 'Content-Type':'application/json', - 'Accept':'application/json', - 'device_id':'string' -}; - -fetch('http://localhost:3000/auth/token-refresh', -{ - method: 'POST', - body: JSON.stringify(inputBody), - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`POST /auth/token-refresh` - - Gets you a new access and refresh token once your access token is expired. (both mobile and web) - -> Body parameter - -```json -{ - "refreshToken": "string" -} -``` - -

Parameters

- -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|device_id|header|string|false|none| -|body|body|[AuthRefreshTokenRequest](#schemaauthrefreshtokenrequest)|false|none| - -> Example responses - -> 200 Response - -```json -{ - "accessToken": "string", - "refreshToken": "string", - "expires": 0, - "pubnubToken": "string" -} -``` - -

Responses

- -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|New Token Response|[TokenResponse](#schematokenresponse)| -|400|[Bad Request](https://tools.ietf.org/html/rfc7231#section-6.5.1)|The syntax of the request entity is incorrect.|None| -|401|[Unauthorized](https://tools.ietf.org/html/rfc7235#section-3.1)|Invalid Credentials.|None| -|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|The entity requested does not exist.|None| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|The syntax of the request entity is incorrect|None| - - - -

ForgetPasswordController

- -## ForgetPasswordController.forgetPassword - - - -> Code samples - -```'javascript--nodejs -const fetch = require('node-fetch'); -const inputBody = { - "username": "string", - "client_id": "string", - "client_secret": "string" -}; -const headers = { - 'Content-Type':'application/json', - 'Accept':'application/json' -}; - -fetch('http://localhost:3000/auth/forget-password', -{ - method: 'POST', - body: JSON.stringify(inputBody), - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`POST /auth/forget-password` - -> Body parameter - -```json -{ - "username": "string", - "client_id": "string", - "client_secret": "string" -} -``` - -

Parameters

- -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|body|body|[ForgetPasswordDto](#schemaforgetpassworddto)|false|none| - -> Example responses - -> 200 Response - -```json -{ - "code": "string", - "expiry": 0, - "email": "string", - "user": { - "deleted": true, - "deletedOn": "2019-08-24T14:15:22Z", - "deletedBy": "string", - "createdOn": "2019-08-24T14:15:22Z", - "modifiedOn": "2019-08-24T14:15:22Z", - "createdBy": "string", - "modifiedBy": "string", - "id": "string", - "firstName": "string", - "lastName": "string", - "middleName": "string", - "username": "string", - "email": "string", - "phone": "string", - "authClientIds": "string", - "lastLogin": "2019-08-24T14:15:22Z", - "dob": "2019-08-24T14:15:22Z", - "gender": "M", - "defaultTenantId": "string" - } -} -``` - -

Responses

- -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Success Response.|[ForgetPasswordResponseDto](#schemaforgetpasswordresponsedto)| -|400|[Bad Request](https://tools.ietf.org/html/rfc7231#section-6.5.1)|The syntax of the request entity is incorrect.|None| -|401|[Unauthorized](https://tools.ietf.org/html/rfc7235#section-3.1)|Invalid Credentials.|None| -|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|The entity requested does not exist.|None| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|The syntax of the request entity is incorrect|None| - - - -## ForgetPasswordController.resetPassword - - - -> Code samples - -```'javascript--nodejs -const fetch = require('node-fetch'); -const inputBody = { - "token": "string", - "password": "string", - "client_id": "string", - "client_secret": "string" -}; -const headers = { - 'Content-Type':'application/json' -}; - -fetch('http://localhost:3000/auth/reset-password', -{ - method: 'PATCH', - body: JSON.stringify(inputBody), - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`PATCH /auth/reset-password` - -> Body parameter - -```json -{ - "token": "string", - "password": "string", - "client_id": "string", - "client_secret": "string" -} -``` - -

Parameters

- -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|body|body|[ResetPasswordWithClient](#schemaresetpasswordwithclient)|false|none| - -

Responses

- -|Status|Meaning|Description|Schema| -|---|---|---|---| -|204|[No Content](https://tools.ietf.org/html/rfc7231#section-6.3.5)|If User password successfully changed.|None| - - - -## ForgetPasswordController.verifyResetPasswordLink - - - -> Code samples - -```'javascript--nodejs -const fetch = require('node-fetch'); - -fetch('http://localhost:3000/auth/verify-reset-password-link?token=string', -{ - method: 'GET' - -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`GET /auth/verify-reset-password-link` - - - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|token|query|string|true|none| - - - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Check if Token Is Valid and not Expired.|None| - - - -

SignupRequestController

- -## SignupRequestController.requestSignup - - - -> Code samples - -```'javascript--nodejs -const fetch = require('node-fetch'); -const inputBody = { - "email": "string", - "data": {} -}; -const headers = { - 'Content-Type':'application/json', - 'Accept':'application/json' -}; - -fetch('http://localhost:3000/auth/sign-up/create-token', -{ - method: 'POST', - body: JSON.stringify(inputBody), - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`POST /auth/sign-up/create-token` - -> Body parameter - -```json -{ - "email": "string", - "data": {} -} -``` - -

Parameters

- -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|body|body|[SignupRequestDto](#schemasignuprequestdto)|false|none| - -> Example responses - -> 200 Response - -```json -{ - "code": "string", - "expiry": 0, - "email": "string" -} -``` - -

Responses

- -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Sucess Response.|[SignupRequestResponseDto](#schemasignuprequestresponsedto)| -|400|[Bad Request](https://tools.ietf.org/html/rfc7231#section-6.5.1)|The syntax of the request entity is incorrect.|None| -|401|[Unauthorized](https://tools.ietf.org/html/rfc7235#section-3.1)|Invalid Credentials.|None| -|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|The entity requested does not exist.|None| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|The syntax of the request entity is incorrect|None| - - - -## SignupRequestController.signupWithToken - - - -> Code samples - -```'javascript--nodejs -const fetch = require('node-fetch'); -const inputBody = { - "email": "string", - "password": "string" -}; -const headers = { - 'Content-Type':'application/json', - 'Accept':'application/json' -}; - -fetch('http://localhost:3000/auth/sign-up/create-user', -{ - method: 'POST', - body: JSON.stringify(inputBody), - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`POST /auth/sign-up/create-user` - -> Body parameter - -```json -{ - "email": "string", - "password": "string" -} -``` - -

Parameters

- -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|body|body|[LocalUserProfileDto](#schemalocaluserprofiledto)|false|none| - -> Example responses - -> 200 Response - -```json -{ - "email": "string", - "password": "string" -} -``` - -

Responses

- -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Sucess Response.|[LocalUserProfileDto](#schemalocaluserprofiledto)| -|400|[Bad Request](https://tools.ietf.org/html/rfc7231#section-6.5.1)|The syntax of the request entity is incorrect.|None| -|401|[Unauthorized](https://tools.ietf.org/html/rfc7235#section-3.1)|Invalid Credentials.|None| -|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|The entity requested does not exist.|None| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|The syntax of the request entity is incorrect|None| - - - -## SignupRequestController.verifyInviteToken - - - -> Code samples - -```'javascript--nodejs -const fetch = require('node-fetch'); - -fetch('http://localhost:3000/auth/sign-up/verify-token', -{ - method: 'GET' - -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`GET /auth/sign-up/verify-token` - -

Responses

- -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Sucess Response.|None| -|400|[Bad Request](https://tools.ietf.org/html/rfc7231#section-6.5.1)|The syntax of the request entity is incorrect.|None| -|401|[Unauthorized](https://tools.ietf.org/html/rfc7235#section-3.1)|Invalid Credentials.|None| -|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|The entity requested does not exist.|None| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|The syntax of the request entity is incorrect|None| - - - -

AuthClientController

- -## AuthClientController.count - - - -> Code samples - -```'javascript--nodejs -const fetch = require('node-fetch'); - -const headers = { - 'Accept':'application/json', - 'Authorization':'Bearer {access-token}' -}; - -fetch('http://localhost:3000/auth-clients/count', -{ - method: 'GET', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`GET /auth-clients/count` - -

Parameters

- -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|where|query|object|false|none| - -> Example responses - -> 200 Response - -```json -{ - "count": 0 -} -``` - -

Responses

- -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|AuthClient model count|[loopback.Count](#schemaloopback.count)| - - - -## AuthClientController.replaceById - - - -> Code samples - -```'javascript--nodejs -const fetch = require('node-fetch'); -const inputBody = { - "deleted": true, - "deletedOn": "2019-08-24T14:15:22Z", - "deletedBy": "string", - "createdOn": "2019-08-24T14:15:22Z", - "modifiedOn": "2019-08-24T14:15:22Z", - "id": 0, - "clientId": "string", - "clientSecret": "string", - "secret": "string", - "redirectUrl": "string", - "accessTokenExpiration": 0, - "refreshTokenExpiration": 0, - "authCodeExpiration": 0 -}; -const headers = { - 'Content-Type':'application/json', - 'Authorization':'Bearer {access-token}' -}; - -fetch('http://localhost:3000/auth-clients/{id}', -{ - method: 'PUT', - body: JSON.stringify(inputBody), - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`PUT /auth-clients/{id}` - -> Body parameter - -```json -{ - "deleted": true, - "deletedOn": "2019-08-24T14:15:22Z", - "deletedBy": "string", - "createdOn": "2019-08-24T14:15:22Z", - "modifiedOn": "2019-08-24T14:15:22Z", - "id": 0, - "clientId": "string", - "clientSecret": "string", - "secret": "string", - "redirectUrl": "string", - "accessTokenExpiration": 0, - "refreshTokenExpiration": 0, - "authCodeExpiration": 0 -} -``` - -

Parameters

- -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|id|path|number|true|none| -|body|body|[AuthClient](#schemaauthclient)|false|none| - -

Responses

- -|Status|Meaning|Description|Schema| -|---|---|---|---| -|204|[No Content](https://tools.ietf.org/html/rfc7231#section-6.3.5)|AuthClient PUT success|None| - - - -## AuthClientController.updateById - - - -> Code samples - -```'javascript--nodejs -const fetch = require('node-fetch'); -const inputBody = { - "deleted": true, - "deletedOn": "2019-08-24T14:15:22Z", - "deletedBy": "string", - "createdOn": "2019-08-24T14:15:22Z", - "modifiedOn": "2019-08-24T14:15:22Z", - "id": 0, - "clientId": "string", - "clientSecret": "string", - "secret": "string", - "redirectUrl": "string", - "accessTokenExpiration": 0, - "refreshTokenExpiration": 0, - "authCodeExpiration": 0 -}; -const headers = { - 'Content-Type':'application/json', - 'Authorization':'Bearer {access-token}' -}; - -fetch('http://localhost:3000/auth-clients/{id}', -{ - method: 'PATCH', - body: JSON.stringify(inputBody), - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`PATCH /auth-clients/{id}` - -> Body parameter - -```json -{ - "deleted": true, - "deletedOn": "2019-08-24T14:15:22Z", - "deletedBy": "string", - "createdOn": "2019-08-24T14:15:22Z", - "modifiedOn": "2019-08-24T14:15:22Z", - "id": 0, - "clientId": "string", - "clientSecret": "string", - "secret": "string", - "redirectUrl": "string", - "accessTokenExpiration": 0, - "refreshTokenExpiration": 0, - "authCodeExpiration": 0 -} -``` - -

Parameters

- -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|id|path|number|true|none| -|body|body|[AuthClientPartial](#schemaauthclientpartial)|false|none| - -

Responses

- -|Status|Meaning|Description|Schema| -|---|---|---|---| -|204|[No Content](https://tools.ietf.org/html/rfc7231#section-6.3.5)|AuthClient PATCH success|None| - - - -## AuthClientController.findById - - - -> Code samples - -```'javascript--nodejs -const fetch = require('node-fetch'); - -const headers = { - 'Accept':'application/json', - 'Authorization':'Bearer {access-token}' -}; - -fetch('http://localhost:3000/auth-clients/{id}', -{ - method: 'GET', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`GET /auth-clients/{id}` - -

Parameters

- -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|id|path|number|true|none| - -> Example responses - -> 200 Response - -```json -{ - "deleted": true, - "deletedOn": "2019-08-24T14:15:22Z", - "deletedBy": "string", - "createdOn": "2019-08-24T14:15:22Z", - "modifiedOn": "2019-08-24T14:15:22Z", - "id": 0, - "clientId": "string", - "clientSecret": "string", - "secret": "string", - "redirectUrl": "string", - "accessTokenExpiration": 0, - "refreshTokenExpiration": 0, - "authCodeExpiration": 0 -} -``` - -

Responses

- -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|AuthClient model instance|[AuthClient](#schemaauthclient)| - - - -## AuthClientController.deleteById - - - -> Code samples - -```'javascript--nodejs -const fetch = require('node-fetch'); - -const headers = { - 'Authorization':'Bearer {access-token}' -}; - -fetch('http://localhost:3000/auth-clients/{id}', -{ - method: 'DELETE', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`DELETE /auth-clients/{id}` - -

Parameters

- -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|id|path|number|true|none| - -

Responses

- -|Status|Meaning|Description|Schema| -|---|---|---|---| -|204|[No Content](https://tools.ietf.org/html/rfc7231#section-6.3.5)|AuthClient DELETE success|None| - - - -## AuthClientController.create - - - -> Code samples - -```'javascript--nodejs -const fetch = require('node-fetch'); -const inputBody = { - "deleted": true, - "deletedOn": "2019-08-24T14:15:22Z", - "deletedBy": "string", - "createdOn": "2019-08-24T14:15:22Z", - "modifiedOn": "2019-08-24T14:15:22Z", - "clientId": "string", - "clientSecret": "string", - "secret": "string", - "redirectUrl": "string", - "accessTokenExpiration": 0, - "refreshTokenExpiration": 0, - "authCodeExpiration": 0 -}; -const headers = { - 'Content-Type':'application/json', - 'Accept':'application/json', - 'Authorization':'Bearer {access-token}' -}; - -fetch('http://localhost:3000/auth-clients', -{ - method: 'POST', - body: JSON.stringify(inputBody), - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`POST /auth-clients` - -> Body parameter - -```json -{ - "deleted": true, - "deletedOn": "2019-08-24T14:15:22Z", - "deletedBy": "string", - "createdOn": "2019-08-24T14:15:22Z", - "modifiedOn": "2019-08-24T14:15:22Z", - "clientId": "string", - "clientSecret": "string", - "secret": "string", - "redirectUrl": "string", - "accessTokenExpiration": 0, - "refreshTokenExpiration": 0, - "authCodeExpiration": 0 -} -``` - -

Parameters

- -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|body|body|[AuthClientExcluding_id_](#schemaauthclientexcluding_id_)|false|none| - -> Example responses - -> 200 Response - -```json -{ - "deleted": true, - "deletedOn": "2019-08-24T14:15:22Z", - "deletedBy": "string", - "createdOn": "2019-08-24T14:15:22Z", - "modifiedOn": "2019-08-24T14:15:22Z", - "id": 0, - "clientId": "string", - "clientSecret": "string", - "secret": "string", - "redirectUrl": "string", - "accessTokenExpiration": 0, - "refreshTokenExpiration": 0, - "authCodeExpiration": 0 -} -``` - -

Responses

- -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|AuthClient model instance|[AuthClient](#schemaauthclient)| - - - -## AuthClientController.updateAll - - - -> Code samples - -```'javascript--nodejs -const fetch = require('node-fetch'); -const inputBody = { - "deleted": true, - "deletedOn": "2019-08-24T14:15:22Z", - "deletedBy": "string", - "createdOn": "2019-08-24T14:15:22Z", - "modifiedOn": "2019-08-24T14:15:22Z", - "id": 0, - "clientId": "string", - "clientSecret": "string", - "secret": "string", - "redirectUrl": "string", - "accessTokenExpiration": 0, - "refreshTokenExpiration": 0, - "authCodeExpiration": 0 -}; -const headers = { - 'Content-Type':'application/json', - 'Accept':'application/json', - 'Authorization':'Bearer {access-token}' -}; - -fetch('http://localhost:3000/auth-clients', -{ - method: 'PATCH', - body: JSON.stringify(inputBody), - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`PATCH /auth-clients` - -> Body parameter - -```json -{ - "deleted": true, - "deletedOn": "2019-08-24T14:15:22Z", - "deletedBy": "string", - "createdOn": "2019-08-24T14:15:22Z", - "modifiedOn": "2019-08-24T14:15:22Z", - "id": 0, - "clientId": "string", - "clientSecret": "string", - "secret": "string", - "redirectUrl": "string", - "accessTokenExpiration": 0, - "refreshTokenExpiration": 0, - "authCodeExpiration": 0 -} -``` - -

Parameters

- -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|where|query|object|false|none| -|body|body|[AuthClientPartial](#schemaauthclientpartial)|false|none| - -> Example responses - -> 200 Response - -```json -{ - "count": 0 -} -``` - -

Responses

- -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|AuthClient PATCH success count|[loopback.Count](#schemaloopback.count)| - - - -## AuthClientController.find - - - -> Code samples - -```'javascript--nodejs -const fetch = require('node-fetch'); - -const headers = { - 'Accept':'application/json', - 'Authorization':'Bearer {access-token}' -}; - -fetch('http://localhost:3000/auth-clients', -{ - method: 'GET', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`GET /auth-clients` - -

Parameters

- -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|filter|query|[auth_clients.Filter](#schemaauth_clients.filter)|false|none| - -> Example responses - -> 200 Response - -```json -[ - { - "deleted": true, - "deletedOn": "2019-08-24T14:15:22Z", - "deletedBy": "string", - "createdOn": "2019-08-24T14:15:22Z", - "modifiedOn": "2019-08-24T14:15:22Z", - "id": 0, - "clientId": "string", - "clientSecret": "string", - "secret": "string", - "redirectUrl": "string", - "accessTokenExpiration": 0, - "refreshTokenExpiration": 0, - "authCodeExpiration": 0 - } -] -``` - -

Responses

- -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Array of AuthClient model instances|Inline| - -

Response Schema

- -Status Code **200** - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|*anonymous*|[[AuthClient](#schemaauthclient)]|false|none|none| -|» AuthClient|[AuthClient](#schemaauthclient)|false|none|none| -|»» deleted|boolean|false|none|none| -|»» deletedOn|string(date-time)¦null|false|none|none| -|»» deletedBy|string¦null|false|none|none| -|»» createdOn|string(date-time)|false|none|none| -|»» modifiedOn|string(date-time)|false|none|none| -|»» id|number|false|none|none| -|»» clientId|string|true|none|none| -|»» clientSecret|string|true|none|none| -|»» secret|string|true|none|none| -|»» redirectUrl|string|false|none|none| -|»» accessTokenExpiration|number|true|none|none| -|»» refreshTokenExpiration|number|true|none|none| -|»» authCodeExpiration|number|true|none|none| - - - -

LogoutController

- -## LogoutController.keycloakLogout - - - -> Code samples - -```'javascript--nodejs -const fetch = require('node-fetch'); -const inputBody = { - "refreshToken": "string" -}; -const headers = { - 'Content-Type':'application/json', - 'Accept':'application/json', - 'Authorization':'string' -}; - -fetch('http://localhost:3000/keycloak/logout', -{ - method: 'POST', - body: JSON.stringify(inputBody), - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`POST /keycloak/logout` - -This API will log out the user from application as well as keycloak - -> Body parameter - -```json -{ - "refreshToken": "string" -} -``` - -

Parameters

- -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|Authorization|header|string|false|This is the access token which is required to authenticate user.| -|body|body|[RefreshTokenRequestPartial](#schemarefreshtokenrequestpartial)|false|none| - -> Example responses - -> 200 Response - -```json -{ - "success": true -} -``` - -

Responses

- -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Success Response|[SuccessResponse](#schemasuccessresponse)| -|400|[Bad Request](https://tools.ietf.org/html/rfc7231#section-6.5.1)|The syntax of the request entity is incorrect.|None| -|401|[Unauthorized](https://tools.ietf.org/html/rfc7235#section-3.1)|Invalid Credentials.|None| -|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|The entity requested does not exist.|None| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|The syntax of the request entity is incorrect|None| - - - -## LogoutController.logout - - - -> Code samples - -```'javascript--nodejs -const fetch = require('node-fetch'); -const inputBody = { - "refreshToken": "string" -}; -const headers = { - 'Content-Type':'application/json', - 'Accept':'application/json', - 'Authorization':'string' -}; - -fetch('http://localhost:3000/logout', -{ - method: 'POST', - body: JSON.stringify(inputBody), - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`POST /logout` - -To logout - -> Body parameter - -```json -{ - "refreshToken": "string" -} -``` - -

Parameters

- -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|Authorization|header|string|false|This is the access token which is required to authenticate user.| -|body|body|[RefreshTokenRequestPartial](#schemarefreshtokenrequestpartial)|false|none| - -> Example responses - -> 200 Response - -```json -{ - "success": true -} -``` - -

Responses

- -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Success Response|[SuccessResponse](#schemasuccessresponse)| -|400|[Bad Request](https://tools.ietf.org/html/rfc7231#section-6.5.1)|The syntax of the request entity is incorrect.|None| -|401|[Unauthorized](https://tools.ietf.org/html/rfc7235#section-3.1)|Invalid Credentials.|None| -|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|The entity requested does not exist.|None| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|The syntax of the request entity is incorrect|None| - - - -

OtpController

- -## OtpController.findById - - - -> Code samples - -```'javascript--nodejs -const fetch = require('node-fetch'); - -const headers = { - 'Accept':'application/json' -}; - -fetch('http://localhost:3000/otp-caches/{id}', -{ - method: 'GET', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`GET /otp-caches/{id}` - -

Parameters

- -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|id|path|string|true|none| - -> Example responses - -> 200 Response - -```json -{ - "otp": "string", - "username": "string" -} -``` - -

Responses

- -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Otp model instance|[Otp](#schemaotp)| - - - -## OtpController.deleteById - - - -> Code samples - -```'javascript--nodejs -const fetch = require('node-fetch'); - -fetch('http://localhost:3000/otp-caches/{id}', -{ - method: 'DELETE' - -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`DELETE /otp-caches/{id}` - -

Parameters

- -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|id|path|string|true|none| - -

Responses

- -|Status|Meaning|Description|Schema| -|---|---|---|---| -|204|[No Content](https://tools.ietf.org/html/rfc7231#section-6.3.5)|Otp DELETE success|None| - - - -## OtpController.create - - - -> Code samples - -```'javascript--nodejs -const fetch = require('node-fetch'); -const inputBody = { - "otp": "string", - "username": "string" -}; -const headers = { - 'Content-Type':'application/json', - 'Accept':'application/json' -}; - -fetch('http://localhost:3000/otp-caches', -{ - method: 'POST', - body: JSON.stringify(inputBody), - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`POST /otp-caches` - -> Body parameter - -```json -{ - "otp": "string", - "username": "string" -} -``` - -

Parameters

- -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|body|body|[Otp](#schemaotp)|false|none| - -> Example responses - -> 200 Response - -```json -{ - "otp": "string", - "username": "string" -} -``` - -

Responses

- -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Otp model instance|[Otp](#schemaotp)| - - - -

ToDoController

- -## ToDoController.count - - - -> Code samples - -```'javascript--nodejs -const fetch = require('node-fetch'); - -const headers = { - 'Accept':'application/json' -}; - -fetch('http://localhost:3000/to-dos/count', -{ - method: 'GET', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`GET /to-dos/count` - -

Parameters

- -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|where|query|object|false|none| - -> Example responses - -> 200 Response - -```json -{ - "count": 0 -} -``` - -

Responses

- -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|ToDo model count|[loopback.Count](#schemaloopback.count)| - - - -## ToDoController.replaceById - - - -> Code samples - -```'javascript--nodejs -const fetch = require('node-fetch'); -const inputBody = { - "id": "string", - "title": "string", - "description": "string", - "items": [ - "string" - ] -}; -const headers = { - 'Content-Type':'application/json', - 'Accept':'application/json' -}; - -fetch('http://localhost:3000/to-dos/{id}', -{ - method: 'PUT', - body: JSON.stringify(inputBody), - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`PUT /to-dos/{id}` - -> Body parameter - -```json -{ - "id": "string", - "title": "string", - "description": "string", - "items": [ - "string" - ] -} -``` - -

Parameters

- -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|id|path|string|true|none| -|body|body|[ToDo](#schematodo)|false|none| - -> Example responses - -> 204 Response - -```json -null -``` - -

Responses

- -|Status|Meaning|Description|Schema| -|---|---|---|---| -|204|[No Content](https://tools.ietf.org/html/rfc7231#section-6.3.5)|No Content|Inline| - -

Response Schema

- -Status Code **204** - -*ToDo PUT success* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| - - - -## ToDoController.updateById - - - -> Code samples - -```'javascript--nodejs -const fetch = require('node-fetch'); -const inputBody = { - "id": "string", - "title": "string", - "description": "string", - "items": [ - "string" - ] -}; -const headers = { - 'Content-Type':'application/json', - 'Accept':'application/json' -}; - -fetch('http://localhost:3000/to-dos/{id}', -{ - method: 'PATCH', - body: JSON.stringify(inputBody), - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`PATCH /to-dos/{id}` - -> Body parameter - -```json -{ - "id": "string", - "title": "string", - "description": "string", - "items": [ - "string" - ] -} -``` - -

Parameters

- -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|id|path|string|true|none| -|body|body|[ToDoPartial](#schematodopartial)|false|none| - -> Example responses - -> 204 Response - -```json -null -``` - -

Responses

- -|Status|Meaning|Description|Schema| -|---|---|---|---| -|204|[No Content](https://tools.ietf.org/html/rfc7231#section-6.3.5)|No Content|Inline| - -

Response Schema

- -Status Code **204** - -*ToDo PATCH success* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| - - - -## ToDoController.findById - - - -> Code samples - -```'javascript--nodejs -const fetch = require('node-fetch'); - -const headers = { - 'Accept':'application/json' -}; - -fetch('http://localhost:3000/to-dos/{id}', -{ - method: 'GET', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`GET /to-dos/{id}` - -

Parameters

- -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|id|path|string|true|none| -|filter|query|[ToDo.Filter](#schematodo.filter)|false|none| - -> Example responses - -> 200 Response - -```json -{ - "id": "string", - "title": "string", - "description": "string", - "items": [ - "string" - ] -} -``` - -

Responses

- -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|ToDo model instance|[ToDoWithRelations](#schematodowithrelations)| - - - -## ToDoController.deleteById - - - -> Code samples - -```'javascript--nodejs -const fetch = require('node-fetch'); - -const headers = { - 'Accept':'application/json' -}; - -fetch('http://localhost:3000/to-dos/{id}', -{ - method: 'DELETE', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`DELETE /to-dos/{id}` - -

Parameters

- -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|id|path|string|true|none| - -> Example responses - -> 204 Response - -```json -null -``` - -

Responses

- -|Status|Meaning|Description|Schema| -|---|---|---|---| -|204|[No Content](https://tools.ietf.org/html/rfc7231#section-6.3.5)|No Content|Inline| - -

Response Schema

- -Status Code **204** - -*ToDo DELETE success* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| - - - -## ToDoController.create - - - -> Code samples - -```'javascript--nodejs -const fetch = require('node-fetch'); -const inputBody = { - "title": "string", - "description": "string", - "items": [ - "string" - ] -}; -const headers = { - 'Content-Type':'application/json', - 'Accept':'application/json' -}; - -fetch('http://localhost:3000/to-dos', -{ - method: 'POST', - body: JSON.stringify(inputBody), - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`POST /to-dos` - -> Body parameter - -```json -{ - "title": "string", - "description": "string", - "items": [ - "string" - ] -} -``` - -

Parameters

- -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|body|body|[NewToDo](#schemanewtodo)|false|none| - -> Example responses - -> 200 Response - -```json -{ - "id": "string", - "title": "string", - "description": "string", - "items": [ - "string" - ] -} -``` - -

Responses

- -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|ToDo model instance|[ToDo](#schematodo)| - - - -## ToDoController.updateAll - - - -> Code samples - -```'javascript--nodejs -const fetch = require('node-fetch'); -const inputBody = { - "id": "string", - "title": "string", - "description": "string", - "items": [ - "string" - ] -}; -const headers = { - 'Content-Type':'application/json', - 'Accept':'application/json' -}; - -fetch('http://localhost:3000/to-dos', -{ - method: 'PATCH', - body: JSON.stringify(inputBody), - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`PATCH /to-dos` - -> Body parameter - -```json -{ - "id": "string", - "title": "string", - "description": "string", - "items": [ - "string" - ] -} -``` - -

Parameters

- -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|where|query|object|false|none| -|body|body|[ToDoPartial](#schematodopartial)|false|none| - -> Example responses - -> 200 Response - -```json -{ - "count": 0 -} -``` - -

Responses

- -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|ToDo PATCH success count|[loopback.Count](#schemaloopback.count)| - - - -## ToDoController.find - - - -> Code samples - -```'javascript--nodejs -const fetch = require('node-fetch'); - -const headers = { - 'Accept':'application/json' -}; - -fetch('http://localhost:3000/to-dos', -{ - method: 'GET', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`GET /to-dos` - -

Parameters

- -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|filter|query|[ToDo.Filter1](#schematodo.filter1)|false|none| - -> Example responses - -> 200 Response - -```json -[ - { - "id": "string", - "title": "string", - "description": "string", - "items": [ - "string" - ] - } -] -``` - -

Responses

- -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Array of ToDo model instances|Inline| - -

Response Schema

- -Status Code **200** - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|*anonymous*|[[ToDoWithRelations](#schematodowithrelations)]|false|none|[(tsType: ToDoWithRelations, schemaOptions: { includeRelations: true })]| -|» ToDoWithRelations|[ToDoWithRelations](#schematodowithrelations)|false|none|(tsType: ToDoWithRelations, schemaOptions: { includeRelations: true })| -|»» id|string|false|none|none| -|»» title|string|true|none|none| -|»» description|string|true|none|none| -|»» items|[string]|false|none|none| - - - -# Schemas - -

LoginRequest

- - - - - - -```json -{ - "client_id": "string", - "client_secret": "string", - "username": "string", - "password": "string" -} - -``` - -LoginRequest - -### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|client_id|string|true|none|This property is supposed to be a string and is a required field| -|client_secret|string|true|none|This property is supposed to be a string and is a required field| -|username|string|true|none|This property is supposed to be a string and is a required field| -|password|string|true|none|This property is supposed to be a string and is a required field| - -

TokenResponse

- - - - - - -```json -{ - "accessToken": "string", - "refreshToken": "string", - "expires": 0, - "pubnubToken": "string" -} - -``` - -TokenResponse - -### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|accessToken|string|true|none|This property is supposed to be a string and is a required field| -|refreshToken|string|true|none|This property is supposed to be a string and is a required field| -|expires|number|true|none|none| -|pubnubToken|string|false|none|none| - -

AuthTokenRequest

- - - - - - -```json -{ - "code": "string", - "clientId": "string" -} - -``` - -AuthTokenRequest - -### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|code|string|true|none|none| -|clientId|string|true|none|none| - -

Function

- - - - - - -```json -null - -``` - -### Properties - -*None* - -

AuthRefreshTokenRequest

- - - - - - -```json -{ - "refreshToken": "string" -} - -``` - -AuthRefreshTokenRequest - -### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|refreshToken|string|true|none|none| - -

ClientAuthRequest

- - - - - - -```json -{ - "client_id": "string", - "client_secret": "string" -} - -``` - -ClientAuthRequest - -### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|client_id|string|true|none|This property is supposed to be a string and is a required field| -|client_secret|string|true|none|This property is supposed to be a string and is a required field| - -

ResetPasswordPartial

- - - - - - -```json -{ - "refreshToken": "string", - "username": "string", - "password": "string", - "oldPassword": "string" -} - -``` - -ResetPasswordPartial - -### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|refreshToken|string|false|none|none| -|username|string|false|none|This property is supposed to be a string and is a required field| -|password|string|false|none|This property is supposed to be a string and is a required field| -|oldPassword|string|false|none|This property is supposed to be a string and is a required field| - -

ResetPassword

- - - - - - -```json -{ - "refreshToken": "string", - "username": "string", - "password": "string", - "oldPassword": "string" -} - -``` - -ResetPassword - -### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|refreshToken|string|true|none|none| -|username|string|true|none|This property is supposed to be a string and is a required field| -|password|string|true|none|This property is supposed to be a string and is a required field| -|oldPassword|string|false|none|This property is supposed to be a string and is a required field| - -

SuccessResponse

- - - - - - -```json -{ - "success": true -} - -``` - -SuccessResponse - -### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|success|boolean|false|none|none| - -

RefreshTokenRequestPartial

- - - - - - -```json -{ - "refreshToken": "string" -} - -``` - -RefreshTokenRequestPartial - -### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|refreshToken|string|false|none|none| - -

RefreshTokenRequest

- - - - - - -```json -{ - "refreshToken": "string" -} - -``` - -RefreshTokenRequest - -### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|refreshToken|string|true|none|none| - -

Otp

- - - - - - -```json -{ - "otp": "string", - "username": "string" -} - -``` - -Otp - -### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|otp|string|true|none|none| -|username|string|true|none|none| - -

AuthClient

- - - - - - -```json -{ - "deleted": true, - "deletedOn": "2019-08-24T14:15:22Z", - "deletedBy": "string", - "createdOn": "2019-08-24T14:15:22Z", - "modifiedOn": "2019-08-24T14:15:22Z", - "id": 0, - "clientId": "string", - "clientSecret": "string", - "secret": "string", - "redirectUrl": "string", - "accessTokenExpiration": 0, - "refreshTokenExpiration": 0, - "authCodeExpiration": 0 -} - -``` - -AuthClient - -### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|deleted|boolean|false|none|none| -|deletedOn|string(date-time)¦null|false|none|none| -|deletedBy|string¦null|false|none|none| -|createdOn|string(date-time)|false|none|none| -|modifiedOn|string(date-time)|false|none|none| -|id|number|false|none|none| -|clientId|string|true|none|none| -|clientSecret|string|true|none|none| -|secret|string|true|none|none| -|redirectUrl|string|false|none|none| -|accessTokenExpiration|number|true|none|none| -|refreshTokenExpiration|number|true|none|none| -|authCodeExpiration|number|true|none|none| - -

AuthClientExcluding_id_

- - - - - - -```json -{ - "deleted": true, - "deletedOn": "2019-08-24T14:15:22Z", - "deletedBy": "string", - "createdOn": "2019-08-24T14:15:22Z", - "modifiedOn": "2019-08-24T14:15:22Z", - "clientId": "string", - "clientSecret": "string", - "secret": "string", - "redirectUrl": "string", - "accessTokenExpiration": 0, - "refreshTokenExpiration": 0, - "authCodeExpiration": 0 -} - -``` - -AuthClientExcluding_id_ - -### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|deleted|boolean|false|none|none| -|deletedOn|string(date-time)¦null|false|none|none| -|deletedBy|string¦null|false|none|none| -|createdOn|string(date-time)|false|none|none| -|modifiedOn|string(date-time)|false|none|none| -|clientId|string|true|none|none| -|clientSecret|string|true|none|none| -|secret|string|true|none|none| -|redirectUrl|string|false|none|none| -|accessTokenExpiration|number|true|none|none| -|refreshTokenExpiration|number|true|none|none| -|authCodeExpiration|number|true|none|none| - -

AuthClientPartial

- - - - - - -```json -{ - "deleted": true, - "deletedOn": "2019-08-24T14:15:22Z", - "deletedBy": "string", - "createdOn": "2019-08-24T14:15:22Z", - "modifiedOn": "2019-08-24T14:15:22Z", - "id": 0, - "clientId": "string", - "clientSecret": "string", - "secret": "string", - "redirectUrl": "string", - "accessTokenExpiration": 0, - "refreshTokenExpiration": 0, - "authCodeExpiration": 0 -} - -``` - -AuthClientPartial - -### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|deleted|boolean|false|none|none| -|deletedOn|string(date-time)¦null|false|none|none| -|deletedBy|string¦null|false|none|none| -|createdOn|string(date-time)|false|none|none| -|modifiedOn|string(date-time)|false|none|none| -|id|number|false|none|none| -|clientId|string|false|none|none| -|clientSecret|string|false|none|none| -|secret|string|false|none|none| -|redirectUrl|string|false|none|none| -|accessTokenExpiration|number|false|none|none| -|refreshTokenExpiration|number|false|none|none| -|authCodeExpiration|number|false|none|none| - -

User

- - - - - - -```json -{ - "deleted": true, - "deletedOn": "2019-08-24T14:15:22Z", - "deletedBy": "string", - "createdOn": "2019-08-24T14:15:22Z", - "modifiedOn": "2019-08-24T14:15:22Z", - "createdBy": "string", - "modifiedBy": "string", - "id": "string", - "firstName": "string", - "lastName": "string", - "middleName": "string", - "username": "string", - "email": "string", - "phone": "string", - "authClientIds": "string", - "lastLogin": "2019-08-24T14:15:22Z", - "dob": "2019-08-24T14:15:22Z", - "gender": "M", - "defaultTenantId": "string" -} - -``` - -User - -### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|deleted|boolean|false|none|none| -|deletedOn|string(date-time)¦null|false|none|none| -|deletedBy|string¦null|false|none|none| -|createdOn|string(date-time)|false|none|none| -|modifiedOn|string(date-time)|false|none|none| -|createdBy|string|false|none|none| -|modifiedBy|string|false|none|none| -|id|string|false|none|none| -|firstName|string|true|none|none| -|lastName|string|false|none|none| -|middleName|string|false|none|none| -|username|string|true|none|none| -|email|string|false|none|none| -|phone|string|false|none|none| -|authClientIds|string|false|none|none| -|lastLogin|string(date-time)|false|none|none| -|dob|string(date-time)|false|none|none| -|gender|string|false|none|This field takes a single character as input in database.
'M' for male and 'F' for female.| -|defaultTenantId|string|false|none|none| - -#### Enumerated Values - -|Property|Value| -|---|---| -|gender|M| -|gender|F| -|gender|O| - -

ForgetPasswordResponseDto

- - - - - - -```json -{ - "code": "string", - "expiry": 0, - "email": "string", - "user": { - "deleted": true, - "deletedOn": "2019-08-24T14:15:22Z", - "deletedBy": "string", - "createdOn": "2019-08-24T14:15:22Z", - "modifiedOn": "2019-08-24T14:15:22Z", - "createdBy": "string", - "modifiedBy": "string", - "id": "string", - "firstName": "string", - "lastName": "string", - "middleName": "string", - "username": "string", - "email": "string", - "phone": "string", - "authClientIds": "string", - "lastLogin": "2019-08-24T14:15:22Z", - "dob": "2019-08-24T14:15:22Z", - "gender": "M", - "defaultTenantId": "string" - } -} - -``` - -ForgetPasswordResponseDto - -### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|code|string|true|none|none| -|expiry|number|true|none|none| -|email|string|true|none|none| -|user|[User](#schemauser)|false|none|This is signature for user model.| - -

ForgetPasswordDto

- - - - - - -```json -{ - "username": "string", - "client_id": "string", - "client_secret": "string" -} - -``` - -ForgetPasswordDto - -### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|username|string|true|none|none| -|client_id|string|true|none|none| -|client_secret|string|true|none|none| - -

ResetPasswordWithClient

- - - - - - -```json -{ - "token": "string", - "password": "string", - "client_id": "string", - "client_secret": "string" -} - -``` - -ResetPasswordWithClient - -### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|token|string|true|none|none| -|password|string|true|none|none| -|client_id|string|true|none|none| -|client_secret|string|true|none|none| - -

SignupRequestResponseDto

- - - - - - -```json -{ - "code": "string", - "expiry": 0, - "email": "string" -} - -``` - -SignupRequestResponseDto - -### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|code|string|true|none|none| -|expiry|number|true|none|none| -|email|string|true|none|none| - -

SignupRequestDto

- - - - - - -```json -{ - "email": "string", - "data": {} -} - -``` - -SignupRequestDto - -### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|email|string|true|none|none| -|data|object|false|none|none| - -

LocalUserProfileDto

- - - - - - -```json -{ - "email": "string", - "password": "string" -} - -``` - -LocalUserProfileDto - -### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|email|string|true|none|none| -|password|string|true|none|none| - -

SignupRequest

- - - - - - -```json -{ - "email": "string", - "expiry": "string" -} - -``` - -SignupRequest - -### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|email|string|true|none|none| -|expiry|string|false|none|none| - -

ToDo

- - - - - - -```json -{ - "id": "string", - "title": "string", - "description": "string", - "items": [ - "string" - ] -} - -``` - -ToDo - -### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|id|string|false|none|none| -|title|string|true|none|none| -|description|string|true|none|none| -|items|[string]|false|none|none| - -

NewToDo

- - - - - - -```json -{ - "title": "string", - "description": "string", - "items": [ - "string" - ] -} - -``` - -NewToDo - -### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|title|string|true|none|none| -|description|string|true|none|none| -|items|[string]|false|none|none| - -

ToDoWithRelations

- - - - - - -```json -{ - "id": "string", - "title": "string", - "description": "string", - "items": [ - "string" - ] -} - -``` - -ToDoWithRelations - -### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|id|string|false|none|none| -|title|string|true|none|none| -|description|string|true|none|none| -|items|[string]|false|none|none| - -

ToDoPartial

- - - - - - -```json -{ - "id": "string", - "title": "string", - "description": "string", - "items": [ - "string" - ] -} - -``` - -ToDoPartial - -### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|id|string|false|none|none| -|title|string|false|none|none| -|description|string|false|none|none| -|items|[string]|false|none|none| - -

loopback.Count

- - - - - - -```json -{ - "count": 0 -} - -``` - -loopback.Count - -### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|count|number|false|none|none| - -

auth_clients.Filter

- - - - - - -```json -{ - "offset": 0, - "limit": 100, - "skip": 0, - "order": "string", - "where": {}, - "fields": { - "deleted": true, - "deletedOn": true, - "deletedBy": true, - "createdOn": true, - "modifiedOn": true, - "id": true, - "clientId": true, - "clientSecret": true, - "secret": true, - "redirectUrl": true, - "accessTokenExpiration": true, - "refreshTokenExpiration": true, - "authCodeExpiration": true - } -} - -``` - -auth_clients.Filter - -### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|offset|integer|false|none|none| -|limit|integer|false|none|none| -|skip|integer|false|none|none| -|order|any|false|none|none| - -oneOf - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|string|false|none|none| - -xor - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|[string]|false|none|none| - -continued - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|where|object|false|none|none| -|fields|any|false|none|none| - -oneOf - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|object|false|none|none| -|»» deleted|boolean|false|none|none| -|»» deletedOn|boolean|false|none|none| -|»» deletedBy|boolean|false|none|none| -|»» createdOn|boolean|false|none|none| -|»» modifiedOn|boolean|false|none|none| -|»» id|boolean|false|none|none| -|»» clientId|boolean|false|none|none| -|»» clientSecret|boolean|false|none|none| -|»» secret|boolean|false|none|none| -|»» redirectUrl|boolean|false|none|none| -|»» accessTokenExpiration|boolean|false|none|none| -|»» refreshTokenExpiration|boolean|false|none|none| -|»» authCodeExpiration|boolean|false|none|none| - -xor - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|[string]|false|none|none| - -

ToDo.Filter

- - - - - - -```json -{ - "offset": 0, - "limit": 100, - "skip": 0, - "order": "string", - "fields": { - "id": true, - "title": true, - "description": true, - "items": true - } -} - -``` - -ToDo.Filter - -### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|offset|integer|false|none|none| -|limit|integer|false|none|none| -|skip|integer|false|none|none| -|order|any|false|none|none| - -oneOf - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|string|false|none|none| - -xor - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|[string]|false|none|none| - -continued - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|fields|any|false|none|none| - -oneOf - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|object|false|none|none| -|»» id|boolean|false|none|none| -|»» title|boolean|false|none|none| -|»» description|boolean|false|none|none| -|»» items|boolean|false|none|none| - -xor - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|[string]|false|none|none| - -

ToDo.Filter1

- - - - - - -```json -{ - "offset": 0, - "limit": 100, - "skip": 0, - "order": "string", - "where": {}, - "fields": { - "id": true, - "title": true, - "description": true, - "items": true - } -} - -``` - -ToDo.Filter - -### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|offset|integer|false|none|none| -|limit|integer|false|none|none| -|skip|integer|false|none|none| -|order|any|false|none|none| - -oneOf - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|string|false|none|none| - -xor - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|[string]|false|none|none| - -continued - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|where|object|false|none|none| -|fields|any|false|none|none| - -oneOf - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|object|false|none|none| -|»» id|boolean|false|none|none| -|»» title|boolean|false|none|none| -|»» description|boolean|false|none|none| -|»» items|boolean|false|none|none| - -xor - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|[string]|false|none|none| - diff --git a/sandbox/auth-ms-basic-example/public/index.html b/sandbox/auth-ms-basic-example/public/index.html deleted file mode 100644 index 042f8e20f8..0000000000 --- a/sandbox/auth-ms-basic-example/public/index.html +++ /dev/null @@ -1,88 +0,0 @@ - - - - - auth-multitenant-example - - - - - - - - - - -
-

auth-multitenant-example

-

Version 1.0.0

- -

OpenAPI spec: /openapi.json

-

API Explorer: /explorer

-
- - - - - diff --git a/sandbox/auth-ms-basic-example/src/__tests__/acceptance/test-helper.ts b/sandbox/auth-ms-basic-example/src/__tests__/acceptance/test-helper.ts deleted file mode 100644 index af43b1411a..0000000000 --- a/sandbox/auth-ms-basic-example/src/__tests__/acceptance/test-helper.ts +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (c) 2023 Sourcefuse Technologies -// -// This software is released under the MIT License. -// https://opensource.org/licenses/MIT -import {AuthMultitenantExampleApplication} from '../..'; -import { - createRestAppClient, - givenHttpServerConfig, - Client, -} from '@loopback/testlab'; - -export async function setupApplication(): Promise { - const restConfig = givenHttpServerConfig({ - // Customize the server configuration here. - // Empty values (undefined, '') will be ignored by the helper. - // - // host: process.env.HOST, - // port: +process.env.PORT, - }); - - const app = new AuthMultitenantExampleApplication({ - rest: restConfig, - }); - - await app.boot(); - await app.start(); - - const client = createRestAppClient(app); - - return {app, client}; -} - -export interface AppWithClient { - app: AuthMultitenantExampleApplication; - client: Client; -} diff --git a/sandbox/auth-ms-basic-example/src/application.ts b/sandbox/auth-ms-basic-example/src/application.ts deleted file mode 100644 index 2b93263dd9..0000000000 --- a/sandbox/auth-ms-basic-example/src/application.ts +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright (c) 2023 Sourcefuse Technologies -// -// This software is released under the MIT License. -// https://opensource.org/licenses/MIT -import {BootMixin} from '@loopback/boot'; -import {ApplicationConfig} from '@loopback/core'; -import {RepositoryMixin} from '@loopback/repository'; -import {RestApplication} from '@loopback/rest'; -import { - RestExplorerBindings, - RestExplorerComponent, -} from '@loopback/rest-explorer'; -import {ServiceMixin} from '@loopback/service-proxy'; -import { - AuthenticationServiceComponent, - SignUpBindings, -} from '@sourceloop/authentication-service'; -import path from 'path'; -import {AzureAdSignupProvider} from './providers'; -import {LocalSignupProvider} from './providers/local-signup.provider'; -import {MySequence} from './sequence'; - -export {ApplicationConfig}; - -export class AuthMultitenantExampleApplication extends BootMixin( - ServiceMixin(RepositoryMixin(RestApplication)), -) { - constructor(options: ApplicationConfig = {}) { - super(options); - - // Set up the custom sequence - this.sequence(MySequence); - - // Set up default home page - this.static('/', path.join(__dirname, '../public')); - - // Customize @loopback/rest-explorer configuration here - this.configure(RestExplorerBindings.COMPONENT).to({ - path: '/explorer', - }); - this.component(RestExplorerComponent); - this.component(AuthenticationServiceComponent); - this.bind(SignUpBindings.LOCAL_SIGNUP_PROVIDER).toProvider( - LocalSignupProvider, - ); - this.bind(SignUpBindings.AZURE_AD_SIGN_UP_PROVIDER).toProvider( - AzureAdSignupProvider, - ); - - this.projectRoot = __dirname; - // Customize @loopback/boot Booter Conventions here - this.bootOptions = { - controllers: { - // Customize ControllerBooter Conventions here - dirs: ['controllers'], - extensions: ['.controller.js'], - nested: true, - }, - }; - } -} diff --git a/sandbox/auth-ms-basic-example/src/controllers/index.ts b/sandbox/auth-ms-basic-example/src/controllers/index.ts deleted file mode 100644 index 272f5019e9..0000000000 --- a/sandbox/auth-ms-basic-example/src/controllers/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -// Copyright (c) 2023 Sourcefuse Technologies -// -// This software is released under the MIT License. -// https://opensource.org/licenses/MIT -export * from './to-do.controller'; diff --git a/sandbox/auth-ms-basic-example/src/controllers/to-do.controller.ts b/sandbox/auth-ms-basic-example/src/controllers/to-do.controller.ts deleted file mode 100644 index 159dfd968d..0000000000 --- a/sandbox/auth-ms-basic-example/src/controllers/to-do.controller.ts +++ /dev/null @@ -1,194 +0,0 @@ -// Copyright (c) 2023 Sourcefuse Technologies -// -// This software is released under the MIT License. -// https://opensource.org/licenses/MIT -import { - Count, - CountSchema, - Filter, - FilterExcludingWhere, - repository, - Where, -} from '@loopback/repository'; -import { - post, - param, - get, - getModelSchemaRef, - patch, - put, - del, - requestBody, -} from '@loopback/rest'; -import {CONTENT_TYPE, STATUS_CODE} from '@sourceloop/core'; -import {authenticate, STRATEGY} from 'loopback4-authentication'; -import {authorize} from 'loopback4-authorization'; -import {PermissionKey} from '../enums/permission.enum'; -import {ToDo} from '../models'; -import {ToDoRepository} from '../repositories'; - -const base = '/to-dos'; -export class ToDoController { - constructor( - @repository(ToDoRepository) - public toDoRepository: ToDoRepository, - ) {} - - @authenticate(STRATEGY.BEARER) - @authorize({permissions: [PermissionKey.CreateTodo]}) - @post(base, { - responses: { - [STATUS_CODE.OK]: { - description: 'ToDo model instance', - content: {[CONTENT_TYPE.JSON]: {schema: getModelSchemaRef(ToDo)}}, - }, - }, - }) - async create( - @requestBody({ - content: { - [CONTENT_TYPE.JSON]: { - schema: getModelSchemaRef(ToDo, { - title: 'NewToDo', - exclude: ['id'], - }), - }, - }, - }) - toDo: Omit, - ): Promise { - return this.toDoRepository.create(toDo); - } - - @authenticate(STRATEGY.BEARER) - @authorize({permissions: ['*']}) - @get('/to-dos/count', { - responses: { - [STATUS_CODE.OK]: { - description: 'ToDo model count', - content: {[CONTENT_TYPE.JSON]: {schema: CountSchema}}, - }, - }, - }) - async count(@param.where(ToDo) where?: Where): Promise { - return this.toDoRepository.count(where); - } - - @authenticate(STRATEGY.BEARER) - @authorize({permissions: ['*']}) - @get(base, { - responses: { - [STATUS_CODE.OK]: { - description: 'Array of ToDo model instances', - content: { - [CONTENT_TYPE.JSON]: { - schema: { - type: 'array', - items: getModelSchemaRef(ToDo, {includeRelations: true}), - }, - }, - }, - }, - }, - }) - async find(@param.filter(ToDo) filter?: Filter): Promise { - return this.toDoRepository.find(filter); - } - - @authenticate(STRATEGY.BEARER) - @authorize({permissions: [PermissionKey.UpdateTodo]}) - @patch(base, { - responses: { - [STATUS_CODE.OK]: { - description: 'ToDo PATCH success count', - content: {[CONTENT_TYPE.JSON]: {schema: CountSchema}}, - }, - }, - }) - async updateAll( - @requestBody({ - content: { - [CONTENT_TYPE.JSON]: { - schema: getModelSchemaRef(ToDo, {partial: true}), - }, - }, - }) - toDo: ToDo, - @param.where(ToDo) where?: Where, - ): Promise { - return this.toDoRepository.updateAll(toDo, where); - } - - @authenticate(STRATEGY.BEARER) - @authorize({permissions: ['*']}) - @get(`${base}/{id}`, { - responses: { - [STATUS_CODE.OK]: { - description: 'ToDo model instance', - content: { - [CONTENT_TYPE.JSON]: { - schema: getModelSchemaRef(ToDo, {includeRelations: true}), - }, - }, - }, - }, - }) - async findById( - @param.path.string('id') id: string, - @param.filter(ToDo, {exclude: 'where'}) filter?: FilterExcludingWhere, - ): Promise { - return this.toDoRepository.findById(id, filter); - } - - @authenticate(STRATEGY.BEARER) - @authorize({permissions: [PermissionKey.UpdateTodo]}) - @patch(`${base}/{id}`, { - responses: { - [STATUS_CODE.NO_CONTENT]: { - description: 'ToDo PATCH success', - }, - }, - }) - async updateById( - @param.path.string('id') id: string, - @requestBody({ - content: { - [CONTENT_TYPE.JSON]: { - schema: getModelSchemaRef(ToDo, {partial: true}), - }, - }, - }) - toDo: ToDo, - ): Promise { - await this.toDoRepository.updateById(id, toDo); - } - - @authenticate(STRATEGY.BEARER) - @authorize({permissions: [PermissionKey.UpdateTodo]}) - @put(`${base}/{id}`, { - responses: { - [STATUS_CODE.NO_CONTENT]: { - description: 'ToDo PUT success', - }, - }, - }) - async replaceById( - @param.path.string('id') id: string, - @requestBody() toDo: ToDo, - ): Promise { - await this.toDoRepository.replaceById(id, toDo); - } - - @authenticate(STRATEGY.BEARER) - @authorize({permissions: [PermissionKey.DeleteTodo]}) - @del(`${base}/{id}`, { - responses: { - [STATUS_CODE.NO_CONTENT]: { - description: 'ToDo DELETE success', - }, - }, - }) - async deleteById(@param.path.string('id') id: string): Promise { - await this.toDoRepository.deleteById(id); - } -} diff --git a/sandbox/auth-ms-basic-example/src/datasources/auth-cache.datasource.ts b/sandbox/auth-ms-basic-example/src/datasources/auth-cache.datasource.ts deleted file mode 100644 index c687ce814a..0000000000 --- a/sandbox/auth-ms-basic-example/src/datasources/auth-cache.datasource.ts +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2023 Sourcefuse Technologies -// -// This software is released under the MIT License. -// https://opensource.org/licenses/MIT -import {inject, lifeCycleObserver, LifeCycleObserver} from '@loopback/core'; -import {juggler} from '@loopback/repository'; -import {AuthCacheSourceName} from '@sourceloop/authentication-service'; - -const config = { - name: AuthCacheSourceName, - connector: 'kv-redis', - url: process.env.REDIS_URL, - host: process.env.REDIS_HOST, - port: process.env.REDIS_PORT, - password: process.env.REDIS_PASSWORD, - db: process.env.REDIS_DB, -}; - -// Observe application's life cycle to disconnect the datasource when -// application is stopped. This allows the application to be shut down -// gracefully. The `stop()` method is inherited from `juggler.DataSource`. -// Learn more at https://loopback.io/doc/en/lb4/Life-cycle.html -@lifeCycleObserver('datasource') -export class AuthCacheDataSource - extends juggler.DataSource - implements LifeCycleObserver -{ - static readonly dataSourceName = AuthCacheSourceName; - static readonly defaultConfig = config; - - constructor( - @inject('datasources.config.AuthCache', {optional: true}) - dsConfig: object = config, - ) { - super(dsConfig); - } -} diff --git a/sandbox/auth-ms-basic-example/src/datasources/auth-db.datasource.ts b/sandbox/auth-ms-basic-example/src/datasources/auth-db.datasource.ts deleted file mode 100644 index 86d8c55e98..0000000000 --- a/sandbox/auth-ms-basic-example/src/datasources/auth-db.datasource.ts +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright (c) 2023 Sourcefuse Technologies -// -// This software is released under the MIT License. -// https://opensource.org/licenses/MIT -import {inject, lifeCycleObserver, LifeCycleObserver} from '@loopback/core'; -import {juggler} from '@loopback/repository'; -import {AuthDbSourceName} from '@sourceloop/authentication-service'; - -const config = { - name: AuthDbSourceName, - connector: 'postgresql', - // url: '', - host: process.env.DB_HOST, - port: process.env.DB_PORT, - user: process.env.DB_USER, - password: process.env.DB_PASSWORD, - database: process.env.DB_DATABASE, - schema: 'main', -}; - -// Observe application's life cycle to disconnect the datasource when -// application is stopped. This allows the application to be shut down -// gracefully. The `stop()` method is inherited from `juggler.DataSource`. -// Learn more at https://loopback.io/doc/en/lb4/Life-cycle.html -@lifeCycleObserver('datasource') -export class AuthDbDataSource - extends juggler.DataSource - implements LifeCycleObserver -{ - static readonly dataSourceName = AuthDbSourceName; - static readonly defaultConfig = config; - - constructor( - @inject('datasources.config.AuthDB', {optional: true}) - dsConfig: object = config, - ) { - super(dsConfig); - } -} diff --git a/sandbox/auth-ms-basic-example/src/datasources/index.ts b/sandbox/auth-ms-basic-example/src/datasources/index.ts deleted file mode 100644 index ca4fd83cac..0000000000 --- a/sandbox/auth-ms-basic-example/src/datasources/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -// Copyright (c) 2023 Sourcefuse Technologies -// -// This software is released under the MIT License. -// https://opensource.org/licenses/MIT -export * from './auth-db.datasource'; -export * from './auth-cache.datasource'; diff --git a/sandbox/auth-ms-basic-example/src/enums/permission.enum.ts b/sandbox/auth-ms-basic-example/src/enums/permission.enum.ts deleted file mode 100644 index d3b28bcf9c..0000000000 --- a/sandbox/auth-ms-basic-example/src/enums/permission.enum.ts +++ /dev/null @@ -1,9 +0,0 @@ -// Copyright (c) 2023 Sourcefuse Technologies -// -// This software is released under the MIT License. -// https://opensource.org/licenses/MIT -export declare const enum PermissionKey { - CreateTodo = 'CreateTodo', - UpdateTodo = 'UpdateTodo', - DeleteTodo = 'DeleteTodo', -} diff --git a/sandbox/auth-ms-basic-example/src/migrate.ts b/sandbox/auth-ms-basic-example/src/migrate.ts deleted file mode 100644 index c904ba9d97..0000000000 --- a/sandbox/auth-ms-basic-example/src/migrate.ts +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright (c) 2023 Sourcefuse Technologies -// -// This software is released under the MIT License. -// https://opensource.org/licenses/MIT -import {AuthMultitenantExampleApplication} from './application'; - -export async function migrate(args: string[]) { - const existingSchema = args.includes('--rebuild') ? 'drop' : 'alter'; - console.log('Migrating schemas (%s existing schema)', existingSchema); //NOSONAR - - const app = new AuthMultitenantExampleApplication(); - await app.boot(); - await app.migrateSchema({existingSchema}); - - // Connectors usually keep a pool of opened connections, - // this keeps the process running even after all work is done. - // We need to exit explicitly. - process.exit(0); -} - -migrate(process.argv).catch(err => { - console.error('Cannot migrate database schema', err); //NOSONAR - process.exit(1); -}); diff --git a/sandbox/auth-ms-basic-example/src/openapi-spec.ts b/sandbox/auth-ms-basic-example/src/openapi-spec.ts deleted file mode 100644 index c726b43589..0000000000 --- a/sandbox/auth-ms-basic-example/src/openapi-spec.ts +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright (c) 2023 Sourcefuse Technologies -// -// This software is released under the MIT License. -// https://opensource.org/licenses/MIT -import {ApplicationConfig} from '@loopback/core'; -import {AuthMultitenantExampleApplication} from './application'; - -/** - * Export the OpenAPI spec from the application - */ - -const PORT = 3000; -const FILEARG = 2; -async function exportOpenApiSpec(): Promise { - const config: ApplicationConfig = { - rest: { - port: +(process.env.PORT ?? PORT), - host: process.env.HOST ?? 'localhost', - }, - }; - const outFile = process.argv[FILEARG] ?? ''; - const app = new AuthMultitenantExampleApplication(config); - await app.boot(); - await app.exportOpenApiSpec(outFile); -} - -exportOpenApiSpec().catch(err => { - console.error('Fail to export OpenAPI spec from the application.', err); //NOSONAR - process.exit(1); -}); diff --git a/sandbox/auth-ms-basic-example/src/providers/azure-ad-signup.provider.ts b/sandbox/auth-ms-basic-example/src/providers/azure-ad-signup.provider.ts deleted file mode 100644 index b5bb94e65a..0000000000 --- a/sandbox/auth-ms-basic-example/src/providers/azure-ad-signup.provider.ts +++ /dev/null @@ -1,82 +0,0 @@ -import {Provider} from '@loopback/context'; -import {repository} from '@loopback/repository'; -import {HttpErrors} from '@loopback/rest'; -import { - AuthClientRepository, - AzureAdSignUpFn, - User, - UserRelations, -} from '@sourceloop/authentication-service'; -import { - RoleRepository, - TenantRepository, - UserRepository, -} from '../repositories'; - -export class AzureAdSignupProvider implements Provider { - constructor( - @repository(RoleRepository) - private readonly roleRepo: RoleRepository, - @repository(TenantRepository) - private readonly tenantRepo: TenantRepository, - @repository(AuthClientRepository) - private readonly authClientRepo: AuthClientRepository, - @repository(UserRepository) - private readonly userRepo: UserRepository, - ) {} - - value(): AzureAdSignUpFn { - return async profile => { - const [tenant, role, client] = await Promise.all([ - this.tenantRepo.findOne({ - where: { - key: 'master', - }, - }), - this.roleRepo.findOne({ - where: { - roleType: 0, - }, - }), - this.authClientRepo.findOne({ - where: { - clientId: 'test_client_id', - }, - }), - ]); - - // check if user exist - - const userExists = await this.userRepo.findOne({ - where: { - or: [{username: profile.upn}, {email: profile.upn}], - }, - }); - if (userExists) { - throw new HttpErrors.BadRequest('User already exists'); - } - - const user = await this.userRepo.createWithoutPassword({ - firstName: profile.name!.givenName, - lastName: profile.name!.familyName, - username: profile.upn, - email: profile.upn, - defaultTenantId: tenant?.id, - authClientIds: `{${client?.id}}`, - }); - - await this.userRepo.credentials(user.id).create({ - userId: user.id, - authProvider: 'azure', - authId: profile.oid, - }); - - await this.userRepo.userTenants(user.id).create({ - userId: user.id, - tenantId: tenant?.id, - roleId: role?.id, - }); - return user as User & UserRelations; - }; - } -} diff --git a/sandbox/auth-ms-basic-example/src/providers/index.ts b/sandbox/auth-ms-basic-example/src/providers/index.ts deleted file mode 100644 index db8e6dd9b2..0000000000 --- a/sandbox/auth-ms-basic-example/src/providers/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './azure-ad-signup.provider'; diff --git a/sandbox/auth-ms-basic-example/src/repositories/README.md b/sandbox/auth-ms-basic-example/src/repositories/README.md deleted file mode 100644 index 08638a7878..0000000000 --- a/sandbox/auth-ms-basic-example/src/repositories/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Repositories - -This directory contains code for repositories provided by this app. diff --git a/sandbox/auth-ms-basic-example/src/repositories/index.ts b/sandbox/auth-ms-basic-example/src/repositories/index.ts deleted file mode 100644 index e3e7cf0dfa..0000000000 --- a/sandbox/auth-ms-basic-example/src/repositories/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright (c) 2023 Sourcefuse Technologies -// -// This software is released under the MIT License. -// https://opensource.org/licenses/MIT -export * from './to-do.repository'; -export * from './role.repository'; -export * from './tenant.repository'; -export * from './user.repository'; diff --git a/sandbox/auth-ms-basic-example/src/repositories/role.repository.ts b/sandbox/auth-ms-basic-example/src/repositories/role.repository.ts deleted file mode 100644 index af957b25ec..0000000000 --- a/sandbox/auth-ms-basic-example/src/repositories/role.repository.ts +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright (c) 2023 Sourcefuse Technologies -// -// This software is released under the MIT License. -// https://opensource.org/licenses/MIT -import {inject} from '@loopback/core'; -import {juggler} from '@loopback/repository'; -import {DefaultSoftCrudRepository} from '@sourceloop/core'; -import {AuthDbSourceName, Role} from '@sourceloop/authentication-service'; - -export class RoleRepository extends DefaultSoftCrudRepository< - Role, - typeof Role.prototype.id -> { - constructor( - @inject(`datasources.${AuthDbSourceName}`) - dataSource: juggler.DataSource, - ) { - super(Role, dataSource); - } -} diff --git a/sandbox/auth-ms-basic-example/src/repositories/tenant.repository.ts b/sandbox/auth-ms-basic-example/src/repositories/tenant.repository.ts deleted file mode 100644 index 0e13056fb6..0000000000 --- a/sandbox/auth-ms-basic-example/src/repositories/tenant.repository.ts +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (c) 2023 Sourcefuse Technologies -// -// This software is released under the MIT License. -// https://opensource.org/licenses/MIT -import {Getter, inject} from '@loopback/core'; -import { - HasManyRepositoryFactory, - juggler, - repository, -} from '@loopback/repository'; -import {DefaultSoftCrudRepository} from '@sourceloop/core'; -import { - AuthDbSourceName, - Tenant, - TenantConfig, - TenantConfigRepository, -} from '@sourceloop/authentication-service'; - -export class TenantRepository extends DefaultSoftCrudRepository< - Tenant, - typeof Tenant.prototype.id -> { - public readonly tenantConfigs: HasManyRepositoryFactory< - TenantConfig, - typeof Tenant.prototype.id - >; - - constructor( - @inject(`datasources.${AuthDbSourceName}`) dataSource: juggler.DataSource, - @repository.getter('TenantConfigRepository') - protected tenantConfigRepositoryGetter: Getter, - ) { - super(Tenant, dataSource); - this.tenantConfigs = this.createHasManyRepositoryFactoryFor( - 'tenantConfigs', - tenantConfigRepositoryGetter, - ); - this.registerInclusionResolver( - 'tenantConfigs', - this.tenantConfigs.inclusionResolver, - ); - } -} diff --git a/sandbox/auth-ms-basic-example/src/repositories/to-do.repository.ts b/sandbox/auth-ms-basic-example/src/repositories/to-do.repository.ts deleted file mode 100644 index b7b37b0353..0000000000 --- a/sandbox/auth-ms-basic-example/src/repositories/to-do.repository.ts +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright (c) 2023 Sourcefuse Technologies -// -// This software is released under the MIT License. -// https://opensource.org/licenses/MIT -import {inject} from '@loopback/core'; -import {DefaultCrudRepository} from '@loopback/repository'; -import {AuthDbSourceName} from '@sourceloop/authentication-service'; -import {AuthDbDataSource} from '../datasources'; -import {ToDo} from '../models'; - -export class ToDoRepository extends DefaultCrudRepository< - ToDo, - typeof ToDo.prototype.id -> { - constructor( - @inject(`datasources.${AuthDbSourceName}`) dataSource: AuthDbDataSource, - ) { - super(ToDo, dataSource); - } -} diff --git a/sandbox/auth-ms-basic-example/src/repositories/user.repository.ts b/sandbox/auth-ms-basic-example/src/repositories/user.repository.ts deleted file mode 100644 index c112a4f670..0000000000 --- a/sandbox/auth-ms-basic-example/src/repositories/user.repository.ts +++ /dev/null @@ -1,239 +0,0 @@ -import {Getter, inject} from '@loopback/core'; -import { - BelongsToAccessor, - DataObject, - HasManyRepositoryFactory, - HasOneRepositoryFactory, - Options, - juggler, - repository, -} from '@loopback/repository'; -import {HttpErrors} from '@loopback/rest'; -import { - AuthDbSourceName, - OtpRepository, - Tenant, - TenantRepository, - User, - UserCredentials, - UserCredentialsRepository, - UserRelations, - UserTenant, - UserTenantRepository, -} from '@sourceloop/authentication-service'; -import { - AuthProvider, - AuthenticateErrorKeys, - DefaultSoftCrudRepository, - ILogger, - LOGGER, - UserStatus, -} from '@sourceloop/core'; -import * as bcrypt from 'bcrypt'; -import {AuthErrorKeys} from 'loopback4-authentication'; - -const saltRounds = 10; - -export class UserRepository extends DefaultSoftCrudRepository< - User, - typeof User.prototype.id, - UserRelations -> { - public readonly credentials: HasOneRepositoryFactory< - UserCredentials, - typeof User.prototype.id - >; - public readonly tenant: BelongsToAccessor; - - public readonly userTenants: HasManyRepositoryFactory< - UserTenant, - typeof User.prototype.id - >; - - constructor( - @inject(`datasources.${AuthDbSourceName}`) - dataSource: juggler.DataSource, - @repository.getter(UserCredentialsRepository) - getUserCredsRepository: Getter, - @repository.getter(OtpRepository) - public getOtpRepository: Getter, - @repository.getter('TenantRepository') - protected tenantRepositoryGetter: Getter, - @repository.getter('UserTenantRepository') - protected userTenantRepositoryGetter: Getter, - @inject(LOGGER.LOGGER_INJECT) private readonly logger: ILogger, - ) { - super(User, dataSource); - this.userTenants = this.createHasManyRepositoryFactoryFor( - 'userTenants', - userTenantRepositoryGetter, - ); - this.registerInclusionResolver( - 'userTenants', - this.userTenants.inclusionResolver, - ); - this.tenant = this.createBelongsToAccessorFor( - 'defaultTenant', - tenantRepositoryGetter, - ); - this.registerInclusionResolver( - 'defaultTenant', - this.tenant.inclusionResolver, - ); - - this.credentials = this.createHasOneRepositoryFactoryFor( - 'credentials', - getUserCredsRepository, - ); - this.registerInclusionResolver( - 'credentials', - this.credentials.inclusionResolver, - ); - } - - async create(entity: DataObject, options?: Options): Promise { - const user = await super.create(entity, options); - try { - // Add temporary password for first time - const password = (await bcrypt.hash( - process.env.USER_TEMP_PASSWORD as string, - saltRounds, - )) as string; - const creds = new UserCredentials({ - authProvider: 'internal', - password, - }); - await this.credentials(user.id).create(creds); - } catch (err) { - throw new HttpErrors.UnprocessableEntity('Error while hashing password'); - } - return user; - } - - async createWithoutPassword( - entity: DataObject, - options?: Options, - ): Promise { - return super.create(entity, options); - } - - async verifyPassword(username: string, password: string): Promise { - const user = await super.findOne({ - where: {username: username.toLowerCase()}, - }); - const creds = user && (await this.credentials(user.id).get()); - if (!user || user.deleted) { - throw new HttpErrors.Unauthorized(AuthenticateErrorKeys.UserDoesNotExist); - } else if ( - !creds?.password || - creds.authProvider !== AuthProvider.INTERNAL || - !(await bcrypt.compare(password, creds.password)) - ) { - this.logger.error('User creds not found in DB or is invalid'); - throw new HttpErrors.Unauthorized(AuthErrorKeys.InvalidCredentials); - } else { - return user; - } - } - - async updatePassword( - username: string, - password: string, - newPassword: string, - ): Promise { - const user = await super.findOne({where: {username}}); - const creds = user && (await this.credentials(user.id).get()); - if ((!user || user.deleted) ?? !creds?.password) { - throw new HttpErrors.Unauthorized(AuthenticateErrorKeys.UserDoesNotExist); - } else if (creds.authProvider !== AuthProvider.INTERNAL) { - throw new HttpErrors.BadRequest( - AuthenticateErrorKeys.PasswordCannotBeChanged, - ); - } else if (!(await bcrypt.compare(password, creds.password))) { - throw new HttpErrors.Unauthorized(AuthErrorKeys.WrongPassword); - } else if (await bcrypt.compare(newPassword, creds.password)) { - throw new HttpErrors.Unauthorized( - 'Password cannot be same as previous password!', - ); - } else { - // Do nothing - } - await this.credentials(user.id).patch({ - password: await bcrypt.hash(newPassword, saltRounds), - }); - return user; - } - - async changePassword( - username: string, - newPassword: string, - oldPassword?: string, - ): Promise { - const user = await super.findOne({where: {username}}); - const creds = user && (await this.credentials(user.id).get()); - - if (oldPassword) { - // This method considers old password as OTP - const otp = await (await this.getOtpRepository()).get(username); - if (!otp || otp.otp !== oldPassword) { - throw new HttpErrors.Unauthorized(AuthErrorKeys.WrongPassword); - } - } - - if (creds?.authProvider !== AuthProvider.INTERNAL) { - throw new HttpErrors.Unauthorized( - AuthenticateErrorKeys.PasswordCannotBeChanged, - ); - } - if ((!user || user.deleted) ?? !creds?.password) { - throw new HttpErrors.Unauthorized(AuthenticateErrorKeys.UserDoesNotExist); - } else if (await bcrypt.compare(newPassword, creds.password)) { - throw new HttpErrors.Unauthorized( - 'Password cannot be same as previous password!', - ); - } else { - // DO nothing - } - await this.credentials(user.id).patch({ - password: await bcrypt.hash(newPassword, saltRounds), - }); - return user; - } - - async updateLastLogin(userId: string): Promise { - await super.updateById( - userId, - { - lastLogin: Date.now(), - }, - { - currentUser: {id: userId}, - }, - ); - } - - async firstTimeUser(userId: string): Promise { - const user = await super.findOne({ - where: { - id: userId, - }, - }); - - if (!user) { - throw new HttpErrors.NotFound(AuthenticateErrorKeys.UserDoesNotExist); - } - - const userTenant = await ( - await this.userTenantRepositoryGetter() - ).findOne({ - where: { - userId, - tenantId: user.defaultTenantId, - status: { - inq: [UserStatus.REGISTERED, UserStatus.PASSWORD_CHANGE_NEEDED], - }, - }, - }); - return !!userTenant; - } -} diff --git a/sandbox/auth-ms-basic-example/src/sequence.ts b/sandbox/auth-ms-basic-example/src/sequence.ts deleted file mode 100644 index 5951f0e25a..0000000000 --- a/sandbox/auth-ms-basic-example/src/sequence.ts +++ /dev/null @@ -1,7 +0,0 @@ -// Copyright (c) 2023 Sourcefuse Technologies -// -// This software is released under the MIT License. -// https://opensource.org/licenses/MIT -import {MiddlewareSequence} from '@loopback/rest'; - -export class MySequence extends MiddlewareSequence {} diff --git a/sandbox/auth-ms-basic-example/src/types.ts b/sandbox/auth-ms-basic-example/src/types.ts deleted file mode 100644 index 686dcd7f83..0000000000 --- a/sandbox/auth-ms-basic-example/src/types.ts +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright (c) 2023 Sourcefuse Technologies -// -// This software is released under the MIT License. -// https://opensource.org/licenses/MIT -import {RoleTypes} from '@sourceloop/core'; -import {IAuthUser} from 'loopback4-authentication'; - -export interface UserWithPermissions - extends IAuthUser { - id?: string; - identifier?: ID; - permissions: string[]; - authClientId: number; - email?: string; - role: string; - firstName: string; - lastName: string; - middleName?: string; - tenantId?: TID; - userTenantId?: UTID; - passwordExpiryTime?: Date; -} - -export interface RoleTypeMapValue { - permissionKey: string; - value: number; -} - -export const RoleTypeMap: { - [key in RoleTypes]: RoleTypeMapValue; -} = { - [RoleTypes.Admin]: { - permissionKey: 'PlatformAdmin', - value: RoleTypes.Admin, - }, - [RoleTypes.Others]: { - permissionKey: 'Others', - value: RoleTypes.Others, - }, -}; From 33546ce06cdbbfc23198163d53b2864b30d1a562 Mon Sep 17 00:00:00 2001 From: Tyagi-Sunny Date: Tue, 28 Jan 2025 21:47:12 +0530 Subject: [PATCH 2/3] refactor(sandbox): refactor auth ms basic example refactor auth ms basic example g --- .../Dockerfile | 88 ------- .../src/providers/index.ts | 2 - .../.dockerignore | 0 .../.env.defaults | 0 .../.env.example | 0 .../.eslintignore | 3 +- .../.eslintrc.js | 4 +- .../.gitignore | 0 .../.mocharc.json | 0 .../.nycrc | 0 .../.prettierignore | 0 .../.prettierrc | 0 .../.vscode/launch.json | 0 .../.vscode/settings.json | 0 .../.vscode/tasks.json | 0 .../.yo-rc.json | 0 .../DEVELOPING.md | 0 .../README.md | 0 .../migrations/20210318100600-init.js | 0 .../20220607063927-secret-key-column.js | 0 .../migrations/20221110095658-updated-init.js | 0 .../20230323132703-client-type-column.js | 0 .../20230524115047-login-activity.js | 0 .../20240116123737-sync-with-user-tenant.js | 0 .../20241105074844-add-jwt-keys-schema.js | 0 .../migrations/database.json | 0 .../sqls/20210318100600-init-down.sql | 0 .../sqls/20210318100600-init-up.sql | 0 .../20220607063927-secret-key-column-down.sql | 0 .../20220607063927-secret-key-column-up.sql | 0 .../sqls/20221110095658-updated-init-down.sql | 0 .../sqls/20221110095658-updated-init-up.sql | 0 ...20230323132703-client-type-column-down.sql | 0 .../20230323132703-client-type-column-up.sql | 0 .../20230524115047-login-activity-down.sql | 0 .../sqls/20230524115047-login-activity-up.sql | 0 ...40116123737-sync-with-user-tenant-down.sql | 0 ...0240116123737-sync-with-user-tenant-up.sql | 0 ...0241105074844-add-jwt-keys-schema-down.sql | 0 .../20241105074844-add-jwt-keys-schema-up.sql | 0 .../assets/MaterialIcons-Regular.woff | Bin 0 -> 57620 bytes .../assets/MaterialIcons-Regular.woff2 | Bin 0 -> 44300 bytes .../mochawesome-report/assets/app.css | 14 ++ .../mochawesome-report/assets/app.js | 2 + .../assets/app.js.LICENSE.txt | 55 ++++ .../assets/roboto-light-webfont.woff | Bin 0 -> 25772 bytes .../assets/roboto-light-webfont.woff2 | Bin 0 -> 19508 bytes .../assets/roboto-medium-webfont.woff | Bin 0 -> 26292 bytes .../assets/roboto-medium-webfont.woff2 | Bin 0 -> 19944 bytes .../assets/roboto-regular-webfont.woff | Bin 0 -> 26280 bytes .../assets/roboto-regular-webfont.woff2 | Bin 0 -> 19868 bytes .../mochawesome-report/mochawesome.html | 2 + .../mochawesome-report/mochawesome.json | 234 ++++++++++++++++++ .../package.json | 0 .../public/index.html | 0 .../src/__tests__/README.md | 0 .../acceptance/home-page.acceptance.ts | 0 .../acceptance/ping.controller.acceptance.ts | 0 .../src/__tests__/acceptance/test-helper.ts | 30 ++- .../src/application.ts | 75 +++--- .../src/controllers/README.md | 0 .../src/controllers/home-page.controller.ts | 9 +- .../src/controllers/index.ts | 0 .../src/controllers/ping.controller.ts | 11 +- .../src/datasources/README.md | 0 .../src/datasources/auth.datasource.ts | 20 +- .../src/datasources/index.ts | 0 .../src/datasources/redis.datasource.ts | 6 +- .../src/index.ts | 5 +- .../src/models/README.md | 0 .../src/models/index.ts | 0 .../src/models/to-do.model.ts | 0 .../src/models/user.dto.ts | 0 .../src/openapi-spec.ts | 8 +- .../src/openapi.json | 0 .../src/opentelemetry-registry.ts | 10 +- .../src/providers/index.ts | 2 + .../src/providers/local-signup.provider.ts | 2 - .../signup-token-handler.provider.ts | 8 +- .../src/services/index.ts | 0 .../src/services/user-ops.service.ts | 143 ++++++----- .../tsconfig.json | 0 82 files changed, 484 insertions(+), 249 deletions(-) delete mode 100755 sandbox/auth-basic-login-signup-example/Dockerfile delete mode 100755 sandbox/auth-basic-login-signup-example/src/providers/index.ts rename sandbox/{auth-basic-login-signup-example => auth-ms-basic-example}/.dockerignore (100%) rename sandbox/{auth-basic-login-signup-example => auth-ms-basic-example}/.env.defaults (100%) rename sandbox/{auth-basic-login-signup-example => auth-ms-basic-example}/.env.example (100%) rename sandbox/{auth-basic-login-signup-example => auth-ms-basic-example}/.eslintignore (58%) rename sandbox/{auth-basic-login-signup-example => auth-ms-basic-example}/.eslintrc.js (88%) rename sandbox/{auth-basic-login-signup-example => auth-ms-basic-example}/.gitignore (100%) rename sandbox/{auth-basic-login-signup-example => auth-ms-basic-example}/.mocharc.json (100%) rename sandbox/{auth-basic-login-signup-example => auth-ms-basic-example}/.nycrc (100%) rename sandbox/{auth-basic-login-signup-example => auth-ms-basic-example}/.prettierignore (100%) rename sandbox/{auth-basic-login-signup-example => auth-ms-basic-example}/.prettierrc (100%) rename sandbox/{auth-basic-login-signup-example => auth-ms-basic-example}/.vscode/launch.json (100%) rename sandbox/{auth-basic-login-signup-example => auth-ms-basic-example}/.vscode/settings.json (100%) rename sandbox/{auth-basic-login-signup-example => auth-ms-basic-example}/.vscode/tasks.json (100%) rename sandbox/{auth-basic-login-signup-example => auth-ms-basic-example}/.yo-rc.json (100%) rename sandbox/{auth-basic-login-signup-example => auth-ms-basic-example}/DEVELOPING.md (100%) rename sandbox/{auth-basic-login-signup-example => auth-ms-basic-example}/README.md (100%) rename sandbox/{auth-basic-login-signup-example => auth-ms-basic-example}/migrations/20210318100600-init.js (100%) rename sandbox/{auth-basic-login-signup-example => auth-ms-basic-example}/migrations/20220607063927-secret-key-column.js (100%) rename sandbox/{auth-basic-login-signup-example => auth-ms-basic-example}/migrations/20221110095658-updated-init.js (100%) rename sandbox/{auth-basic-login-signup-example => auth-ms-basic-example}/migrations/20230323132703-client-type-column.js (100%) rename sandbox/{auth-basic-login-signup-example => auth-ms-basic-example}/migrations/20230524115047-login-activity.js (100%) rename sandbox/{auth-basic-login-signup-example => auth-ms-basic-example}/migrations/20240116123737-sync-with-user-tenant.js (100%) rename sandbox/{auth-basic-login-signup-example => auth-ms-basic-example}/migrations/20241105074844-add-jwt-keys-schema.js (100%) rename sandbox/{auth-basic-login-signup-example => auth-ms-basic-example}/migrations/database.json (100%) rename sandbox/{auth-basic-login-signup-example => auth-ms-basic-example}/migrations/sqls/20210318100600-init-down.sql (100%) rename sandbox/{auth-basic-login-signup-example => auth-ms-basic-example}/migrations/sqls/20210318100600-init-up.sql (100%) rename sandbox/{auth-basic-login-signup-example => auth-ms-basic-example}/migrations/sqls/20220607063927-secret-key-column-down.sql (100%) rename sandbox/{auth-basic-login-signup-example => auth-ms-basic-example}/migrations/sqls/20220607063927-secret-key-column-up.sql (100%) rename sandbox/{auth-basic-login-signup-example => auth-ms-basic-example}/migrations/sqls/20221110095658-updated-init-down.sql (100%) rename sandbox/{auth-basic-login-signup-example => auth-ms-basic-example}/migrations/sqls/20221110095658-updated-init-up.sql (100%) rename sandbox/{auth-basic-login-signup-example => auth-ms-basic-example}/migrations/sqls/20230323132703-client-type-column-down.sql (100%) rename sandbox/{auth-basic-login-signup-example => auth-ms-basic-example}/migrations/sqls/20230323132703-client-type-column-up.sql (100%) rename sandbox/{auth-basic-login-signup-example => auth-ms-basic-example}/migrations/sqls/20230524115047-login-activity-down.sql (100%) rename sandbox/{auth-basic-login-signup-example => auth-ms-basic-example}/migrations/sqls/20230524115047-login-activity-up.sql (100%) rename sandbox/{auth-basic-login-signup-example => auth-ms-basic-example}/migrations/sqls/20240116123737-sync-with-user-tenant-down.sql (100%) rename sandbox/{auth-basic-login-signup-example => auth-ms-basic-example}/migrations/sqls/20240116123737-sync-with-user-tenant-up.sql (100%) rename sandbox/{auth-basic-login-signup-example => auth-ms-basic-example}/migrations/sqls/20241105074844-add-jwt-keys-schema-down.sql (100%) rename sandbox/{auth-basic-login-signup-example => auth-ms-basic-example}/migrations/sqls/20241105074844-add-jwt-keys-schema-up.sql (100%) create mode 100644 sandbox/auth-ms-basic-example/mochawesome-report/assets/MaterialIcons-Regular.woff create mode 100644 sandbox/auth-ms-basic-example/mochawesome-report/assets/MaterialIcons-Regular.woff2 create mode 100644 sandbox/auth-ms-basic-example/mochawesome-report/assets/app.css create mode 100644 sandbox/auth-ms-basic-example/mochawesome-report/assets/app.js create mode 100644 sandbox/auth-ms-basic-example/mochawesome-report/assets/app.js.LICENSE.txt create mode 100644 sandbox/auth-ms-basic-example/mochawesome-report/assets/roboto-light-webfont.woff create mode 100644 sandbox/auth-ms-basic-example/mochawesome-report/assets/roboto-light-webfont.woff2 create mode 100644 sandbox/auth-ms-basic-example/mochawesome-report/assets/roboto-medium-webfont.woff create mode 100644 sandbox/auth-ms-basic-example/mochawesome-report/assets/roboto-medium-webfont.woff2 create mode 100644 sandbox/auth-ms-basic-example/mochawesome-report/assets/roboto-regular-webfont.woff create mode 100644 sandbox/auth-ms-basic-example/mochawesome-report/assets/roboto-regular-webfont.woff2 create mode 100644 sandbox/auth-ms-basic-example/mochawesome-report/mochawesome.html create mode 100644 sandbox/auth-ms-basic-example/mochawesome-report/mochawesome.json rename sandbox/{auth-basic-login-signup-example => auth-ms-basic-example}/package.json (100%) rename sandbox/{auth-basic-login-signup-example => auth-ms-basic-example}/public/index.html (100%) rename sandbox/{auth-basic-login-signup-example => auth-ms-basic-example}/src/__tests__/README.md (100%) rename sandbox/{auth-basic-login-signup-example => auth-ms-basic-example}/src/__tests__/acceptance/home-page.acceptance.ts (100%) rename sandbox/{auth-basic-login-signup-example => auth-ms-basic-example}/src/__tests__/acceptance/ping.controller.acceptance.ts (100%) rename sandbox/{auth-basic-login-signup-example => auth-ms-basic-example}/src/__tests__/acceptance/test-helper.ts (73%) rename sandbox/{auth-basic-login-signup-example => auth-ms-basic-example}/src/application.ts (74%) rename sandbox/{auth-basic-login-signup-example => auth-ms-basic-example}/src/controllers/README.md (100%) rename sandbox/{auth-basic-login-signup-example => auth-ms-basic-example}/src/controllers/home-page.controller.ts (87%) rename sandbox/{auth-basic-login-signup-example => auth-ms-basic-example}/src/controllers/index.ts (100%) rename sandbox/{auth-basic-login-signup-example => auth-ms-basic-example}/src/controllers/ping.controller.ts (87%) rename sandbox/{auth-basic-login-signup-example => auth-ms-basic-example}/src/datasources/README.md (100%) rename sandbox/{auth-basic-login-signup-example => auth-ms-basic-example}/src/datasources/auth.datasource.ts (84%) rename sandbox/{auth-basic-login-signup-example => auth-ms-basic-example}/src/datasources/index.ts (100%) rename sandbox/{auth-basic-login-signup-example => auth-ms-basic-example}/src/datasources/redis.datasource.ts (94%) rename sandbox/{auth-basic-login-signup-example => auth-ms-basic-example}/src/index.ts (92%) rename sandbox/{auth-basic-login-signup-example => auth-ms-basic-example}/src/models/README.md (100%) rename sandbox/{auth-basic-login-signup-example => auth-ms-basic-example}/src/models/index.ts (100%) rename sandbox/{auth-basic-login-signup-example => auth-ms-basic-example}/src/models/to-do.model.ts (100%) rename sandbox/{auth-basic-login-signup-example => auth-ms-basic-example}/src/models/user.dto.ts (100%) rename sandbox/{auth-basic-login-signup-example => auth-ms-basic-example}/src/openapi-spec.ts (82%) rename sandbox/{auth-basic-login-signup-example => auth-ms-basic-example}/src/openapi.json (100%) rename sandbox/{auth-basic-login-signup-example => auth-ms-basic-example}/src/opentelemetry-registry.ts (82%) create mode 100755 sandbox/auth-ms-basic-example/src/providers/index.ts rename sandbox/{auth-basic-login-signup-example => auth-ms-basic-example}/src/providers/local-signup.provider.ts (99%) rename sandbox/{auth-basic-login-signup-example => auth-ms-basic-example}/src/providers/signup-token-handler.provider.ts (65%) rename sandbox/{auth-basic-login-signup-example => auth-ms-basic-example}/src/services/index.ts (100%) rename sandbox/{auth-basic-login-signup-example => auth-ms-basic-example}/src/services/user-ops.service.ts (63%) rename sandbox/{auth-basic-login-signup-example => auth-ms-basic-example}/tsconfig.json (100%) diff --git a/sandbox/auth-basic-login-signup-example/Dockerfile b/sandbox/auth-basic-login-signup-example/Dockerfile deleted file mode 100755 index 17580fe640..0000000000 --- a/sandbox/auth-basic-login-signup-example/Dockerfile +++ /dev/null @@ -1,88 +0,0 @@ -# Check out https://hub.docker.com/_/node to select a new base image -ARG nodeVer=18-alpine - -# select a base image to build from -FROM node:$nodeVer AS BASE - -# Take the build variables for image base -ARG SERVICE_NAME -ARG FROM_FOLDER -# This command is used to install some dependencies in the Docker image. -# Nessasary for running node-prune and npm install -RUN apk update && apk add --no-cache --virtual .gyp \ - python3 \ - make \ - g++ \ - bash \ - curl - -# This is used to download and install the `node-prune` tool in the Docker image. -RUN curl -sfL https://gobinaries.com/tj/node-prune | bash -s -- -b /usr/local/bin - -# Set to a non-root built-in user `node` -USER node - -# Create app directory (with user `node`) -RUN mkdir -p /home/node/app - -# Set the working directory to `/home/node/app` -WORKDIR /home/node/app - -# Install app dependencies -# A wildcard is used to ensure both package.json AND package-lock.json are copied -# where available (npm@5+) -COPY --chown=node package*.json ./ - -# The following two commands is used to copy the `packages`,`service` directory from the local file system to the Docker image. -# The `--chown=node` flag ensures that the ownership of the copied files/directories is set to the `node` user. -# This is important because the subsequent commands in the Dockerfile are executed with the `node` user, -# and it needs the appropriate permissions to access and modify the copied files/directories. -COPY --chown=node packages ./packages - -COPY --chown=node $FROM_FOLDER/$SERVICE_NAME ./$FROM_FOLDER/$SERVICE_NAME - -# Installing all dependencies -RUN npm install - -# Building the app -# set the Working Directory to the service -WORKDIR /home/node/app/$FROM_FOLDER/$SERVICE_NAME -# Run Build Command -RUN npm run build - -# Run node-prune -RUN npm prune --production -RUN /usr/local/bin/node-prune - -# Start fresh for a smaller image size -FROM node:$nodeVer - -# Take the build variables for image stage -ARG SERVICE_NAME -ARG FROM_FOLDER - -RUN mkdir -p /home/node/app - -USER node - -WORKDIR /home/node/app - - -# These `COPY` commands are used to copy files and directories from the `BASE` -# stage of the Docker image to the current stage. -COPY --from=BASE --chown=node /home/node/app/node_modules ./node_modules -COPY --from=BASE --chown=node /home/node/app/package.json ./ -COPY --from=BASE --chown=node /home/node/app/package-lock.json ./ -COPY --from=BASE --chown=node /home/node/app/packages ./packages -COPY --from=BASE --chown=node /home/node/app/$FROM_FOLDER/$SERVICE_NAME ./$FROM_FOLDER/$SERVICE_NAME - -# Set the working directory to `/home/node/app/services/auth-service` -WORKDIR /home/node/app/$FROM_FOLDER/$SERVICE_NAME - - -# Bind to all network interfaces so that it can be mapped to the host OS -ENV HOST=0.0.0.0 PORT=3000 - -EXPOSE ${PORT} - -CMD [ "node", "." ] \ No newline at end of file diff --git a/sandbox/auth-basic-login-signup-example/src/providers/index.ts b/sandbox/auth-basic-login-signup-example/src/providers/index.ts deleted file mode 100755 index 4d8a58859a..0000000000 --- a/sandbox/auth-basic-login-signup-example/src/providers/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './local-signup.provider'; -export * from './signup-token-handler.provider'; \ No newline at end of file diff --git a/sandbox/auth-basic-login-signup-example/.dockerignore b/sandbox/auth-ms-basic-example/.dockerignore similarity index 100% rename from sandbox/auth-basic-login-signup-example/.dockerignore rename to sandbox/auth-ms-basic-example/.dockerignore diff --git a/sandbox/auth-basic-login-signup-example/.env.defaults b/sandbox/auth-ms-basic-example/.env.defaults similarity index 100% rename from sandbox/auth-basic-login-signup-example/.env.defaults rename to sandbox/auth-ms-basic-example/.env.defaults diff --git a/sandbox/auth-basic-login-signup-example/.env.example b/sandbox/auth-ms-basic-example/.env.example similarity index 100% rename from sandbox/auth-basic-login-signup-example/.env.example rename to sandbox/auth-ms-basic-example/.env.example diff --git a/sandbox/auth-basic-login-signup-example/.eslintignore b/sandbox/auth-ms-basic-example/.eslintignore similarity index 58% rename from sandbox/auth-basic-login-signup-example/.eslintignore rename to sandbox/auth-ms-basic-example/.eslintignore index ae1479d3e8..bc029bfd23 100755 --- a/sandbox/auth-basic-login-signup-example/.eslintignore +++ b/sandbox/auth-ms-basic-example/.eslintignore @@ -2,4 +2,5 @@ node_modules/ dist/ coverage/ .eslintrc.js -mochawesome-report \ No newline at end of file +mochawesome-report +migrations/ \ No newline at end of file diff --git a/sandbox/auth-basic-login-signup-example/.eslintrc.js b/sandbox/auth-ms-basic-example/.eslintrc.js similarity index 88% rename from sandbox/auth-basic-login-signup-example/.eslintrc.js rename to sandbox/auth-ms-basic-example/.eslintrc.js index c01d682feb..aef13fa415 100755 --- a/sandbox/auth-basic-login-signup-example/.eslintrc.js +++ b/sandbox/auth-ms-basic-example/.eslintrc.js @@ -4,10 +4,10 @@ module.exports = { 'no-extra-boolean-cast': 'off', '@typescript-eslint/interface-name-prefix': 'off', 'no-prototype-builtins': 'off', - 'no-await-in-loop': 'error' + 'no-await-in-loop': 'error', }, parserOptions: { project: './tsconfig.json', tsconfigRootDir: __dirname, }, -}; \ No newline at end of file +}; diff --git a/sandbox/auth-basic-login-signup-example/.gitignore b/sandbox/auth-ms-basic-example/.gitignore similarity index 100% rename from sandbox/auth-basic-login-signup-example/.gitignore rename to sandbox/auth-ms-basic-example/.gitignore diff --git a/sandbox/auth-basic-login-signup-example/.mocharc.json b/sandbox/auth-ms-basic-example/.mocharc.json similarity index 100% rename from sandbox/auth-basic-login-signup-example/.mocharc.json rename to sandbox/auth-ms-basic-example/.mocharc.json diff --git a/sandbox/auth-basic-login-signup-example/.nycrc b/sandbox/auth-ms-basic-example/.nycrc similarity index 100% rename from sandbox/auth-basic-login-signup-example/.nycrc rename to sandbox/auth-ms-basic-example/.nycrc diff --git a/sandbox/auth-basic-login-signup-example/.prettierignore b/sandbox/auth-ms-basic-example/.prettierignore similarity index 100% rename from sandbox/auth-basic-login-signup-example/.prettierignore rename to sandbox/auth-ms-basic-example/.prettierignore diff --git a/sandbox/auth-basic-login-signup-example/.prettierrc b/sandbox/auth-ms-basic-example/.prettierrc similarity index 100% rename from sandbox/auth-basic-login-signup-example/.prettierrc rename to sandbox/auth-ms-basic-example/.prettierrc diff --git a/sandbox/auth-basic-login-signup-example/.vscode/launch.json b/sandbox/auth-ms-basic-example/.vscode/launch.json similarity index 100% rename from sandbox/auth-basic-login-signup-example/.vscode/launch.json rename to sandbox/auth-ms-basic-example/.vscode/launch.json diff --git a/sandbox/auth-basic-login-signup-example/.vscode/settings.json b/sandbox/auth-ms-basic-example/.vscode/settings.json similarity index 100% rename from sandbox/auth-basic-login-signup-example/.vscode/settings.json rename to sandbox/auth-ms-basic-example/.vscode/settings.json diff --git a/sandbox/auth-basic-login-signup-example/.vscode/tasks.json b/sandbox/auth-ms-basic-example/.vscode/tasks.json similarity index 100% rename from sandbox/auth-basic-login-signup-example/.vscode/tasks.json rename to sandbox/auth-ms-basic-example/.vscode/tasks.json diff --git a/sandbox/auth-basic-login-signup-example/.yo-rc.json b/sandbox/auth-ms-basic-example/.yo-rc.json similarity index 100% rename from sandbox/auth-basic-login-signup-example/.yo-rc.json rename to sandbox/auth-ms-basic-example/.yo-rc.json diff --git a/sandbox/auth-basic-login-signup-example/DEVELOPING.md b/sandbox/auth-ms-basic-example/DEVELOPING.md similarity index 100% rename from sandbox/auth-basic-login-signup-example/DEVELOPING.md rename to sandbox/auth-ms-basic-example/DEVELOPING.md diff --git a/sandbox/auth-basic-login-signup-example/README.md b/sandbox/auth-ms-basic-example/README.md similarity index 100% rename from sandbox/auth-basic-login-signup-example/README.md rename to sandbox/auth-ms-basic-example/README.md diff --git a/sandbox/auth-basic-login-signup-example/migrations/20210318100600-init.js b/sandbox/auth-ms-basic-example/migrations/20210318100600-init.js similarity index 100% rename from sandbox/auth-basic-login-signup-example/migrations/20210318100600-init.js rename to sandbox/auth-ms-basic-example/migrations/20210318100600-init.js diff --git a/sandbox/auth-basic-login-signup-example/migrations/20220607063927-secret-key-column.js b/sandbox/auth-ms-basic-example/migrations/20220607063927-secret-key-column.js similarity index 100% rename from sandbox/auth-basic-login-signup-example/migrations/20220607063927-secret-key-column.js rename to sandbox/auth-ms-basic-example/migrations/20220607063927-secret-key-column.js diff --git a/sandbox/auth-basic-login-signup-example/migrations/20221110095658-updated-init.js b/sandbox/auth-ms-basic-example/migrations/20221110095658-updated-init.js similarity index 100% rename from sandbox/auth-basic-login-signup-example/migrations/20221110095658-updated-init.js rename to sandbox/auth-ms-basic-example/migrations/20221110095658-updated-init.js diff --git a/sandbox/auth-basic-login-signup-example/migrations/20230323132703-client-type-column.js b/sandbox/auth-ms-basic-example/migrations/20230323132703-client-type-column.js similarity index 100% rename from sandbox/auth-basic-login-signup-example/migrations/20230323132703-client-type-column.js rename to sandbox/auth-ms-basic-example/migrations/20230323132703-client-type-column.js diff --git a/sandbox/auth-basic-login-signup-example/migrations/20230524115047-login-activity.js b/sandbox/auth-ms-basic-example/migrations/20230524115047-login-activity.js similarity index 100% rename from sandbox/auth-basic-login-signup-example/migrations/20230524115047-login-activity.js rename to sandbox/auth-ms-basic-example/migrations/20230524115047-login-activity.js diff --git a/sandbox/auth-basic-login-signup-example/migrations/20240116123737-sync-with-user-tenant.js b/sandbox/auth-ms-basic-example/migrations/20240116123737-sync-with-user-tenant.js similarity index 100% rename from sandbox/auth-basic-login-signup-example/migrations/20240116123737-sync-with-user-tenant.js rename to sandbox/auth-ms-basic-example/migrations/20240116123737-sync-with-user-tenant.js diff --git a/sandbox/auth-basic-login-signup-example/migrations/20241105074844-add-jwt-keys-schema.js b/sandbox/auth-ms-basic-example/migrations/20241105074844-add-jwt-keys-schema.js similarity index 100% rename from sandbox/auth-basic-login-signup-example/migrations/20241105074844-add-jwt-keys-schema.js rename to sandbox/auth-ms-basic-example/migrations/20241105074844-add-jwt-keys-schema.js diff --git a/sandbox/auth-basic-login-signup-example/migrations/database.json b/sandbox/auth-ms-basic-example/migrations/database.json similarity index 100% rename from sandbox/auth-basic-login-signup-example/migrations/database.json rename to sandbox/auth-ms-basic-example/migrations/database.json diff --git a/sandbox/auth-basic-login-signup-example/migrations/sqls/20210318100600-init-down.sql b/sandbox/auth-ms-basic-example/migrations/sqls/20210318100600-init-down.sql similarity index 100% rename from sandbox/auth-basic-login-signup-example/migrations/sqls/20210318100600-init-down.sql rename to sandbox/auth-ms-basic-example/migrations/sqls/20210318100600-init-down.sql diff --git a/sandbox/auth-basic-login-signup-example/migrations/sqls/20210318100600-init-up.sql b/sandbox/auth-ms-basic-example/migrations/sqls/20210318100600-init-up.sql similarity index 100% rename from sandbox/auth-basic-login-signup-example/migrations/sqls/20210318100600-init-up.sql rename to sandbox/auth-ms-basic-example/migrations/sqls/20210318100600-init-up.sql diff --git a/sandbox/auth-basic-login-signup-example/migrations/sqls/20220607063927-secret-key-column-down.sql b/sandbox/auth-ms-basic-example/migrations/sqls/20220607063927-secret-key-column-down.sql similarity index 100% rename from sandbox/auth-basic-login-signup-example/migrations/sqls/20220607063927-secret-key-column-down.sql rename to sandbox/auth-ms-basic-example/migrations/sqls/20220607063927-secret-key-column-down.sql diff --git a/sandbox/auth-basic-login-signup-example/migrations/sqls/20220607063927-secret-key-column-up.sql b/sandbox/auth-ms-basic-example/migrations/sqls/20220607063927-secret-key-column-up.sql similarity index 100% rename from sandbox/auth-basic-login-signup-example/migrations/sqls/20220607063927-secret-key-column-up.sql rename to sandbox/auth-ms-basic-example/migrations/sqls/20220607063927-secret-key-column-up.sql diff --git a/sandbox/auth-basic-login-signup-example/migrations/sqls/20221110095658-updated-init-down.sql b/sandbox/auth-ms-basic-example/migrations/sqls/20221110095658-updated-init-down.sql similarity index 100% rename from sandbox/auth-basic-login-signup-example/migrations/sqls/20221110095658-updated-init-down.sql rename to sandbox/auth-ms-basic-example/migrations/sqls/20221110095658-updated-init-down.sql diff --git a/sandbox/auth-basic-login-signup-example/migrations/sqls/20221110095658-updated-init-up.sql b/sandbox/auth-ms-basic-example/migrations/sqls/20221110095658-updated-init-up.sql similarity index 100% rename from sandbox/auth-basic-login-signup-example/migrations/sqls/20221110095658-updated-init-up.sql rename to sandbox/auth-ms-basic-example/migrations/sqls/20221110095658-updated-init-up.sql diff --git a/sandbox/auth-basic-login-signup-example/migrations/sqls/20230323132703-client-type-column-down.sql b/sandbox/auth-ms-basic-example/migrations/sqls/20230323132703-client-type-column-down.sql similarity index 100% rename from sandbox/auth-basic-login-signup-example/migrations/sqls/20230323132703-client-type-column-down.sql rename to sandbox/auth-ms-basic-example/migrations/sqls/20230323132703-client-type-column-down.sql diff --git a/sandbox/auth-basic-login-signup-example/migrations/sqls/20230323132703-client-type-column-up.sql b/sandbox/auth-ms-basic-example/migrations/sqls/20230323132703-client-type-column-up.sql similarity index 100% rename from sandbox/auth-basic-login-signup-example/migrations/sqls/20230323132703-client-type-column-up.sql rename to sandbox/auth-ms-basic-example/migrations/sqls/20230323132703-client-type-column-up.sql diff --git a/sandbox/auth-basic-login-signup-example/migrations/sqls/20230524115047-login-activity-down.sql b/sandbox/auth-ms-basic-example/migrations/sqls/20230524115047-login-activity-down.sql similarity index 100% rename from sandbox/auth-basic-login-signup-example/migrations/sqls/20230524115047-login-activity-down.sql rename to sandbox/auth-ms-basic-example/migrations/sqls/20230524115047-login-activity-down.sql diff --git a/sandbox/auth-basic-login-signup-example/migrations/sqls/20230524115047-login-activity-up.sql b/sandbox/auth-ms-basic-example/migrations/sqls/20230524115047-login-activity-up.sql similarity index 100% rename from sandbox/auth-basic-login-signup-example/migrations/sqls/20230524115047-login-activity-up.sql rename to sandbox/auth-ms-basic-example/migrations/sqls/20230524115047-login-activity-up.sql diff --git a/sandbox/auth-basic-login-signup-example/migrations/sqls/20240116123737-sync-with-user-tenant-down.sql b/sandbox/auth-ms-basic-example/migrations/sqls/20240116123737-sync-with-user-tenant-down.sql similarity index 100% rename from sandbox/auth-basic-login-signup-example/migrations/sqls/20240116123737-sync-with-user-tenant-down.sql rename to sandbox/auth-ms-basic-example/migrations/sqls/20240116123737-sync-with-user-tenant-down.sql diff --git a/sandbox/auth-basic-login-signup-example/migrations/sqls/20240116123737-sync-with-user-tenant-up.sql b/sandbox/auth-ms-basic-example/migrations/sqls/20240116123737-sync-with-user-tenant-up.sql similarity index 100% rename from sandbox/auth-basic-login-signup-example/migrations/sqls/20240116123737-sync-with-user-tenant-up.sql rename to sandbox/auth-ms-basic-example/migrations/sqls/20240116123737-sync-with-user-tenant-up.sql diff --git a/sandbox/auth-basic-login-signup-example/migrations/sqls/20241105074844-add-jwt-keys-schema-down.sql b/sandbox/auth-ms-basic-example/migrations/sqls/20241105074844-add-jwt-keys-schema-down.sql similarity index 100% rename from sandbox/auth-basic-login-signup-example/migrations/sqls/20241105074844-add-jwt-keys-schema-down.sql rename to sandbox/auth-ms-basic-example/migrations/sqls/20241105074844-add-jwt-keys-schema-down.sql diff --git a/sandbox/auth-basic-login-signup-example/migrations/sqls/20241105074844-add-jwt-keys-schema-up.sql b/sandbox/auth-ms-basic-example/migrations/sqls/20241105074844-add-jwt-keys-schema-up.sql similarity index 100% rename from sandbox/auth-basic-login-signup-example/migrations/sqls/20241105074844-add-jwt-keys-schema-up.sql rename to sandbox/auth-ms-basic-example/migrations/sqls/20241105074844-add-jwt-keys-schema-up.sql diff --git a/sandbox/auth-ms-basic-example/mochawesome-report/assets/MaterialIcons-Regular.woff b/sandbox/auth-ms-basic-example/mochawesome-report/assets/MaterialIcons-Regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..b648a3eea2d16b6ce783906d6b7d5f251b9eb56c GIT binary patch literal 57620 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

wF7DI|Kx|V1sBQ9FYs>m5C)C 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 BJ$(QG literal 0 HcmV?d00001 diff --git a/sandbox/auth-ms-basic-example/mochawesome-report/assets/MaterialIcons-Regular.woff2 b/sandbox/auth-ms-basic-example/mochawesome-report/assets/MaterialIcons-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..9fa211252080046a23b2449dbdced6abc2b0bb34 GIT binary patch literal 44300 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 QW8}wPUeo^@jR61v08@RD2LJ#7 literal 0 HcmV?d00001 diff --git a/sandbox/auth-ms-basic-example/mochawesome-report/assets/app.css b/sandbox/auth-ms-basic-example/mochawesome-report/assets/app.css new file mode 100644 index 0000000000..eb7c4e9ead --- /dev/null +++ b/sandbox/auth-ms-basic-example/mochawesome-report/assets/app.css @@ -0,0 +1,14 @@ +/*! mochawesome-report-generator 6.2.0 | https://github.com/adamgruber/mochawesome-report-generator */ +:root{--screen-sm-min:768px;--screen-md-min:992px;--screen-lg-min:1200px;--grid-gutter-width:30px;--container-sm:calc(720px + var(--grid-gutter-width));--container-md:calc(940px + var(--grid-gutter-width));--container-lg:calc(1140px + var(--grid-gutter-width));--navbar-height:122px;--navbar-height-short:56px;--summary-height-stacked:82px;--statusbar-height-stacked:54px;--footer-height:60px;--default-transition-duration:0.2s;--default-transition-easing:ease;--gray-base:#000;--gray-darker-faded:color(var(--gray-darker) alpha(95%));--gray-darker:color(var(--gray-base) tint(13.5%));--gray-dark:color(var(--gray-base) tint(20%));--gray:color(var(--gray-base) tint(33.5%));--gray-light:color(var(--gray-base) tint(46.7%));--gray-medium:color(var(--gray-base) tint(73.5%));--gray-lighter:color(var(--gray-base) tint(93.5%));--gray-lighter-faded:color(var(--gray-lighter) alpha(95%));--gray-border:color(var(--gray-base) tint(80%));--grey50:#eceff1;--grey100:#f5f5f5;--grey300:#e0e0e0;--grey500:#9e9e9e;--grey700:#616161;--green100:#c8e6c9;--green200:#a5d6a7;--green300:#81c784;--green500:#4caf50;--green700:#388e3c;--red100:#ffcdd2;--red300:#e57373;--red500:#f44336;--red700:#d32f2f;--ltblue100:#b3e5fc;--ltblue300:#4fc3f7;--ltblue500:#03a9f4;--ltblue700:#0288d1;--black87:rgba(0,0,0,0.87);--black54:rgba(0,0,0,0.54);--black38:rgba(0,0,0,0.38);--bluegrey500:#607d8b;--bluegrey800:#37474f;--bluegrey900:#263238;--light-icon-active:#fff;--light-icon-inactive:hsla(0,0%,100%,0.5);--dark-icon-active:var(--black54);--dark-icon-inactive:var(--black38);--amber300:#ffd54f;--amber400:#ffca28;--amber500:#ffc107;--yellow700:#fbc02d;--yellow800:#f9a825;--brand-primary:color(#428bca shade(6.5%));--brand-success:#4caf50;--brand-info:#5bc0de;--brand-warning:#f0ad4e;--brand-danger:#d9534f;--text-color:var(--black87);--body-bg:#f2f2f2;--link-color:var(--brand-primary);--link-hover-color:color(var(--link-color) shade(15%));--list-group-border:#ddd;--font-family-sans-serif:"robotoregular","Helvetica Neue",Helvetica,Arial,sans-serif;--font-family-base:var(--font-family-sans-serif);--font-family-mono:"Menlo","Monaco","Consolas","Courier New",monospace;--font-size-base:14px;--line-height-base:1.429;--line-height-computed:20px;--headings-font-family:inherit;--headings-font-weight:400;--headings-line-height:1.1;--headings-color:inherit;--headings-small-color:var(--gray-light);--font-size-h1:36px;--font-size-h2:30px;--font-size-h3:24px;--font-size-h4:18px;--font-size-h5:var(--font-size-base);--font-size-h6:12px;--font-family-light:"robotolight";--font-family-regular:"robotoregular";--font-family-medium:"robotomedium";--link-transition:color 0.2s ease-out}.dropdown--trans-color---3ixtY{transition:color .2s ease-out;transition:var(--link-transition)}.dropdown--component---21Q9c{position:relative}.dropdown--toggle---3gdzr{white-space:nowrap}.dropdown--toggle-icon---1j9Ga:not(.dropdown--icon-only---3vq2I){margin-left:.5rem}.dropdown--list---8GPrA{padding:0;margin:0;list-style:none;text-align:left}.dropdown--list-main---3QZnQ{position:absolute;top:100%;z-index:1000;visibility:hidden;min-width:160px;overflow:auto}.dropdown--align-left---3-3Hu{left:0}.dropdown--align-right---2ZQx0{right:0}.dropdown--list-item-link---JRrOY,.dropdown--list-item-text---2COKZ{display:block;position:relative;white-space:nowrap;text-decoration:none}.dropdown--list-item-text---2COKZ{cursor:default}@-webkit-keyframes dropdown--in---FpwEb{0%{opacity:0}to{opacity:1}}@keyframes dropdown--in---FpwEb{0%{opacity:0}to{opacity:1}}@-webkit-keyframes dropdown--out---2HVe1{0%{opacity:1;visibility:visible}to{opacity:0}}@keyframes dropdown--out---2HVe1{0%{opacity:1;visibility:visible}to{opacity:0}}.dropdown--close---2LnDu{-webkit-animation:dropdown--out---2HVe1 .2s ease;animation:dropdown--out---2HVe1 .2s ease;-webkit-animation:dropdown--out---2HVe1 var(--default-transition-duration) var(--default-transition-easing);animation:dropdown--out---2HVe1 var(--default-transition-duration) var(--default-transition-easing);visibility:hidden}.dropdown--open---3bwiy{-webkit-animation:dropdown--in---FpwEb .2s ease;animation:dropdown--in---FpwEb .2s ease;-webkit-animation:dropdown--in---FpwEb var(--default-transition-duration) var(--default-transition-easing);animation:dropdown--in---FpwEb var(--default-transition-duration) var(--default-transition-easing);visibility:visible} +:root{--screen-sm-min:768px;--screen-md-min:992px;--screen-lg-min:1200px;--grid-gutter-width:30px;--container-sm:calc(720px + var(--grid-gutter-width));--container-md:calc(940px + var(--grid-gutter-width));--container-lg:calc(1140px + var(--grid-gutter-width));--navbar-height:122px;--navbar-height-short:56px;--summary-height-stacked:82px;--statusbar-height-stacked:54px;--footer-height:60px;--default-transition-duration:0.2s;--default-transition-easing:ease;--gray-base:#000;--gray-darker-faded:color(var(--gray-darker) alpha(95%));--gray-darker:color(var(--gray-base) tint(13.5%));--gray-dark:color(var(--gray-base) tint(20%));--gray:color(var(--gray-base) tint(33.5%));--gray-light:color(var(--gray-base) tint(46.7%));--gray-medium:color(var(--gray-base) tint(73.5%));--gray-lighter:color(var(--gray-base) tint(93.5%));--gray-lighter-faded:color(var(--gray-lighter) alpha(95%));--gray-border:color(var(--gray-base) tint(80%));--grey50:#eceff1;--grey100:#f5f5f5;--grey300:#e0e0e0;--grey500:#9e9e9e;--grey700:#616161;--green100:#c8e6c9;--green200:#a5d6a7;--green300:#81c784;--green500:#4caf50;--green700:#388e3c;--red100:#ffcdd2;--red300:#e57373;--red500:#f44336;--red700:#d32f2f;--ltblue100:#b3e5fc;--ltblue300:#4fc3f7;--ltblue500:#03a9f4;--ltblue700:#0288d1;--black87:rgba(0,0,0,0.87);--black54:rgba(0,0,0,0.54);--black38:rgba(0,0,0,0.38);--bluegrey500:#607d8b;--bluegrey800:#37474f;--bluegrey900:#263238;--light-icon-active:#fff;--light-icon-inactive:hsla(0,0%,100%,0.5);--dark-icon-active:var(--black54);--dark-icon-inactive:var(--black38);--amber300:#ffd54f;--amber400:#ffca28;--amber500:#ffc107;--yellow700:#fbc02d;--yellow800:#f9a825;--brand-primary:color(#428bca shade(6.5%));--brand-success:#4caf50;--brand-info:#5bc0de;--brand-warning:#f0ad4e;--brand-danger:#d9534f;--text-color:var(--black87);--body-bg:#f2f2f2;--link-color:var(--brand-primary);--link-hover-color:color(var(--link-color) shade(15%));--list-group-border:#ddd;--font-family-sans-serif:"robotoregular","Helvetica Neue",Helvetica,Arial,sans-serif;--font-family-base:var(--font-family-sans-serif);--font-family-mono:"Menlo","Monaco","Consolas","Courier New",monospace;--font-size-base:14px;--line-height-base:1.429;--line-height-computed:20px;--headings-font-family:inherit;--headings-font-weight:400;--headings-line-height:1.1;--headings-color:inherit;--headings-small-color:var(--gray-light);--font-size-h1:36px;--font-size-h2:30px;--font-size-h3:24px;--font-size-h4:18px;--font-size-h5:var(--font-size-base);--font-size-h6:12px;--font-family-light:"robotolight";--font-family-regular:"robotoregular";--font-family-medium:"robotomedium";--link-transition:color 0.2s ease-out}.dropdown-selector--trans-color---3nePW{transition:color .2s ease-out;transition:var(--link-transition)}.dropdown-selector--dropdown---AT5ee{right:-8px}.dropdown-selector--menu---nW4gv{box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12);font-family:robotolight;font-family:var(--font-family-light);min-width:70px;width:70px;background:#fff;top:0}.dropdown-selector--toggle---WEnEe{display:inline-block;font-family:robotoregular;font-family:var(--font-family-regular);font-size:14px;color:rgba(0,0,0,.54);color:var(--black54);vertical-align:top;line-height:24px;padding:0 22px 0 0;cursor:pointer;border:none;background:none;outline:none;width:70px}.dropdown-selector--toggle---WEnEe:focus{box-shadow:0 0 2px 0 #03a9f4;box-shadow:0 0 2px 0 var(--ltblue500)}.dropdown-selector--toggle-icon---10VKo{position:absolute;top:4px;right:4px}.dropdown-selector--item-link---2W1T7,.dropdown-selector--toggle-icon---10VKo{color:rgba(0,0,0,.38);color:var(--black38)}.dropdown-selector--item-link---2W1T7{border:none;cursor:pointer;padding:4px 10px;text-align:left;width:100%}.dropdown-selector--item-link---2W1T7:hover{background-color:#f5f5f5;background-color:var(--grey100)}.dropdown-selector--item-link---2W1T7:focus{box-shadow:inset 0 0 2px 0 #03a9f4;box-shadow:inset 0 0 2px 0 var(--ltblue500);outline:none}.dropdown-selector--item-selected---1q-NK .dropdown-selector--item-link---2W1T7{color:#4caf50;color:var(--green500)} +:root{--screen-sm-min:768px;--screen-md-min:992px;--screen-lg-min:1200px;--grid-gutter-width:30px;--container-sm:calc(720px + var(--grid-gutter-width));--container-md:calc(940px + var(--grid-gutter-width));--container-lg:calc(1140px + var(--grid-gutter-width));--navbar-height:122px;--navbar-height-short:56px;--summary-height-stacked:82px;--statusbar-height-stacked:54px;--footer-height:60px;--default-transition-duration:0.2s;--default-transition-easing:ease;--gray-base:#000;--gray-darker-faded:color(var(--gray-darker) alpha(95%));--gray-darker:color(var(--gray-base) tint(13.5%));--gray-dark:color(var(--gray-base) tint(20%));--gray:color(var(--gray-base) tint(33.5%));--gray-light:color(var(--gray-base) tint(46.7%));--gray-medium:color(var(--gray-base) tint(73.5%));--gray-lighter:color(var(--gray-base) tint(93.5%));--gray-lighter-faded:color(var(--gray-lighter) alpha(95%));--gray-border:color(var(--gray-base) tint(80%));--grey50:#eceff1;--grey100:#f5f5f5;--grey300:#e0e0e0;--grey500:#9e9e9e;--grey700:#616161;--green100:#c8e6c9;--green200:#a5d6a7;--green300:#81c784;--green500:#4caf50;--green700:#388e3c;--red100:#ffcdd2;--red300:#e57373;--red500:#f44336;--red700:#d32f2f;--ltblue100:#b3e5fc;--ltblue300:#4fc3f7;--ltblue500:#03a9f4;--ltblue700:#0288d1;--black87:rgba(0,0,0,0.87);--black54:rgba(0,0,0,0.54);--black38:rgba(0,0,0,0.38);--bluegrey500:#607d8b;--bluegrey800:#37474f;--bluegrey900:#263238;--light-icon-active:#fff;--light-icon-inactive:hsla(0,0%,100%,0.5);--dark-icon-active:var(--black54);--dark-icon-inactive:var(--black38);--amber300:#ffd54f;--amber400:#ffca28;--amber500:#ffc107;--yellow700:#fbc02d;--yellow800:#f9a825;--brand-primary:color(#428bca shade(6.5%));--brand-success:#4caf50;--brand-info:#5bc0de;--brand-warning:#f0ad4e;--brand-danger:#d9534f;--text-color:var(--black87);--body-bg:#f2f2f2;--link-color:var(--brand-primary);--link-hover-color:color(var(--link-color) shade(15%));--list-group-border:#ddd;--font-family-sans-serif:"robotoregular","Helvetica Neue",Helvetica,Arial,sans-serif;--font-family-base:var(--font-family-sans-serif);--font-family-mono:"Menlo","Monaco","Consolas","Courier New",monospace;--font-size-base:14px;--line-height-base:1.429;--line-height-computed:20px;--headings-font-family:inherit;--headings-font-weight:400;--headings-line-height:1.1;--headings-color:inherit;--headings-small-color:var(--gray-light);--font-size-h1:36px;--font-size-h2:30px;--font-size-h3:24px;--font-size-h4:18px;--font-size-h5:var(--font-size-base);--font-size-h6:12px;--font-family-light:"robotolight";--font-family-regular:"robotoregular";--font-family-medium:"robotomedium";--link-transition:color 0.2s ease-out}.footer--trans-color---205XF{transition:color .2s ease-out;transition:var(--link-transition)}.footer--component---1WcTR{position:absolute;bottom:0;width:100%;height:60px;height:var(--footer-height);color:rgba(0,0,0,.38);color:var(--black38);text-align:center}.footer--component---1WcTR p{font-size:12px;margin:10px 0}.footer--component---1WcTR a{color:rgba(0,0,0,.54);color:var(--black54);transition:color .2s ease-out;transition:var(--link-transition)}.footer--component---1WcTR a:hover{color:rgba(0,0,0,.87);color:var(--black87)} +:root{--screen-sm-min:768px;--screen-md-min:992px;--screen-lg-min:1200px;--grid-gutter-width:30px;--container-sm:calc(720px + var(--grid-gutter-width));--container-md:calc(940px + var(--grid-gutter-width));--container-lg:calc(1140px + var(--grid-gutter-width));--navbar-height:122px;--navbar-height-short:56px;--summary-height-stacked:82px;--statusbar-height-stacked:54px;--footer-height:60px;--default-transition-duration:0.2s;--default-transition-easing:ease;--gray-base:#000;--gray-darker-faded:color(var(--gray-darker) alpha(95%));--gray-darker:color(var(--gray-base) tint(13.5%));--gray-dark:color(var(--gray-base) tint(20%));--gray:color(var(--gray-base) tint(33.5%));--gray-light:color(var(--gray-base) tint(46.7%));--gray-medium:color(var(--gray-base) tint(73.5%));--gray-lighter:color(var(--gray-base) tint(93.5%));--gray-lighter-faded:color(var(--gray-lighter) alpha(95%));--gray-border:color(var(--gray-base) tint(80%));--grey50:#eceff1;--grey100:#f5f5f5;--grey300:#e0e0e0;--grey500:#9e9e9e;--grey700:#616161;--green100:#c8e6c9;--green200:#a5d6a7;--green300:#81c784;--green500:#4caf50;--green700:#388e3c;--red100:#ffcdd2;--red300:#e57373;--red500:#f44336;--red700:#d32f2f;--ltblue100:#b3e5fc;--ltblue300:#4fc3f7;--ltblue500:#03a9f4;--ltblue700:#0288d1;--black87:rgba(0,0,0,0.87);--black54:rgba(0,0,0,0.54);--black38:rgba(0,0,0,0.38);--bluegrey500:#607d8b;--bluegrey800:#37474f;--bluegrey900:#263238;--light-icon-active:#fff;--light-icon-inactive:hsla(0,0%,100%,0.5);--dark-icon-active:var(--black54);--dark-icon-inactive:var(--black38);--amber300:#ffd54f;--amber400:#ffca28;--amber500:#ffc107;--yellow700:#fbc02d;--yellow800:#f9a825;--brand-primary:color(#428bca shade(6.5%));--brand-success:#4caf50;--brand-info:#5bc0de;--brand-warning:#f0ad4e;--brand-danger:#d9534f;--text-color:var(--black87);--body-bg:#f2f2f2;--link-color:var(--brand-primary);--link-hover-color:color(var(--link-color) shade(15%));--list-group-border:#ddd;--font-family-sans-serif:"robotoregular","Helvetica Neue",Helvetica,Arial,sans-serif;--font-family-base:var(--font-family-sans-serif);--font-family-mono:"Menlo","Monaco","Consolas","Courier New",monospace;--font-size-base:14px;--line-height-base:1.429;--line-height-computed:20px;--headings-font-family:inherit;--headings-font-weight:400;--headings-line-height:1.1;--headings-color:inherit;--headings-small-color:var(--gray-light);--font-size-h1:36px;--font-size-h2:30px;--font-size-h3:24px;--font-size-h4:18px;--font-size-h5:var(--font-size-base);--font-size-h6:12px;--font-family-light:"robotolight";--font-family-regular:"robotoregular";--font-family-medium:"robotomedium";--link-transition:color 0.2s ease-out}.loader--trans-color---97r08{transition:color .2s ease-out;transition:var(--link-transition)}.loader--component---2grcA{position:fixed;top:0;height:100%;width:100%;background-color:color(#f2f2f2 alpha(60%));background-color:color(var(--body-bg) alpha(60%));padding-top:122px;padding-top:var(--navbar-height)}.loader--wrap---3Fhrc{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;-webkit-flex-direction:column;flex-direction:column;min-height:200px}.loader--text---3Yu3g{color:color(#000 tint(46.7%));color:var(--gray-light);text-align:center;margin:1rem 0 0}.loader--spinner---2q6MO{border-radius:50%;width:42px;height:42px;border:.25rem solid color(#000 tint(73.5%));border-top-color:color(#000 tint(33.5%));border:.25rem solid var(--gray-medium);border-top-color:var(--gray);-webkit-animation:loader--spin---K6Loh 1s linear infinite;animation:loader--spin---K6Loh 1s linear infinite}@-webkit-keyframes loader--spin---K6Loh{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes loader--spin---K6Loh{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@media (min-width:768px){.loader--component---2grcA{padding-top:56px;padding-top:var(--navbar-height-short)}} +:root{--screen-sm-min:768px;--screen-md-min:992px;--screen-lg-min:1200px;--grid-gutter-width:30px;--container-sm:calc(720px + var(--grid-gutter-width));--container-md:calc(940px + var(--grid-gutter-width));--container-lg:calc(1140px + var(--grid-gutter-width));--navbar-height:122px;--navbar-height-short:56px;--summary-height-stacked:82px;--statusbar-height-stacked:54px;--footer-height:60px;--default-transition-duration:0.2s;--default-transition-easing:ease;--gray-base:#000;--gray-darker-faded:color(var(--gray-darker) alpha(95%));--gray-darker:color(var(--gray-base) tint(13.5%));--gray-dark:color(var(--gray-base) tint(20%));--gray:color(var(--gray-base) tint(33.5%));--gray-light:color(var(--gray-base) tint(46.7%));--gray-medium:color(var(--gray-base) tint(73.5%));--gray-lighter:color(var(--gray-base) tint(93.5%));--gray-lighter-faded:color(var(--gray-lighter) alpha(95%));--gray-border:color(var(--gray-base) tint(80%));--grey50:#eceff1;--grey100:#f5f5f5;--grey300:#e0e0e0;--grey500:#9e9e9e;--grey700:#616161;--green100:#c8e6c9;--green200:#a5d6a7;--green300:#81c784;--green500:#4caf50;--green700:#388e3c;--red100:#ffcdd2;--red300:#e57373;--red500:#f44336;--red700:#d32f2f;--ltblue100:#b3e5fc;--ltblue300:#4fc3f7;--ltblue500:#03a9f4;--ltblue700:#0288d1;--black87:rgba(0,0,0,0.87);--black54:rgba(0,0,0,0.54);--black38:rgba(0,0,0,0.38);--bluegrey500:#607d8b;--bluegrey800:#37474f;--bluegrey900:#263238;--light-icon-active:#fff;--light-icon-inactive:hsla(0,0%,100%,0.5);--dark-icon-active:var(--black54);--dark-icon-inactive:var(--black38);--amber300:#ffd54f;--amber400:#ffca28;--amber500:#ffc107;--yellow700:#fbc02d;--yellow800:#f9a825;--brand-primary:color(#428bca shade(6.5%));--brand-success:#4caf50;--brand-info:#5bc0de;--brand-warning:#f0ad4e;--brand-danger:#d9534f;--text-color:var(--black87);--body-bg:#f2f2f2;--link-color:var(--brand-primary);--link-hover-color:color(var(--link-color) shade(15%));--list-group-border:#ddd;--font-family-sans-serif:"robotoregular","Helvetica Neue",Helvetica,Arial,sans-serif;--font-family-base:var(--font-family-sans-serif);--font-family-mono:"Menlo","Monaco","Consolas","Courier New",monospace;--font-size-base:14px;--line-height-base:1.429;--line-height-computed:20px;--headings-font-family:inherit;--headings-font-weight:400;--headings-line-height:1.1;--headings-color:inherit;--headings-small-color:var(--gray-light);--font-size-h1:36px;--font-size-h2:30px;--font-size-h3:24px;--font-size-h4:18px;--font-size-h5:var(--font-size-base);--font-size-h6:12px;--font-family-light:"robotolight";--font-family-regular:"robotoregular";--font-family-medium:"robotomedium";--link-transition:color 0.2s ease-out}.nav-menu--trans-color---1l-R-{transition:color .2s ease-out;transition:var(--link-transition)}.nav-menu--wrap---39S_b{position:fixed;z-index:2010;top:0;right:0;bottom:0;left:0;overflow:hidden;visibility:hidden}.nav-menu--overlay---k2Lwz{display:none;background:rgba(0,0,0,.5)}.nav-menu--close-btn---2m7W7{border:none;background:transparent;padding:0}.nav-menu--close-btn---2m7W7:focus{box-shadow:0 0 2px 0 #03a9f4;box-shadow:0 0 2px 0 var(--ltblue500);outline:none}.nav-menu--close-btn---2m7W7{cursor:pointer;transition:color .2s ease-out;transition:var(--link-transition);position:absolute;top:16px;right:16px;color:rgba(0,0,0,.54);color:var(--black54)}.nav-menu--close-btn---2m7W7:active,.nav-menu--close-btn---2m7W7:hover{color:rgba(0,0,0,.87);color:var(--black87)}.nav-menu--menu---lFcsl{position:absolute;transition:all .15s cubic-bezier(.25,1,.8,1);-webkit-transform:translate(-100%);transform:translate(-100%);width:100%;z-index:1;top:0;bottom:0;left:0;overflow:auto;background:#fff}.nav-menu--close-button---2_OHr{border:none;background:transparent;padding:0}.nav-menu--close-button---2_OHr:focus{box-shadow:0 0 2px 0 #03a9f4;box-shadow:0 0 2px 0 var(--ltblue500);outline:none}.nav-menu--close-button---2_OHr{cursor:pointer;transition:color .2s ease-out;transition:var(--link-transition);position:absolute;top:14px;right:14px;font-size:21px;width:26px;height:26px;color:color(#000 tint(33.5%));color:var(--gray)}.nav-menu--close-button---2_OHr:hover{color:color(#000 tint(20%));color:var(--gray-dark)}.nav-menu--date---3SYOi,.nav-menu--section-head---3LXPD{color:rgba(0,0,0,.54);color:var(--black54)}.nav-menu--section-head---3LXPD{text-transform:uppercase}.nav-menu--control---1JEYH{display:-webkit-flex;display:flex;position:relative;margin:8px 0;-webkit-align-items:center;align-items:center}.nav-menu--control-label---3f2XU{display:inline-block;-webkit-flex-grow:1;flex-grow:1;font-family:var(--font-family--regular);font-size:13px;vertical-align:top;line-height:24px}.nav-menu--control-label---3f2XU.nav-menu--with-icon---qF4hj{margin-left:12px}.nav-menu--control-group---32kKg{margin-bottom:10px}.nav-menu--toggle-icon-passed---132lH{color:#4caf50;color:var(--green500)}.nav-menu--toggle-icon-failed---x-XUB{color:#f44336;color:var(--red500)}.nav-menu--toggle-icon-pending---3ZJAs{color:#03a9f4;color:var(--ltblue500)}.nav-menu--toggle-icon-skipped---FyedH{color:#9e9e9e;color:var(--grey500)}.nav-menu--wrap---39S_b.nav-menu--open---3BW1O{visibility:visible}.nav-menu--wrap---39S_b.nav-menu--open---3BW1O .nav-menu--overlay---k2Lwz{opacity:1}.nav-menu--wrap---39S_b.nav-menu--open---3BW1O .nav-menu--menu---lFcsl{-webkit-transform:translate(0);transform:translate(0)}.nav-menu--section---2z7Dj{padding:0 16px;border-bottom:1px solid #e0e0e0;border-bottom:1px solid var(--grey300)}.nav-menu--list---2QMG9{list-style:none;padding-left:0}.nav-menu--main---jkqJW{margin:8px 0}.nav-menu--no-tests---2sRAg>.nav-menu--item---gXWu6:not(.nav-menu--has-tests---1ND4g)>div>.nav-menu--sub---EnSIu{padding-left:0}.nav-menu--no-tests---2sRAg>.nav-menu--item---gXWu6:not(.nav-menu--has-tests---1ND4g):not(:only-child){padding-left:22px}.nav-menu--sub---EnSIu{padding-left:24px;margin:0 0 2px}.nav-menu--link---tywPF{display:-webkit-flex;display:flex;position:relative;-webkit-align-items:center;align-items:center;padding:3px 0;color:color(#000 tint(33.5%));color:var(--gray)}.nav-menu--link---tywPF:hover{color:color(color(#428bca shade(6.5%)) shade(15%));color:var(--link-hover-color);text-decoration:none}.nav-menu--link---tywPF:active,.nav-menu--link---tywPF:focus{box-shadow:0 0 2px 0 #03a9f4;box-shadow:0 0 2px 0 var(--ltblue500);outline:none;text-decoration:none}.nav-menu--link---tywPF span{transition:color .2s ease-out;transition:var(--link-transition);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.nav-menu--link-icon---1Q2NP{margin-right:2px}.nav-menu--link-icon---1Q2NP.nav-menu--pass---1PUeh{color:#4caf50;color:var(--green500)}.nav-menu--link-icon---1Q2NP.nav-menu--fail---3gQQa{color:#f44336;color:var(--red500)}.nav-menu--link-icon---1Q2NP.nav-menu--pending---9zAw0{color:#03a9f4;color:var(--ltblue500)}.nav-menu--link-icon---1Q2NP.nav-menu--skipped---31GPM{color:#9e9e9e;color:var(--grey500)}.nav-menu--disabled---2MoA_{opacity:.3;pointer-events:none}@media (min-width:768px){.nav-menu--menu---lFcsl{width:320px;left:auto}.nav-menu--overlay---k2Lwz{display:block;position:fixed;transition:all .2s ease-out;top:0;right:0;bottom:0;left:0;cursor:pointer;opacity:0}} +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}:root{--screen-sm-min:768px;--screen-md-min:992px;--screen-lg-min:1200px;--grid-gutter-width:30px;--container-sm:calc(720px + var(--grid-gutter-width));--container-md:calc(940px + var(--grid-gutter-width));--container-lg:calc(1140px + var(--grid-gutter-width));--navbar-height:122px;--navbar-height-short:56px;--summary-height-stacked:82px;--statusbar-height-stacked:54px;--footer-height:60px;--default-transition-duration:0.2s;--default-transition-easing:ease;--gray-base:#000;--gray-darker-faded:color(var(--gray-darker) alpha(95%));--gray-darker:color(var(--gray-base) tint(13.5%));--gray-dark:color(var(--gray-base) tint(20%));--gray:color(var(--gray-base) tint(33.5%));--gray-light:color(var(--gray-base) tint(46.7%));--gray-medium:color(var(--gray-base) tint(73.5%));--gray-lighter:color(var(--gray-base) tint(93.5%));--gray-lighter-faded:color(var(--gray-lighter) alpha(95%));--gray-border:color(var(--gray-base) tint(80%));--grey50:#eceff1;--grey100:#f5f5f5;--grey300:#e0e0e0;--grey500:#9e9e9e;--grey700:#616161;--green100:#c8e6c9;--green200:#a5d6a7;--green300:#81c784;--green500:#4caf50;--green700:#388e3c;--red100:#ffcdd2;--red300:#e57373;--red500:#f44336;--red700:#d32f2f;--ltblue100:#b3e5fc;--ltblue300:#4fc3f7;--ltblue500:#03a9f4;--ltblue700:#0288d1;--black87:rgba(0,0,0,0.87);--black54:rgba(0,0,0,0.54);--black38:rgba(0,0,0,0.38);--bluegrey500:#607d8b;--bluegrey800:#37474f;--bluegrey900:#263238;--light-icon-active:#fff;--light-icon-inactive:hsla(0,0%,100%,0.5);--dark-icon-active:var(--black54);--dark-icon-inactive:var(--black38);--amber300:#ffd54f;--amber400:#ffca28;--amber500:#ffc107;--yellow700:#fbc02d;--yellow800:#f9a825;--brand-primary:color(#428bca shade(6.5%));--brand-success:#4caf50;--brand-info:#5bc0de;--brand-warning:#f0ad4e;--brand-danger:#d9534f;--text-color:var(--black87);--body-bg:#f2f2f2;--link-color:var(--brand-primary);--link-hover-color:color(var(--link-color) shade(15%));--list-group-border:#ddd;--font-family-sans-serif:"robotoregular","Helvetica Neue",Helvetica,Arial,sans-serif;--font-family-base:var(--font-family-sans-serif);--font-family-mono:"Menlo","Monaco","Consolas","Courier New",monospace;--font-size-base:14px;--line-height-base:1.429;--line-height-computed:20px;--headings-font-family:inherit;--headings-font-weight:400;--headings-line-height:1.1;--headings-color:inherit;--headings-small-color:var(--gray-light);--font-size-h1:36px;--font-size-h2:30px;--font-size-h3:24px;--font-size-h4:18px;--font-size-h5:var(--font-size-base);--font-size-h6:12px;--font-family-light:"robotolight";--font-family-regular:"robotoregular";--font-family-medium:"robotomedium";--link-transition:color 0.2s ease-out}.trans-color{transition:color .2s ease-out;transition:var(--link-transition)}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-family:var(--headings-font-family);font-weight:400;font-weight:var(--headings-font-weight);line-height:1.1;line-height:var(--headings-line-height);color:inherit;color:var(--headings-color)}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:color(#000 tint(46.7%));color:var(--headings-small-color)}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-top:var(--line-height-computed);margin-bottom:10px;margin-bottom:calc(var(--line-height-computed)/2)}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-top:calc(var(--line-height-computed)/2);margin-bottom:10px;margin-bottom:calc(var(--line-height-computed)/2)}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px;font-size:var(--font-size-h1)}.h2,h2{font-size:30px;font-size:var(--font-size-h2)}.h3,h3{font-size:24px;font-size:var(--font-size-h3)}.h4,h4{font-size:18px;font-size:var(--font-size-h4)}.h5,h5{font-size:14px;font-size:var(--font-size-h5)}.h6,h6{font-size:12px;font-size:var(--font-size-h6)}p{margin:0 0 10px;margin:0 0 calc(var(--line-height-computed)/2)}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}ol,ul{margin-top:0;margin-bottom:10px;margin-bottom:calc(var(--line-height-computed)/2);ol,ul{margin-bottom:0}}.list-inline,.list-unstyled{padding-left:0;list-style:none}.list-inline{margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}code{font-family:Menlo,Monaco,Consolas,Courier New,monospace;font-family:var(--font-family-mono)}.hljs{display:block;overflow-x:auto;padding:.5em;color:#383a42;background:#fafafa}.hljs-comment,.hljs-quote{color:#a0a1a7;font-style:italic}.hljs-doctag,.hljs-formula,.hljs-keyword{color:#a626a4}.hljs-deletion,.hljs-name,.hljs-section,.hljs-selector-tag,.hljs-subst{color:#e45649}.hljs-literal{color:#0184bb}.hljs-addition,.hljs-attribute,.hljs-meta-string,.hljs-regexp,.hljs-string{color:#50a14f}.hljs-built_in,.hljs-class .hljs-title{color:#c18401}.hljs-attr,.hljs-number,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-pseudo,.hljs-template-variable,.hljs-type,.hljs-variable{color:#986801}.hljs-bullet,.hljs-link,.hljs-meta,.hljs-selector-id,.hljs-symbol,.hljs-title{color:#4078f2}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}.hljs-link{text-decoration:underline}.ct-label{fill:rgba(0,0,0,.4);color:rgba(0,0,0,.4);font-size:.75rem;line-height:1}.ct-chart-bar .ct-label,.ct-chart-line .ct-label{display:block;display:-webkit-flex;display:flex}.ct-chart-donut .ct-label,.ct-chart-pie .ct-label{dominant-baseline:central}.ct-label.ct-horizontal.ct-start{-webkit-align-items:flex-end;align-items:flex-end}.ct-label.ct-horizontal.ct-end,.ct-label.ct-horizontal.ct-start{-webkit-justify-content:flex-start;justify-content:flex-start;text-align:left;text-anchor:start}.ct-label.ct-horizontal.ct-end{-webkit-align-items:flex-start;align-items:flex-start}.ct-label.ct-vertical.ct-start{-webkit-align-items:flex-end;align-items:flex-end;-webkit-justify-content:flex-end;justify-content:flex-end;text-align:right;text-anchor:end}.ct-label.ct-vertical.ct-end{-webkit-align-items:flex-end;align-items:flex-end;-webkit-justify-content:flex-start;justify-content:flex-start;text-align:left;text-anchor:start}.ct-chart-bar .ct-label.ct-horizontal.ct-start{-webkit-align-items:flex-end;align-items:flex-end;-webkit-justify-content:center;justify-content:center;text-align:center;text-anchor:start}.ct-chart-bar .ct-label.ct-horizontal.ct-end{-webkit-align-items:flex-start;align-items:flex-start;-webkit-justify-content:center;justify-content:center;text-align:center;text-anchor:start}.ct-chart-bar.ct-horizontal-bars .ct-label.ct-horizontal.ct-start{-webkit-align-items:flex-end;align-items:flex-end;-webkit-justify-content:flex-start;justify-content:flex-start;text-align:left;text-anchor:start}.ct-chart-bar.ct-horizontal-bars .ct-label.ct-horizontal.ct-end{-webkit-align-items:flex-start;align-items:flex-start;-webkit-justify-content:flex-start;justify-content:flex-start;text-align:left;text-anchor:start}.ct-chart-bar.ct-horizontal-bars .ct-label.ct-vertical.ct-start{-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-end;justify-content:flex-end;text-align:right;text-anchor:end}.ct-chart-bar.ct-horizontal-bars .ct-label.ct-vertical.ct-end{-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-start;justify-content:flex-start;text-align:left;text-anchor:end}.ct-grid{stroke:rgba(0,0,0,.2);stroke-width:1px;stroke-dasharray:2px}.ct-grid-background{fill:none}.ct-point{stroke-width:10px;stroke-linecap:round}.ct-line{fill:none;stroke-width:4px}.ct-area{stroke:none;fill-opacity:.1}.ct-bar{fill:none;stroke-width:10px}.ct-slice-donut{fill:none;stroke-width:60px}.ct-series-a .ct-bar,.ct-series-a .ct-line,.ct-series-a .ct-point,.ct-series-a .ct-slice-donut{stroke:#d70206}.ct-series-a .ct-area,.ct-series-a .ct-slice-donut-solid,.ct-series-a .ct-slice-pie{fill:#d70206}.ct-series-b .ct-bar,.ct-series-b .ct-line,.ct-series-b .ct-point,.ct-series-b .ct-slice-donut{stroke:#f05b4f}.ct-series-b .ct-area,.ct-series-b .ct-slice-donut-solid,.ct-series-b .ct-slice-pie{fill:#f05b4f}.ct-series-c .ct-bar,.ct-series-c .ct-line,.ct-series-c .ct-point,.ct-series-c .ct-slice-donut{stroke:#f4c63d}.ct-series-c .ct-area,.ct-series-c .ct-slice-donut-solid,.ct-series-c .ct-slice-pie{fill:#f4c63d}.ct-series-d .ct-bar,.ct-series-d .ct-line,.ct-series-d .ct-point,.ct-series-d .ct-slice-donut{stroke:#d17905}.ct-series-d .ct-area,.ct-series-d .ct-slice-donut-solid,.ct-series-d .ct-slice-pie{fill:#d17905}.ct-series-e .ct-bar,.ct-series-e .ct-line,.ct-series-e .ct-point,.ct-series-e .ct-slice-donut{stroke:#453d3f}.ct-series-e .ct-area,.ct-series-e .ct-slice-donut-solid,.ct-series-e .ct-slice-pie{fill:#453d3f}.ct-series-f .ct-bar,.ct-series-f .ct-line,.ct-series-f .ct-point,.ct-series-f .ct-slice-donut{stroke:#59922b}.ct-series-f .ct-area,.ct-series-f .ct-slice-donut-solid,.ct-series-f .ct-slice-pie{fill:#59922b}.ct-series-g .ct-bar,.ct-series-g .ct-line,.ct-series-g .ct-point,.ct-series-g .ct-slice-donut{stroke:#0544d3}.ct-series-g .ct-area,.ct-series-g .ct-slice-donut-solid,.ct-series-g .ct-slice-pie{fill:#0544d3}.ct-series-h .ct-bar,.ct-series-h .ct-line,.ct-series-h .ct-point,.ct-series-h .ct-slice-donut{stroke:#6b0392}.ct-series-h .ct-area,.ct-series-h .ct-slice-donut-solid,.ct-series-h .ct-slice-pie{fill:#6b0392}.ct-series-i .ct-bar,.ct-series-i .ct-line,.ct-series-i .ct-point,.ct-series-i .ct-slice-donut{stroke:#f05b4f}.ct-series-i .ct-area,.ct-series-i .ct-slice-donut-solid,.ct-series-i .ct-slice-pie{fill:#f05b4f}.ct-series-j .ct-bar,.ct-series-j .ct-line,.ct-series-j .ct-point,.ct-series-j .ct-slice-donut{stroke:#dda458}.ct-series-j .ct-area,.ct-series-j .ct-slice-donut-solid,.ct-series-j .ct-slice-pie{fill:#dda458}.ct-series-k .ct-bar,.ct-series-k .ct-line,.ct-series-k .ct-point,.ct-series-k .ct-slice-donut{stroke:#eacf7d}.ct-series-k .ct-area,.ct-series-k .ct-slice-donut-solid,.ct-series-k .ct-slice-pie{fill:#eacf7d}.ct-series-l .ct-bar,.ct-series-l .ct-line,.ct-series-l .ct-point,.ct-series-l .ct-slice-donut{stroke:#86797d}.ct-series-l .ct-area,.ct-series-l .ct-slice-donut-solid,.ct-series-l .ct-slice-pie{fill:#86797d}.ct-series-m .ct-bar,.ct-series-m .ct-line,.ct-series-m .ct-point,.ct-series-m .ct-slice-donut{stroke:#b2c326}.ct-series-m .ct-area,.ct-series-m .ct-slice-donut-solid,.ct-series-m .ct-slice-pie{fill:#b2c326}.ct-series-n .ct-bar,.ct-series-n .ct-line,.ct-series-n .ct-point,.ct-series-n .ct-slice-donut{stroke:#6188e2}.ct-series-n .ct-area,.ct-series-n .ct-slice-donut-solid,.ct-series-n .ct-slice-pie{fill:#6188e2}.ct-series-o .ct-bar,.ct-series-o .ct-line,.ct-series-o .ct-point,.ct-series-o .ct-slice-donut{stroke:#a748ca}.ct-series-o .ct-area,.ct-series-o .ct-slice-donut-solid,.ct-series-o .ct-slice-pie{fill:#a748ca}.ct-square{display:block;position:relative;width:100%}.ct-square:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:100%}.ct-square:after{content:"";display:table;clear:both}.ct-square>svg{display:block;position:absolute;top:0;left:0}.ct-minor-second{display:block;position:relative;width:100%}.ct-minor-second:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:93.75%}.ct-minor-second:after{content:"";display:table;clear:both}.ct-minor-second>svg{display:block;position:absolute;top:0;left:0}.ct-major-second{display:block;position:relative;width:100%}.ct-major-second:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:88.8888888889%}.ct-major-second:after{content:"";display:table;clear:both}.ct-major-second>svg{display:block;position:absolute;top:0;left:0}.ct-minor-third{display:block;position:relative;width:100%}.ct-minor-third:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:83.3333333333%}.ct-minor-third:after{content:"";display:table;clear:both}.ct-minor-third>svg{display:block;position:absolute;top:0;left:0}.ct-major-third{display:block;position:relative;width:100%}.ct-major-third:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:80%}.ct-major-third:after{content:"";display:table;clear:both}.ct-major-third>svg{display:block;position:absolute;top:0;left:0}.ct-perfect-fourth{display:block;position:relative;width:100%}.ct-perfect-fourth:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:75%}.ct-perfect-fourth:after{content:"";display:table;clear:both}.ct-perfect-fourth>svg{display:block;position:absolute;top:0;left:0}.ct-perfect-fifth{display:block;position:relative;width:100%}.ct-perfect-fifth:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:66.6666666667%}.ct-perfect-fifth:after{content:"";display:table;clear:both}.ct-perfect-fifth>svg{display:block;position:absolute;top:0;left:0}.ct-minor-sixth{display:block;position:relative;width:100%}.ct-minor-sixth:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:62.5%}.ct-minor-sixth:after{content:"";display:table;clear:both}.ct-minor-sixth>svg{display:block;position:absolute;top:0;left:0}.ct-golden-section{display:block;position:relative;width:100%}.ct-golden-section:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:61.804697157%}.ct-golden-section:after{content:"";display:table;clear:both}.ct-golden-section>svg{display:block;position:absolute;top:0;left:0}.ct-major-sixth{display:block;position:relative;width:100%}.ct-major-sixth:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:60%}.ct-major-sixth:after{content:"";display:table;clear:both}.ct-major-sixth>svg{display:block;position:absolute;top:0;left:0}.ct-minor-seventh{display:block;position:relative;width:100%}.ct-minor-seventh:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:56.25%}.ct-minor-seventh:after{content:"";display:table;clear:both}.ct-minor-seventh>svg{display:block;position:absolute;top:0;left:0}.ct-major-seventh{display:block;position:relative;width:100%}.ct-major-seventh:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:53.3333333333%}.ct-major-seventh:after{content:"";display:table;clear:both}.ct-major-seventh>svg{display:block;position:absolute;top:0;left:0}.ct-octave{display:block;position:relative;width:100%}.ct-octave:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:50%}.ct-octave:after{content:"";display:table;clear:both}.ct-octave>svg{display:block;position:absolute;top:0;left:0}.ct-major-tenth{display:block;position:relative;width:100%}.ct-major-tenth:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:40%}.ct-major-tenth:after{content:"";display:table;clear:both}.ct-major-tenth>svg{display:block;position:absolute;top:0;left:0}.ct-major-eleventh{display:block;position:relative;width:100%}.ct-major-eleventh:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:37.5%}.ct-major-eleventh:after{content:"";display:table;clear:both}.ct-major-eleventh>svg{display:block;position:absolute;top:0;left:0}.ct-major-twelfth{display:block;position:relative;width:100%}.ct-major-twelfth:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:33.3333333333%}.ct-major-twelfth:after{content:"";display:table;clear:both}.ct-major-twelfth>svg{display:block;position:absolute;top:0;left:0}.ct-double-octave{display:block;position:relative;width:100%}.ct-double-octave:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:25%}.ct-double-octave:after{content:"";display:table;clear:both}.ct-double-octave>svg{display:block;position:absolute;top:0;left:0}@font-face{font-family:robotolight;src:url(roboto-light-webfont.woff2) format("woff2"),url(roboto-light-webfont.woff) format("woff");font-weight:400;font-style:normal}@font-face{font-family:robotomedium;src:url(roboto-medium-webfont.woff2) format("woff2"),url(roboto-medium-webfont.woff) format("woff");font-weight:400;font-style:normal}@font-face{font-family:robotoregular;src:url(roboto-regular-webfont.woff2) format("woff2"),url(roboto-regular-webfont.woff) format("woff");font-weight:400;font-style:normal}@font-face{font-family:Material Icons;font-style:normal;font-weight:400;src:url(MaterialIcons-Regular.woff2) format("woff2"),url(MaterialIcons-Regular.woff) format("woff")}.material-icons{display:inline-block;font-family:Material Icons;font-weight:400;font-style:normal;font-size:24px;line-height:1;text-transform:none;letter-spacing:normal;word-wrap:normal;white-space:nowrap;direction:ltr;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;-webkit-font-feature-settings:"liga";font-feature-settings:"liga"}.material-icons.md-18{font-size:18px}.material-icons.md-24{font-size:24px}.material-icons.md-36{font-size:36px}.material-icons.md-48{font-size:48px}.material-icons.md-dark{color:rgba(0,0,0,.54)}.material-icons.md-dark.md-inactive{color:rgba(0,0,0,.26)}.material-icons.md-light{color:#fff}.material-icons.md-light.md-inactive{color:hsla(0,0%,100%,.3)}*,:after,:before{box-sizing:border-box}html{position:relative;min-height:100%}body{font-family:robotoregular,Helvetica Neue,Helvetica,Arial,sans-serif;font-family:var(--font-family-base);font-size:14px;font-size:var(--font-size-base);line-height:1.429;line-height:var(--line-height-base);color:rgba(0,0,0,.87);color:var(--text-color);background-color:#f2f2f2;background-color:var(--body-bg);margin-bottom:60px;margin-bottom:var(--footer-height)}a{text-decoration:none;transition:color .2s ease-out;transition:var(--link-transition)}a:hover{text-decoration:underline}pre{word-break:break-all;word-wrap:break-word;border-radius:4px}.cf:before,.clearfix:before{content:" ";display:table}.cf:after,.clearfix:after{content:" ";display:table;clear:both}.container:after,.container:before{content:" ";display:table}.container:after{clear:both}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-left:calc(var(--grid-gutter-width)/2);padding-right:15px;padding-right:calc(var(--grid-gutter-width)/2)}.row:after,.row:before{content:" ";display:table}.row:after{clear:both}.row{margin-left:-15px;margin-left:calc(var(--grid-gutter-width)/-2);margin-right:-15px;margin-right:calc(var(--grid-gutter-width)/-2)}.details{padding-top:146px;padding-top:calc(var(--navbar-height) + 24px)}.z-depth-0{box-shadow:none!important}.z-depth-1{box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12)}.z-depth-1-half{box-shadow:0 5px 11px 0 rgba(0,0,0,.18),0 4px 15px 0 rgba(0,0,0,.15)}.z-depth-2{box-shadow:0 8px 17px 0 rgba(0,0,0,.2),0 6px 20px 0 rgba(0,0,0,.19)}.z-depth-3{box-shadow:0 12px 15px 0 rgba(0,0,0,.24),0 17px 50px 0 rgba(0,0,0,.19)}.z-depth-4{box-shadow:0 16px 28px 0 rgba(0,0,0,.22),0 25px 55px 0 rgba(0,0,0,.21)}.z-depth-5{box-shadow:0 27px 24px 0 rgba(0,0,0,.2),0 40px 77px 0 rgba(0,0,0,.22)}@media (min-width:768px){.container{width:750px;width:var(--container-sm)}.details{padding-top:80px;padding-top:calc(var(--navbar-height-short) + 24px)}}@media (min-width:992px){.container{width:970px;width:var(--container-md)}}@media (min-width:1200px){.container{width:1170px;width:var(--container-lg)}} +:root{--screen-sm-min:768px;--screen-md-min:992px;--screen-lg-min:1200px;--grid-gutter-width:30px;--container-sm:calc(720px + var(--grid-gutter-width));--container-md:calc(940px + var(--grid-gutter-width));--container-lg:calc(1140px + var(--grid-gutter-width));--navbar-height:122px;--navbar-height-short:56px;--summary-height-stacked:82px;--statusbar-height-stacked:54px;--footer-height:60px;--default-transition-duration:0.2s;--default-transition-easing:ease;--gray-base:#000;--gray-darker-faded:color(var(--gray-darker) alpha(95%));--gray-darker:color(var(--gray-base) tint(13.5%));--gray-dark:color(var(--gray-base) tint(20%));--gray:color(var(--gray-base) tint(33.5%));--gray-light:color(var(--gray-base) tint(46.7%));--gray-medium:color(var(--gray-base) tint(73.5%));--gray-lighter:color(var(--gray-base) tint(93.5%));--gray-lighter-faded:color(var(--gray-lighter) alpha(95%));--gray-border:color(var(--gray-base) tint(80%));--grey50:#eceff1;--grey100:#f5f5f5;--grey300:#e0e0e0;--grey500:#9e9e9e;--grey700:#616161;--green100:#c8e6c9;--green200:#a5d6a7;--green300:#81c784;--green500:#4caf50;--green700:#388e3c;--red100:#ffcdd2;--red300:#e57373;--red500:#f44336;--red700:#d32f2f;--ltblue100:#b3e5fc;--ltblue300:#4fc3f7;--ltblue500:#03a9f4;--ltblue700:#0288d1;--black87:rgba(0,0,0,0.87);--black54:rgba(0,0,0,0.54);--black38:rgba(0,0,0,0.38);--bluegrey500:#607d8b;--bluegrey800:#37474f;--bluegrey900:#263238;--light-icon-active:#fff;--light-icon-inactive:hsla(0,0%,100%,0.5);--dark-icon-active:var(--black54);--dark-icon-inactive:var(--black38);--amber300:#ffd54f;--amber400:#ffca28;--amber500:#ffc107;--yellow700:#fbc02d;--yellow800:#f9a825;--brand-primary:color(#428bca shade(6.5%));--brand-success:#4caf50;--brand-info:#5bc0de;--brand-warning:#f0ad4e;--brand-danger:#d9534f;--text-color:var(--black87);--body-bg:#f2f2f2;--link-color:var(--brand-primary);--link-hover-color:color(var(--link-color) shade(15%));--list-group-border:#ddd;--font-family-sans-serif:"robotoregular","Helvetica Neue",Helvetica,Arial,sans-serif;--font-family-base:var(--font-family-sans-serif);--font-family-mono:"Menlo","Monaco","Consolas","Courier New",monospace;--font-size-base:14px;--line-height-base:1.429;--line-height-computed:20px;--headings-font-family:inherit;--headings-font-weight:400;--headings-line-height:1.1;--headings-color:inherit;--headings-small-color:var(--gray-light);--font-size-h1:36px;--font-size-h2:30px;--font-size-h3:24px;--font-size-h4:18px;--font-size-h5:var(--font-size-base);--font-size-h6:12px;--font-family-light:"robotolight";--font-family-regular:"robotoregular";--font-family-medium:"robotomedium";--link-transition:color 0.2s ease-out}.navbar--trans-color---1tk7E{transition:color .2s ease-out;transition:var(--link-transition)}.navbar--component---2UCEi:after,.navbar--component---2UCEi:before{content:" ";display:table}.navbar--component---2UCEi:after{clear:both}.navbar--component---2UCEi{position:fixed;-webkit-flex-direction:column;flex-direction:column;top:0;right:0;left:0;z-index:1030;min-height:122px;min-height:var(--navbar-height);height:122px;height:var(--navbar-height);margin-bottom:0;border:none;background:#37474f;background:var(--bluegrey800)}.navbar--component---2UCEi,.navbar--report-info-cnt---8y9Bb{display:-webkit-flex;display:flex}.navbar--report-info-cnt---8y9Bb{overflow:hidden;padding-right:12px}.navbar--menu-button---1ZRpz{border:none;background:transparent;padding:0}.navbar--menu-button---1ZRpz:focus{box-shadow:0 0 2px 0 #03a9f4;box-shadow:0 0 2px 0 var(--ltblue500);outline:none}.navbar--menu-button---1ZRpz{cursor:pointer;transition:color .2s ease-out;transition:var(--link-transition);height:40px;margin:8px 8px 0;padding:8px;color:hsla(0,0%,100%,.5);color:var(--light-icon-inactive)}.navbar--menu-button---1ZRpz:hover{color:#fff;color:var(--light-icon-active)}.navbar--report-title---3bXCv{-webkit-flex-grow:1;flex-grow:1;font-family:var(--font-family--light);color:#fff;font-size:18px;line-height:52px;line-height:calc(var(--navbar-height-short) - 4px);margin:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.navbar--pct-bar---3EwW-:after,.navbar--pct-bar---3EwW-:before{content:" ";display:table}.navbar--pct-bar---3EwW-:after{clear:both}.navbar--pct-bar---3EwW-{display:-webkit-flex;display:flex;position:absolute;left:0;right:0;bottom:0;height:4px}.navbar--pct-bar---3EwW- .navbar--pass---2oR-w{background-color:#4caf50;background-color:var(--green500)}.navbar--pct-bar---3EwW- .navbar--fail---3mN80{background-color:#f44336;background-color:var(--red500)}.navbar--pct-bar---3EwW- .navbar--pend---2iqjh{background-color:#03a9f4;background-color:var(--ltblue500)}.navbar--pct-bar-segment---3T0_o{height:4px}@media (min-width:768px){.navbar--component---2UCEi{min-height:56px;min-height:var(--navbar-height-short);height:56px;height:var(--navbar-height-short);-webkit-flex-direction:initial;flex-direction:row}.navbar--report-info-cnt---8y9Bb{-webkit-flex-grow:1;flex-grow:1}} +:root{--screen-sm-min:768px;--screen-md-min:992px;--screen-lg-min:1200px;--grid-gutter-width:30px;--container-sm:calc(720px + var(--grid-gutter-width));--container-md:calc(940px + var(--grid-gutter-width));--container-lg:calc(1140px + var(--grid-gutter-width));--navbar-height:122px;--navbar-height-short:56px;--summary-height-stacked:82px;--statusbar-height-stacked:54px;--footer-height:60px;--default-transition-duration:0.2s;--default-transition-easing:ease;--gray-base:#000;--gray-darker-faded:color(var(--gray-darker) alpha(95%));--gray-darker:color(var(--gray-base) tint(13.5%));--gray-dark:color(var(--gray-base) tint(20%));--gray:color(var(--gray-base) tint(33.5%));--gray-light:color(var(--gray-base) tint(46.7%));--gray-medium:color(var(--gray-base) tint(73.5%));--gray-lighter:color(var(--gray-base) tint(93.5%));--gray-lighter-faded:color(var(--gray-lighter) alpha(95%));--gray-border:color(var(--gray-base) tint(80%));--grey50:#eceff1;--grey100:#f5f5f5;--grey300:#e0e0e0;--grey500:#9e9e9e;--grey700:#616161;--green100:#c8e6c9;--green200:#a5d6a7;--green300:#81c784;--green500:#4caf50;--green700:#388e3c;--red100:#ffcdd2;--red300:#e57373;--red500:#f44336;--red700:#d32f2f;--ltblue100:#b3e5fc;--ltblue300:#4fc3f7;--ltblue500:#03a9f4;--ltblue700:#0288d1;--black87:rgba(0,0,0,0.87);--black54:rgba(0,0,0,0.54);--black38:rgba(0,0,0,0.38);--bluegrey500:#607d8b;--bluegrey800:#37474f;--bluegrey900:#263238;--light-icon-active:#fff;--light-icon-inactive:hsla(0,0%,100%,0.5);--dark-icon-active:var(--black54);--dark-icon-inactive:var(--black38);--amber300:#ffd54f;--amber400:#ffca28;--amber500:#ffc107;--yellow700:#fbc02d;--yellow800:#f9a825;--brand-primary:color(#428bca shade(6.5%));--brand-success:#4caf50;--brand-info:#5bc0de;--brand-warning:#f0ad4e;--brand-danger:#d9534f;--text-color:var(--black87);--body-bg:#f2f2f2;--link-color:var(--brand-primary);--link-hover-color:color(var(--link-color) shade(15%));--list-group-border:#ddd;--font-family-sans-serif:"robotoregular","Helvetica Neue",Helvetica,Arial,sans-serif;--font-family-base:var(--font-family-sans-serif);--font-family-mono:"Menlo","Monaco","Consolas","Courier New",monospace;--font-size-base:14px;--line-height-base:1.429;--line-height-computed:20px;--headings-font-family:inherit;--headings-font-weight:400;--headings-line-height:1.1;--headings-color:inherit;--headings-small-color:var(--gray-light);--font-size-h1:36px;--font-size-h2:30px;--font-size-h3:24px;--font-size-h4:18px;--font-size-h5:var(--font-size-base);--font-size-h6:12px;--font-family-light:"robotolight";--font-family-regular:"robotoregular";--font-family-medium:"robotomedium";--link-transition:color 0.2s ease-out}.quick-summary--trans-color---HUJqE{transition:color .2s ease-out;transition:var(--link-transition)}.quick-summary--cnt---3s38x{display:-webkit-flex;display:flex;-webkit-flex-direction:column;flex-direction:column;padding:0 12px}.quick-summary--list---2_80W:after,.quick-summary--list---2_80W:before{content:" ";display:table}.quick-summary--list---2_80W:after{clear:both}.quick-summary--list---2_80W{list-style:none;padding-left:0;transition:opacity .2s ease-out;margin:0 0 8px}.quick-summary--item---bfSQ0,.quick-summary--list---2_80W{display:-webkit-flex;display:flex}.quick-summary--item---bfSQ0{font-family:var(--font-family--light);-webkit-align-items:flex-start;align-items:flex-start;color:#fff;font-size:16px;-webkit-flex-basis:25%;flex-basis:25%}.quick-summary--item---bfSQ0 button{border:none;background:transparent;padding:0}.quick-summary--item---bfSQ0 button:focus{box-shadow:0 0 2px 0 #03a9f4;box-shadow:0 0 2px 0 var(--ltblue500);outline:none}.quick-summary--item---bfSQ0 button{transition:color .2s ease-out;transition:var(--link-transition);display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;color:#fff;cursor:pointer}.quick-summary--item---bfSQ0 button:hover .quick-summary--icon---TW1oG{border-color:#fff}.quick-summary--item---bfSQ0.quick-summary--tests---2nNut{color:#fff}.quick-summary--item---bfSQ0.quick-summary--passes---3IjYH .quick-summary--icon---TW1oG{color:#388e3c;color:var(--green700);background-color:#c8e6c9;background-color:var(--green100)}.quick-summary--single-filter---31Thy .quick-summary--item---bfSQ0.quick-summary--passes---3IjYH .quick-summary--icon---TW1oG{background-color:#e0e0e0;background-color:var(--grey300);color:#9e9e9e;color:var(--grey500)}.quick-summary--single-filter--passed---3QnUL .quick-summary--item---bfSQ0.quick-summary--passes---3IjYH .quick-summary--icon---TW1oG{color:#fff;background-color:#388e3c;background-color:var(--green700)}.quick-summary--item---bfSQ0.quick-summary--failures---14s29 .quick-summary--icon---TW1oG{color:#d32f2f;color:var(--red700);background-color:#ffcdd2;background-color:var(--red100)}.quick-summary--single-filter---31Thy .quick-summary--item---bfSQ0.quick-summary--failures---14s29 .quick-summary--icon---TW1oG{background-color:#e0e0e0;background-color:var(--grey300);color:#9e9e9e;color:var(--grey500)}.quick-summary--single-filter--failed---3_tAw .quick-summary--item---bfSQ0.quick-summary--failures---14s29 .quick-summary--icon---TW1oG{color:#fff;background-color:#d32f2f;background-color:var(--red700)}.quick-summary--item---bfSQ0.quick-summary--pending---261aV .quick-summary--icon---TW1oG{color:#0288d1;color:var(--ltblue700);background-color:#b3e5fc;background-color:var(--ltblue100)}.quick-summary--single-filter---31Thy .quick-summary--item---bfSQ0.quick-summary--pending---261aV .quick-summary--icon---TW1oG{background-color:#e0e0e0;background-color:var(--grey300);color:#9e9e9e;color:var(--grey500)}.quick-summary--single-filter--pending---21lZM .quick-summary--item---bfSQ0.quick-summary--pending---261aV .quick-summary--icon---TW1oG{color:#fff;background-color:#0288d1;background-color:var(--ltblue700)}.quick-summary--item---bfSQ0.quick-summary--skipped---tyOc4 .quick-summary--icon---TW1oG{color:#616161;color:var(--grey700);background-color:#f5f5f5;background-color:var(--grey100)}.quick-summary--single-filter---31Thy .quick-summary--item---bfSQ0.quick-summary--skipped---tyOc4 .quick-summary--icon---TW1oG{background-color:#e0e0e0;background-color:var(--grey300);color:#9e9e9e;color:var(--grey500)}.quick-summary--single-filter--skipped---1AdZA .quick-summary--item---bfSQ0.quick-summary--skipped---tyOc4 .quick-summary--icon---TW1oG{color:#fff;background-color:#616161;background-color:var(--grey700)}.quick-summary--icon---TW1oG{position:relative;top:2px;font-size:18px;margin-right:4px}.quick-summary--circle-icon---1HDS7{font-size:12px;border-radius:50%;padding:2px;border:1px solid transparent;transition:border-color .2s ease-out}@media (min-width:768px){.quick-summary--cnt---3s38x{-webkit-flex-direction:initial;flex-direction:row;padding:14px 12px 0 0}.quick-summary--list---2_80W{margin:0}.quick-summary--item---bfSQ0{font-size:18px;-webkit-flex-basis:initial;flex-basis:auto;margin:0 12px}.quick-summary--icon---TW1oG{font-size:24px;width:24px;top:0}.quick-summary--circle-icon---1HDS7{font-size:18px}} +:root{--screen-sm-min:768px;--screen-md-min:992px;--screen-lg-min:1200px;--grid-gutter-width:30px;--container-sm:calc(720px + var(--grid-gutter-width));--container-md:calc(940px + var(--grid-gutter-width));--container-lg:calc(1140px + var(--grid-gutter-width));--navbar-height:122px;--navbar-height-short:56px;--summary-height-stacked:82px;--statusbar-height-stacked:54px;--footer-height:60px;--default-transition-duration:0.2s;--default-transition-easing:ease;--gray-base:#000;--gray-darker-faded:color(var(--gray-darker) alpha(95%));--gray-darker:color(var(--gray-base) tint(13.5%));--gray-dark:color(var(--gray-base) tint(20%));--gray:color(var(--gray-base) tint(33.5%));--gray-light:color(var(--gray-base) tint(46.7%));--gray-medium:color(var(--gray-base) tint(73.5%));--gray-lighter:color(var(--gray-base) tint(93.5%));--gray-lighter-faded:color(var(--gray-lighter) alpha(95%));--gray-border:color(var(--gray-base) tint(80%));--grey50:#eceff1;--grey100:#f5f5f5;--grey300:#e0e0e0;--grey500:#9e9e9e;--grey700:#616161;--green100:#c8e6c9;--green200:#a5d6a7;--green300:#81c784;--green500:#4caf50;--green700:#388e3c;--red100:#ffcdd2;--red300:#e57373;--red500:#f44336;--red700:#d32f2f;--ltblue100:#b3e5fc;--ltblue300:#4fc3f7;--ltblue500:#03a9f4;--ltblue700:#0288d1;--black87:rgba(0,0,0,0.87);--black54:rgba(0,0,0,0.54);--black38:rgba(0,0,0,0.38);--bluegrey500:#607d8b;--bluegrey800:#37474f;--bluegrey900:#263238;--light-icon-active:#fff;--light-icon-inactive:hsla(0,0%,100%,0.5);--dark-icon-active:var(--black54);--dark-icon-inactive:var(--black38);--amber300:#ffd54f;--amber400:#ffca28;--amber500:#ffc107;--yellow700:#fbc02d;--yellow800:#f9a825;--brand-primary:color(#428bca shade(6.5%));--brand-success:#4caf50;--brand-info:#5bc0de;--brand-warning:#f0ad4e;--brand-danger:#d9534f;--text-color:var(--black87);--body-bg:#f2f2f2;--link-color:var(--brand-primary);--link-hover-color:color(var(--link-color) shade(15%));--list-group-border:#ddd;--font-family-sans-serif:"robotoregular","Helvetica Neue",Helvetica,Arial,sans-serif;--font-family-base:var(--font-family-sans-serif);--font-family-mono:"Menlo","Monaco","Consolas","Courier New",monospace;--font-size-base:14px;--line-height-base:1.429;--line-height-computed:20px;--headings-font-family:inherit;--headings-font-weight:400;--headings-line-height:1.1;--headings-color:inherit;--headings-small-color:var(--gray-light);--font-size-h1:36px;--font-size-h2:30px;--font-size-h3:24px;--font-size-h4:18px;--font-size-h5:var(--font-size-base);--font-size-h6:12px;--font-family-light:"robotolight";--font-family-regular:"robotoregular";--font-family-medium:"robotomedium";--link-transition:color 0.2s ease-out}.radio-button--trans-color---egsik{transition:color .2s ease-out;transition:var(--link-transition)}.radio-button--component---1ix3c:after,.radio-button--component---1ix3c:before{content:" ";display:table}.radio-button--component---1ix3c:after{clear:both}.radio-button--component---1ix3c{position:relative;height:24px}.radio-button--outer---a_NqL{position:absolute;top:50%;right:0;margin-top:-9px;width:18px;height:18px;border:2px solid #4caf50;border:2px solid var(--green500);border-radius:12px;cursor:pointer;transition:border-color .2s ease-out}.radio-button--off---dBAOK{border-color:color(#000 tint(73.5%));border-color:var(--gray-medium)}.radio-button--inner---3bo9Q{display:block;position:absolute;top:2px;right:2px;width:10px;height:10px;border-radius:100%;background-color:#4caf50;background-color:var(--green500)}.radio-button--off---dBAOK .radio-button--inner---3bo9Q{background-color:#fff;-webkit-transform:scale(0);transform:scale(0)}.radio-button--inner---3bo9Q{transition:all .15s cubic-bezier(.23,1,.32,1)} +:root{--screen-sm-min:768px;--screen-md-min:992px;--screen-lg-min:1200px;--grid-gutter-width:30px;--container-sm:calc(720px + var(--grid-gutter-width));--container-md:calc(940px + var(--grid-gutter-width));--container-lg:calc(1140px + var(--grid-gutter-width));--navbar-height:122px;--navbar-height-short:56px;--summary-height-stacked:82px;--statusbar-height-stacked:54px;--footer-height:60px;--default-transition-duration:0.2s;--default-transition-easing:ease;--gray-base:#000;--gray-darker-faded:color(var(--gray-darker) alpha(95%));--gray-darker:color(var(--gray-base) tint(13.5%));--gray-dark:color(var(--gray-base) tint(20%));--gray:color(var(--gray-base) tint(33.5%));--gray-light:color(var(--gray-base) tint(46.7%));--gray-medium:color(var(--gray-base) tint(73.5%));--gray-lighter:color(var(--gray-base) tint(93.5%));--gray-lighter-faded:color(var(--gray-lighter) alpha(95%));--gray-border:color(var(--gray-base) tint(80%));--grey50:#eceff1;--grey100:#f5f5f5;--grey300:#e0e0e0;--grey500:#9e9e9e;--grey700:#616161;--green100:#c8e6c9;--green200:#a5d6a7;--green300:#81c784;--green500:#4caf50;--green700:#388e3c;--red100:#ffcdd2;--red300:#e57373;--red500:#f44336;--red700:#d32f2f;--ltblue100:#b3e5fc;--ltblue300:#4fc3f7;--ltblue500:#03a9f4;--ltblue700:#0288d1;--black87:rgba(0,0,0,0.87);--black54:rgba(0,0,0,0.54);--black38:rgba(0,0,0,0.38);--bluegrey500:#607d8b;--bluegrey800:#37474f;--bluegrey900:#263238;--light-icon-active:#fff;--light-icon-inactive:hsla(0,0%,100%,0.5);--dark-icon-active:var(--black54);--dark-icon-inactive:var(--black38);--amber300:#ffd54f;--amber400:#ffca28;--amber500:#ffc107;--yellow700:#fbc02d;--yellow800:#f9a825;--brand-primary:color(#428bca shade(6.5%));--brand-success:#4caf50;--brand-info:#5bc0de;--brand-warning:#f0ad4e;--brand-danger:#d9534f;--text-color:var(--black87);--body-bg:#f2f2f2;--link-color:var(--brand-primary);--link-hover-color:color(var(--link-color) shade(15%));--list-group-border:#ddd;--font-family-sans-serif:"robotoregular","Helvetica Neue",Helvetica,Arial,sans-serif;--font-family-base:var(--font-family-sans-serif);--font-family-mono:"Menlo","Monaco","Consolas","Courier New",monospace;--font-size-base:14px;--line-height-base:1.429;--line-height-computed:20px;--headings-font-family:inherit;--headings-font-weight:400;--headings-line-height:1.1;--headings-color:inherit;--headings-small-color:var(--gray-light);--font-size-h1:36px;--font-size-h2:30px;--font-size-h3:24px;--font-size-h4:18px;--font-size-h5:var(--font-size-base);--font-size-h6:12px;--font-family-light:"robotolight";--font-family-regular:"robotoregular";--font-family-medium:"robotomedium";--link-transition:color 0.2s ease-out}.test--trans-color---3sP2r{transition:color .2s ease-out;transition:var(--link-transition)}.test--component---1mwsi{border-bottom:1px solid #e0e0e0;border-bottom:1px solid var(--grey300)}.test--component---1mwsi.test--expanded---3hI0z.test--passed---38wAs .test--body-wrap---3EGPT,.test--component---1mwsi.test--expanded---3hI0z.test--passed---38wAs .test--header-btn---mI0Oy{border-left-color:#4caf50;border-left-color:var(--green500)}.test--component---1mwsi.test--expanded---3hI0z.test--failed---2PZhW .test--body-wrap---3EGPT,.test--component---1mwsi.test--expanded---3hI0z.test--failed---2PZhW .test--header-btn---mI0Oy{border-left-color:#f44336;border-left-color:var(--red500)}.test--list---24Hjy{list-style-type:none;margin:0;padding:0}.test--header-btn---mI0Oy{display:-webkit-flex;display:flex;position:relative;background:#fff;border:none;border-left:3px solid transparent;cursor:pointer;-webkit-flex-wrap:wrap;flex-wrap:wrap;padding:10px 16px 10px 13px;transition:border-color .2s ease-out;width:100%}.test--header-btn---mI0Oy[disabled]{cursor:default}.test--header-btn---mI0Oy:focus{box-shadow:0 0 2px 0 #03a9f4;box-shadow:0 0 2px 0 var(--ltblue500);outline:none}.test--header-btn---mI0Oy:focus:not([disabled]),.test--header-btn---mI0Oy:hover:not([disabled]){border-left-color:#9e9e9e;border-left-color:var(--grey500)}.test--title---4c0rg{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;-webkit-flex-grow:1;flex-grow:1;font-family:var(--font-family--regular);font-size:13px;line-height:24px;margin:0;padding-right:12px;text-align:left}.test--hook---3T4lI .test--title---4c0rg{color:rgba(0,0,0,.54);color:var(--black54)}.test--expanded---3hI0z .test--title---4c0rg{line-height:1.5;padding-top:3px;white-space:normal}.test--icon---2jgH_{-webkit-align-self:flex-start;align-self:flex-start;padding:3px;border-radius:50%;color:#fff;margin-right:16px}.test--icon---2jgH_.test--pass---C1Mk7{color:#c8e6c9;color:var(--green100);background-color:#4caf50;background-color:var(--green500)}.test--icon---2jgH_.test--fail---3u2w0{color:#ffcdd2;color:var(--red100);background-color:#f44336;background-color:var(--red500)}.test--icon---2jgH_.test--pending---3Ctfm{color:#b3e5fc;color:var(--ltblue100);background-color:#03a9f4;background-color:var(--ltblue500)}.test--icon---2jgH_.test--skipped---3aU0Y{color:#f5f5f5;color:var(--grey100);background-color:#9e9e9e;background-color:var(--grey500)}.test--icon---2jgH_.test--hook---3T4lI{color:rgba(0,0,0,.38);color:var(--black38);padding:0}.test--failed---2PZhW .test--icon---2jgH_.test--hook---3T4lI{color:#f44336;color:var(--red500)}.test--info---1UQNw{display:-webkit-flex;display:flex}.test--duration---2tVp5{font-family:var(--font-family--regular);line-height:24px;color:rgba(0,0,0,.54);color:var(--black54)}.test--component---1mwsi:hover:not(.test--pending---3Ctfm) .test--duration---2tVp5,.test--expanded---3hI0z .test--duration---2tVp5{color:rgba(0,0,0,.87);color:var(--black87)}.test--duration---2tVp5{transition:color .2s ease-out}.test--duration-icon---2KnOU{margin-left:4px;line-height:24px!important;color:rgba(0,0,0,.38);color:var(--black38)}.test--duration-icon---2KnOU.test--slow---MQOnF{color:#e57373;color:var(--red300)}.test--duration-icon---2KnOU.test--medium---5j890{color:#fbc02d;color:var(--yellow700)}.test--context-icon---2POzC{position:relative;line-height:24px!important;color:rgba(0,0,0,.38);color:var(--black38);margin-right:8px;top:1px}.test--body-wrap---3EGPT{border-left:3px solid transparent;transition:border-color .2s ease-out}.test--expanded---3hI0z .test--body-wrap---3EGPT{display:block;padding-bottom:10px}.test--body---Ox0q_{display:none;background-color:#fafafa;border:1px solid #eceff1;border:1px solid var(--grey50);border-radius:4px}.test--expanded---3hI0z .test--body---Ox0q_{display:block;margin:0 16px 0 13px}.test--error-message---3Grn0{color:#f44336;color:var(--red500);font-size:12px;margin:10px 0 0;text-align:left;width:100%;word-break:break-word}.test--code-snippet---3H5Xj{position:relative;font-size:11px;margin:0;border-radius:0}.test--code-snippet---3H5Xj+.test--code-snippet---3H5Xj{border-top:1px solid #fff}.test--code-snippet---3H5Xj.hljs{padding:1em;background:none}.test--code-diff---2XQsb code>span:first-child{margin-right:11px}.test--code-diff-expected---1QWLl span{color:#859900}.test--inline-diff---3OmYO .test--code-diff-expected---1QWLl{background-color:#859900;color:#fff}.test--code-diff-actual---3MMxN span{color:#dc322f}.test--inline-diff---3OmYO .test--code-diff-actual---3MMxN{background-color:#dc322f;color:#fff}.test--code-label---1QEUY{position:absolute;font-family:var(--font-family--regular);top:0;right:0;padding:.2em .6em;background-color:#9e9e9e;background-color:var(--grey500);color:#fff}.test--context---1YYgX{background-color:#fff;border-top:1px solid #eceff1;border-top:1px solid var(--grey50);border-bottom-left-radius:4px;border-bottom-right-radius:4px}.test--context-title---HHH10{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:var(--font-family--regular);font-size:13px;color:rgba(0,0,0,.54);color:var(--black54);margin:0;padding:11px 11px 0}.test--context-item---R1NNU{padding-top:11px}.test--context-item---R1NNU .test--code-snippet---3H5Xj{padding-top:0}.test--context-item-title---1KxIO{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:var(--font-family--medium);font-size:13px;margin:0;padding:0 11px 11px}.test--text-link---2_cSn{display:inline-block;padding:0 1em 1em;font-family:Menlo,Monaco,Consolas,Courier New,monospace;font-family:var(--font-family-mono);font-size:11px;color:#0288d1;color:var(--ltblue700)}.test--text-link---2_cSn:hover{color:#03a9f4;color:var(--ltblue500)}.test--image-link---PUFPJ,.test--video-link---1L-2D{display:inline-block;font-size:11px;padding:0 1em 1em}.test--image---2Z5X2,.test--video---2JK7O{display:block;max-width:100%;height:auto} +:root{--screen-sm-min:768px;--screen-md-min:992px;--screen-lg-min:1200px;--grid-gutter-width:30px;--container-sm:calc(720px + var(--grid-gutter-width));--container-md:calc(940px + var(--grid-gutter-width));--container-lg:calc(1140px + var(--grid-gutter-width));--navbar-height:122px;--navbar-height-short:56px;--summary-height-stacked:82px;--statusbar-height-stacked:54px;--footer-height:60px;--default-transition-duration:0.2s;--default-transition-easing:ease;--gray-base:#000;--gray-darker-faded:color(var(--gray-darker) alpha(95%));--gray-darker:color(var(--gray-base) tint(13.5%));--gray-dark:color(var(--gray-base) tint(20%));--gray:color(var(--gray-base) tint(33.5%));--gray-light:color(var(--gray-base) tint(46.7%));--gray-medium:color(var(--gray-base) tint(73.5%));--gray-lighter:color(var(--gray-base) tint(93.5%));--gray-lighter-faded:color(var(--gray-lighter) alpha(95%));--gray-border:color(var(--gray-base) tint(80%));--grey50:#eceff1;--grey100:#f5f5f5;--grey300:#e0e0e0;--grey500:#9e9e9e;--grey700:#616161;--green100:#c8e6c9;--green200:#a5d6a7;--green300:#81c784;--green500:#4caf50;--green700:#388e3c;--red100:#ffcdd2;--red300:#e57373;--red500:#f44336;--red700:#d32f2f;--ltblue100:#b3e5fc;--ltblue300:#4fc3f7;--ltblue500:#03a9f4;--ltblue700:#0288d1;--black87:rgba(0,0,0,0.87);--black54:rgba(0,0,0,0.54);--black38:rgba(0,0,0,0.38);--bluegrey500:#607d8b;--bluegrey800:#37474f;--bluegrey900:#263238;--light-icon-active:#fff;--light-icon-inactive:hsla(0,0%,100%,0.5);--dark-icon-active:var(--black54);--dark-icon-inactive:var(--black38);--amber300:#ffd54f;--amber400:#ffca28;--amber500:#ffc107;--yellow700:#fbc02d;--yellow800:#f9a825;--brand-primary:color(#428bca shade(6.5%));--brand-success:#4caf50;--brand-info:#5bc0de;--brand-warning:#f0ad4e;--brand-danger:#d9534f;--text-color:var(--black87);--body-bg:#f2f2f2;--link-color:var(--brand-primary);--link-hover-color:color(var(--link-color) shade(15%));--list-group-border:#ddd;--font-family-sans-serif:"robotoregular","Helvetica Neue",Helvetica,Arial,sans-serif;--font-family-base:var(--font-family-sans-serif);--font-family-mono:"Menlo","Monaco","Consolas","Courier New",monospace;--font-size-base:14px;--line-height-base:1.429;--line-height-computed:20px;--headings-font-family:inherit;--headings-font-weight:400;--headings-line-height:1.1;--headings-color:inherit;--headings-small-color:var(--gray-light);--font-size-h1:36px;--font-size-h2:30px;--font-size-h3:24px;--font-size-h4:18px;--font-size-h5:var(--font-size-base);--font-size-h6:12px;--font-family-light:"robotolight";--font-family-regular:"robotoregular";--font-family-medium:"robotomedium";--link-transition:color 0.2s ease-out}.suite--trans-color---2pu6T{transition:color .2s ease-out;transition:var(--link-transition)}.suite--component---22Vxk:after,.suite--component---22Vxk:before{content:" ";display:table}.suite--component---22Vxk:after{clear:both}.suite--component---22Vxk{position:relative;background-color:#fff;margin-bottom:20px}.suite--component---22Vxk>.suite--body---1itCO>ul>li>.suite--component---22Vxk{border:1px solid #e0e0e0;border:1px solid var(--grey300);border-right:none;border-bottom:none;margin:16px 0 16px 16px}.suite--component---22Vxk>.suite--body---1itCO>ul>li>.suite--component---22Vxk.suite--no-tests---l47BS{border-bottom:1px solid #e0e0e0;border-bottom:1px solid var(--grey300)}.suite--list---3WtMK{list-style-type:none;margin:0;padding:0}.suite--list-main---3KCXR>li>.suite--component---22Vxk,.suite--root-suite---ZDRuj{box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12);margin:0 0 24px}.suite--list-main---3KCXR>.suite--no-tests---l47BS>.suite--body---1itCO>ul>li>.suite--component---22Vxk:not(.suite--no-suites---2PQFQ){border-bottom:1px solid #e0e0e0;border-bottom:1px solid var(--grey300)}.suite--header---TddSn:after,.suite--header---TddSn:before{content:" ";display:table}.suite--header---TddSn:after{clear:both}.suite--header---TddSn{border-bottom:1px solid #e0e0e0;border-bottom:1px solid var(--grey300)}.suite--no-tests---l47BS>.suite--header---TddSn{padding-bottom:0;border-bottom:none}.suite--header-btn---25qLz{background:#fff;border:none;cursor:pointer;padding:12px 16px;text-align:left;width:100%}.suite--header-btn---25qLz:focus{box-shadow:0 0 2px 0 #03a9f4;box-shadow:0 0 2px 0 var(--ltblue500);outline:none}.suite--title---3T6OR{display:-webkit-flex;display:flex;font-family:var(--font-family--light);font-size:21px;margin:0}.suite--title---3T6OR span{margin-right:auto}.suite--title---3T6OR .suite--icon---2KPe5{margin-left:58px}.suite--filename---1u8oo{color:rgba(0,0,0,.54);color:var(--black54);font-family:var(--font-family--regular);margin:6px 0 0}.suite--body---1itCO:after,.suite--body---1itCO:before{content:" ";display:table}.suite--body---1itCO:after{clear:both}.suite--body---1itCO.suite--hide---2i8QF{display:none}.suite--has-suites---3OYDf>.suite--body---1itCO{border-bottom:1px solid #e0e0e0;border-bottom:1px solid var(--grey300)}.suite--chart-wrap---7hvUh{display:none;position:absolute;top:12px;right:36px;width:50px;height:50px}.suite--chart-slice---1XN2j{stroke:#fff;stroke-width:2px}.ct-series-a .suite--chart-slice---1XN2j{fill:#4caf50;fill:var(--green500)}.ct-series-b .suite--chart-slice---1XN2j{fill:#f44336;fill:var(--red500)}.ct-series-c .suite--chart-slice---1XN2j{fill:#03a9f4;fill:var(--ltblue500)}.ct-series-d .suite--chart-slice---1XN2j{fill:rgba(0,0,0,.38);fill:var(--black38)}@media (min-width:768px){.suite--chart-wrap---7hvUh{display:block}.suite--chart-enabled---1N-VF:not(.suite--no-tests---l47BS) .suite--header---TddSn{min-height:66px}} +:root{--screen-sm-min:768px;--screen-md-min:992px;--screen-lg-min:1200px;--grid-gutter-width:30px;--container-sm:calc(720px + var(--grid-gutter-width));--container-md:calc(940px + var(--grid-gutter-width));--container-lg:calc(1140px + var(--grid-gutter-width));--navbar-height:122px;--navbar-height-short:56px;--summary-height-stacked:82px;--statusbar-height-stacked:54px;--footer-height:60px;--default-transition-duration:0.2s;--default-transition-easing:ease;--gray-base:#000;--gray-darker-faded:color(var(--gray-darker) alpha(95%));--gray-darker:color(var(--gray-base) tint(13.5%));--gray-dark:color(var(--gray-base) tint(20%));--gray:color(var(--gray-base) tint(33.5%));--gray-light:color(var(--gray-base) tint(46.7%));--gray-medium:color(var(--gray-base) tint(73.5%));--gray-lighter:color(var(--gray-base) tint(93.5%));--gray-lighter-faded:color(var(--gray-lighter) alpha(95%));--gray-border:color(var(--gray-base) tint(80%));--grey50:#eceff1;--grey100:#f5f5f5;--grey300:#e0e0e0;--grey500:#9e9e9e;--grey700:#616161;--green100:#c8e6c9;--green200:#a5d6a7;--green300:#81c784;--green500:#4caf50;--green700:#388e3c;--red100:#ffcdd2;--red300:#e57373;--red500:#f44336;--red700:#d32f2f;--ltblue100:#b3e5fc;--ltblue300:#4fc3f7;--ltblue500:#03a9f4;--ltblue700:#0288d1;--black87:rgba(0,0,0,0.87);--black54:rgba(0,0,0,0.54);--black38:rgba(0,0,0,0.38);--bluegrey500:#607d8b;--bluegrey800:#37474f;--bluegrey900:#263238;--light-icon-active:#fff;--light-icon-inactive:hsla(0,0%,100%,0.5);--dark-icon-active:var(--black54);--dark-icon-inactive:var(--black38);--amber300:#ffd54f;--amber400:#ffca28;--amber500:#ffc107;--yellow700:#fbc02d;--yellow800:#f9a825;--brand-primary:color(#428bca shade(6.5%));--brand-success:#4caf50;--brand-info:#5bc0de;--brand-warning:#f0ad4e;--brand-danger:#d9534f;--text-color:var(--black87);--body-bg:#f2f2f2;--link-color:var(--brand-primary);--link-hover-color:color(var(--link-color) shade(15%));--list-group-border:#ddd;--font-family-sans-serif:"robotoregular","Helvetica Neue",Helvetica,Arial,sans-serif;--font-family-base:var(--font-family-sans-serif);--font-family-mono:"Menlo","Monaco","Consolas","Courier New",monospace;--font-size-base:14px;--line-height-base:1.429;--line-height-computed:20px;--headings-font-family:inherit;--headings-font-weight:400;--headings-line-height:1.1;--headings-color:inherit;--headings-small-color:var(--gray-light);--font-size-h1:36px;--font-size-h2:30px;--font-size-h3:24px;--font-size-h4:18px;--font-size-h5:var(--font-size-base);--font-size-h6:12px;--font-family-light:"robotolight";--font-family-regular:"robotoregular";--font-family-medium:"robotomedium";--link-transition:color 0.2s ease-out}.suite-summary--trans-color---14JXk{transition:color .2s ease-out;transition:var(--link-transition)}.suite-summary--component---cFAkx:after,.suite-summary--component---cFAkx:before{content:" ";display:table}.suite-summary--component---cFAkx:after{clear:both}.suite-summary--component---cFAkx{list-style:none;padding-left:0;display:-webkit-flex;display:flex;font-family:var(--font-family--regular);font-size:15px;margin:16px 0 0}.suite-summary--component---cFAkx.suite-summary--no-margin---3WX9n{margin:0}.suite-summary--summary-item---JHYFN{display:-webkit-flex;display:flex;line-height:18px;margin:0 8px;color:rgba(0,0,0,.54);color:var(--black54)}.suite-summary--summary-item---JHYFN:first-child{margin-left:0}.suite-summary--summary-item---JHYFN.suite-summary--duration---AzGUQ,.suite-summary--summary-item---JHYFN.suite-summary--tests---3Zhct{color:rgba(0,0,0,.54);color:var(--black54)}.suite-summary--summary-item---JHYFN.suite-summary--passed---24BnC{color:#4caf50;color:var(--green500)}.suite-summary--summary-item---JHYFN.suite-summary--failed---205C4{color:#f44336;color:var(--red500)}.suite-summary--summary-item---JHYFN.suite-summary--pending---3_Nkj{color:#03a9f4;color:var(--ltblue500)}.suite-summary--summary-item---JHYFN.suite-summary--skipped---TovqF{color:rgba(0,0,0,.38);color:var(--black38)}.suite-summary--icon---3rZ6G{margin-right:2px} +:root{--screen-sm-min:768px;--screen-md-min:992px;--screen-lg-min:1200px;--grid-gutter-width:30px;--container-sm:calc(720px + var(--grid-gutter-width));--container-md:calc(940px + var(--grid-gutter-width));--container-lg:calc(1140px + var(--grid-gutter-width));--navbar-height:122px;--navbar-height-short:56px;--summary-height-stacked:82px;--statusbar-height-stacked:54px;--footer-height:60px;--default-transition-duration:0.2s;--default-transition-easing:ease;--gray-base:#000;--gray-darker-faded:color(var(--gray-darker) alpha(95%));--gray-darker:color(var(--gray-base) tint(13.5%));--gray-dark:color(var(--gray-base) tint(20%));--gray:color(var(--gray-base) tint(33.5%));--gray-light:color(var(--gray-base) tint(46.7%));--gray-medium:color(var(--gray-base) tint(73.5%));--gray-lighter:color(var(--gray-base) tint(93.5%));--gray-lighter-faded:color(var(--gray-lighter) alpha(95%));--gray-border:color(var(--gray-base) tint(80%));--grey50:#eceff1;--grey100:#f5f5f5;--grey300:#e0e0e0;--grey500:#9e9e9e;--grey700:#616161;--green100:#c8e6c9;--green200:#a5d6a7;--green300:#81c784;--green500:#4caf50;--green700:#388e3c;--red100:#ffcdd2;--red300:#e57373;--red500:#f44336;--red700:#d32f2f;--ltblue100:#b3e5fc;--ltblue300:#4fc3f7;--ltblue500:#03a9f4;--ltblue700:#0288d1;--black87:rgba(0,0,0,0.87);--black54:rgba(0,0,0,0.54);--black38:rgba(0,0,0,0.38);--bluegrey500:#607d8b;--bluegrey800:#37474f;--bluegrey900:#263238;--light-icon-active:#fff;--light-icon-inactive:hsla(0,0%,100%,0.5);--dark-icon-active:var(--black54);--dark-icon-inactive:var(--black38);--amber300:#ffd54f;--amber400:#ffca28;--amber500:#ffc107;--yellow700:#fbc02d;--yellow800:#f9a825;--brand-primary:color(#428bca shade(6.5%));--brand-success:#4caf50;--brand-info:#5bc0de;--brand-warning:#f0ad4e;--brand-danger:#d9534f;--text-color:var(--black87);--body-bg:#f2f2f2;--link-color:var(--brand-primary);--link-hover-color:color(var(--link-color) shade(15%));--list-group-border:#ddd;--font-family-sans-serif:"robotoregular","Helvetica Neue",Helvetica,Arial,sans-serif;--font-family-base:var(--font-family-sans-serif);--font-family-mono:"Menlo","Monaco","Consolas","Courier New",monospace;--font-size-base:14px;--line-height-base:1.429;--line-height-computed:20px;--headings-font-family:inherit;--headings-font-weight:400;--headings-line-height:1.1;--headings-color:inherit;--headings-small-color:var(--gray-light);--font-size-h1:36px;--font-size-h2:30px;--font-size-h3:24px;--font-size-h4:18px;--font-size-h5:var(--font-size-base);--font-size-h6:12px;--font-family-light:"robotolight";--font-family-regular:"robotoregular";--font-family-medium:"robotomedium";--link-transition:color 0.2s ease-out}.toggle-switch--trans-color---16in9{transition:color .2s ease-out;transition:var(--link-transition)}.toggle-switch--component---3vjvh:after,.toggle-switch--component---3vjvh:before{content:" ";display:table}.toggle-switch--component---3vjvh:after{clear:both}.toggle-switch--component---3vjvh{height:24px}.toggle-switch--label---1Lu8U{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center}.toggle-switch--toggle-input---3BB7e{position:absolute;opacity:0}.toggle-switch--toggle-input---3BB7e:checked+.toggle-switch--toggle---2kPqc{background-color:#a5d6a7;background-color:var(--green200)}.toggle-switch--toggle-input---3BB7e:checked+.toggle-switch--toggle---2kPqc:before{background-color:#4caf50;background-color:var(--green500);-webkit-transform:translateX(14px);transform:translateX(14px)}.toggle-switch--toggle-input---3BB7e:focus+.toggle-switch--toggle---2kPqc:before{box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12),0 0 2px 0 #03a9f4;box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12),0 0 2px 0 var(--ltblue500)}.toggle-switch--toggle---2kPqc{display:inline-block;position:relative;background-color:#e0e0e0;background-color:var(--grey300);border-radius:7px;cursor:pointer;height:14px;margin-left:auto;transition:background-color .15s cubic-bezier(.4,0,.2,1) 0s;width:34px}.toggle-switch--toggle---2kPqc:before{box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12);content:"";position:absolute;background-color:#9e9e9e;background-color:var(--grey500);border-radius:100%;height:20px;left:0;top:-3px;width:20px;transition:-webkit-transform .15s cubic-bezier(.4,0,.2,1) 0s;transition:transform .15s cubic-bezier(.4,0,.2,1) 0s;transition:transform .15s cubic-bezier(.4,0,.2,1) 0s,-webkit-transform .15s cubic-bezier(.4,0,.2,1) 0s}.toggle-switch--disabled---1qDLf{opacity:.6}.toggle-switch--disabled---1qDLf .toggle-switch--icon---348nT{color:rgba(0,0,0,.38);color:var(--black38)}.toggle-switch--disabled---1qDLf .toggle-switch--toggle---2kPqc{cursor:default} diff --git a/sandbox/auth-ms-basic-example/mochawesome-report/assets/app.js b/sandbox/auth-ms-basic-example/mochawesome-report/assets/app.js new file mode 100644 index 0000000000..23de4437e0 --- /dev/null +++ b/sandbox/auth-ms-basic-example/mochawesome-report/assets/app.js @@ -0,0 +1,2 @@ +/*! mochawesome-report-generator 6.2.0 | https://github.com/adamgruber/mochawesome-report-generator */ +!function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=320)}([function(e,t,n){"use strict";e.exports=n(126)},function(e,t,n){e.exports=n(130)()},function(e,t,n){var r=n(198),o=n(51),i=36e5,a=6e4,s=/[T ]/,l=/:/,u=/^(\d{2})$/,c=[/^([+-]\d{2})$/,/^([+-]\d{3})$/,/^([+-]\d{4})$/],f=/^(\d{4})/,d=[/^([+-]\d{4})/,/^([+-]\d{5})/,/^([+-]\d{6})/],p=/^-(\d{2})$/,h=/^-?(\d{3})$/,m=/^-?(\d{2})-?(\d{2})$/,v=/^-?W(\d{2})$/,g=/^-?W(\d{2})-?(\d{1})$/,y=/^(\d{2}([.,]\d*)?)$/,b=/^(\d{2}):?(\d{2}([.,]\d*)?)$/,_=/^(\d{2}):?(\d{2}):?(\d{2}([.,]\d*)?)$/,w=/([Z+-].*)$/,x=/^(Z)$/,E=/^([+-])(\d{2})$/,k=/^([+-])(\d{2}):?(\d{2})$/;function S(e,t,n){t=t||0,n=n||0;var r=new Date(0);r.setUTCFullYear(e,0,4);var o=7*t+n+1-(r.getUTCDay()||7);return r.setUTCDate(r.getUTCDate()+o),r}e.exports=function(e,t){if(o(e))return new Date(e.getTime());if("string"!=typeof e)return new Date(e);var n=(t||{}).additionalDigits;n=null==n?2:Number(n);var O=function(e){var t,n={},r=e.split(s);l.test(r[0])?(n.date=null,t=r[0]):(n.date=r[0],t=r[1]);if(t){var o=w.exec(t);o?(n.time=t.replace(o[1],""),n.timezone=o[1]):n.time=t}return n}(e),T=function(e,t){var n,r=c[t],o=d[t];if(n=f.exec(e)||o.exec(e)){var i=n[1];return{year:parseInt(i,10),restDateString:e.slice(i.length)}}if(n=u.exec(e)||r.exec(e)){var a=n[1];return{year:100*parseInt(a,10),restDateString:e.slice(a.length)}}return{year:null}}(O.date,n),N=T.year,C=function(e,t){if(null===t)return null;var n,r,o;if(0===e.length)return(r=new Date(0)).setUTCFullYear(t),r;if(n=p.exec(e))return r=new Date(0),o=parseInt(n[1],10)-1,r.setUTCFullYear(t,o),r;if(n=h.exec(e)){r=new Date(0);var i=parseInt(n[1],10);return r.setUTCFullYear(t,0,i),r}if(n=m.exec(e)){r=new Date(0),o=parseInt(n[1],10)-1;var a=parseInt(n[2],10);return r.setUTCFullYear(t,o,a),r}if(n=v.exec(e))return S(t,parseInt(n[1],10)-1);if(n=g.exec(e)){return S(t,parseInt(n[1],10)-1,parseInt(n[2],10)-1)}return null}(T.restDateString,N);if(C){var P,M=C.getTime(),j=0;if(O.time&&(j=function(e){var t,n,r;if(t=y.exec(e))return(n=parseFloat(t[1].replace(",",".")))%24*i;if(t=b.exec(e))return n=parseInt(t[1],10),r=parseFloat(t[2].replace(",",".")),n%24*i+r*a;if(t=_.exec(e)){n=parseInt(t[1],10),r=parseInt(t[2],10);var o=parseFloat(t[3].replace(",","."));return n%24*i+r*a+1e3*o}return null}(O.time)),O.timezone)P=function(e){var t,n;if(t=x.exec(e))return 0;if(t=E.exec(e))return n=60*parseInt(t[2],10),"+"===t[1]?-n:n;if(t=k.exec(e))return n=60*parseInt(t[2],10)+parseInt(t[3],10),"+"===t[1]?-n:n;return 0}(O.timezone)*a;else{var D=M+j,A=new Date(D);P=r(A);var I=new Date(D);I.setDate(A.getDate()+1);var R=r(I)-r(A);R>0&&(P+=R)}return new Date(M+j+P)}return new Date(e)}},function(e,t,n){var r;!function(){"use strict";var n={}.hasOwnProperty;function o(){for(var e=[],t=0;t=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}}}function s(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,o,i=n.call(e),a=[];try{for(;(void 0===t||t-- >0)&&!(r=i.next()).done;)a.push(r.value)}catch(e){o={error:e}}finally{try{r&&!r.done&&(n=i.return)&&n.call(i)}finally{if(o)throw o.error}}return a}var l=[];Object.freeze(l);var u={};function c(){return++_e.mobxGuid}function f(e){throw d(!1,e),"X"}function d(e,t){if(!e)throw new Error("[mobx] "+(t||"An invariant failed, however the error is obfuscated because this is an production build."))}Object.freeze(u);function p(e){var t=!1;return function(){if(!t)return t=!0,e.apply(this,arguments)}}var h=function(){};function m(e){return null!==e&&"object"==typeof e}function v(e){if(null===e||"object"!=typeof e)return!1;var t=Object.getPrototypeOf(e);return t===Object.prototype||null===t}function g(e,t,n){Object.defineProperty(e,t,{enumerable:!1,writable:!0,configurable:!0,value:n})}function y(e,t){var n="isMobX"+e;return t.prototype[n]=!0,function(e){return m(e)&&!0===e[n]}}function b(e){return e instanceof Map}function _(e){return e instanceof Set}function w(e){return null===e?null:"object"==typeof e?""+e:e}var x=Symbol("mobx administration"),E=function(){function e(e){void 0===e&&(e="Atom@"+c()),this.name=e,this.isPendingUnobservation=!1,this.isBeingObserved=!1,this.observers=new Set,this.diffValue=0,this.lastAccessedBy=0,this.lowestObserverState=te.NOT_TRACKING}return e.prototype.onBecomeObserved=function(){this.onBecomeObservedListeners&&this.onBecomeObservedListeners.forEach((function(e){return e()}))},e.prototype.onBecomeUnobserved=function(){this.onBecomeUnobservedListeners&&this.onBecomeUnobservedListeners.forEach((function(e){return e()}))},e.prototype.reportObserved=function(){return Te(this)},e.prototype.reportChanged=function(){Se(),function(e){if(e.lowestObserverState===te.STALE)return;e.lowestObserverState=te.STALE,e.observers.forEach((function(t){t.dependenciesState===te.UP_TO_DATE&&(t.isTracing!==re.NONE&&Ne(t,e),t.onBecomeStale()),t.dependenciesState=te.STALE}))}(this),Oe()},e.prototype.toString=function(){return this.name},e}(),k=y("Atom",E);function S(e,t,n){void 0===t&&(t=h),void 0===n&&(n=h);var r,o=new E(e);return t!==h&&$e("onBecomeObserved",o,t,r),n!==h&&function(e,t,n){$e("onBecomeUnobserved",e,t,n)}(o,n),o}var O={identity:function(e,t){return e===t},structural:function(e,t){return zt(e,t)},default:function(e,t){return Object.is(e,t)}},T=Symbol("mobx did run lazy initializers"),N=Symbol("mobx pending decorators"),C={},P={};function M(e,t){var n=t?C:P;return n[e]||(n[e]={configurable:!0,enumerable:t,get:function(){return j(this),this[e]},set:function(t){j(this),this[e]=t}})}function j(e){if(!0!==e[T]){var t=e[N];if(t)for(var n in g(e,T,!0),t){var r=t[n];r.propertyCreator(e,r.prop,r.descriptor,r.decoratorTarget,r.decoratorArguments)}}}function D(e,t){return function(){var n,r=function(r,o,a,s){if(!0===s)return t(r,o,a,r,n),null;if(!Object.prototype.hasOwnProperty.call(r,N)){var l=r[N];g(r,N,i({},l))}return r[N][o]={prop:o,propertyCreator:t,descriptor:a,decoratorTarget:r,decoratorArguments:n},M(o,e)};return A(arguments)?(n=l,r.apply(null,arguments)):(n=Array.prototype.slice.call(arguments),r)}}function A(e){return(2===e.length||3===e.length)&&"string"==typeof e[1]||4===e.length&&!0===e[3]}function I(e,t,n){return Ze(e)?e:Array.isArray(e)?$.array(e,{name:n}):v(e)?$.object(e,void 0,{name:n}):b(e)?$.map(e,{name:n}):_(e)?$.set(e,{name:n}):e}function R(e){return e}function z(t){d(t);var n=D(!0,(function(e,n,r,o,i){var a=r?r.initializer?r.initializer.call(e):r.value:void 0;Tt(e).addObservableProp(n,a,t)})),r=(void 0!==e&&e.env,n);return r.enhancer=t,r}var F={deep:!0,name:void 0,defaultDecorator:void 0,proxy:!0};function L(e){return null==e?F:"string"==typeof e?{name:e,deep:!0,proxy:!0}:e}Object.freeze(F);var U=z(I),B=z((function(e,t,n){return null==e||jt(e)||yt(e)||xt(e)||St(e)?e:Array.isArray(e)?$.array(e,{name:n,deep:!1}):v(e)?$.object(e,void 0,{name:n,deep:!1}):b(e)?$.map(e,{name:n,deep:!1}):_(e)?$.set(e,{name:n,deep:!1}):f(!1)})),H=z(R),V=z((function(e,t,n){return zt(e,t)?t:e}));function W(e){return e.defaultDecorator?e.defaultDecorator.enhancer:!1===e.deep?R:I}var Y={box:function(e,t){arguments.length>2&&q("box");var n=L(t);return new oe(e,W(n),n.name,!0,n.equals)},array:function(e,t){arguments.length>2&&q("array");var n=L(t);return pt(e,W(n),n.name)},map:function(e,t){arguments.length>2&&q("map");var n=L(t);return new wt(e,W(n),n.name)},set:function(e,t){arguments.length>2&&q("set");var n=L(t);return new kt(e,W(n),n.name)},object:function(e,t,n){"string"==typeof arguments[1]&&q("object");var r=L(n);if(!1===r.proxy)return Qe({},e,t,r);var o=Ge(r),i=Qe({},void 0,void 0,r),a=it(i);return Xe(a,e,t,o),a},ref:H,shallow:B,deep:U,struct:V},$=function(e,t,n){if("string"==typeof arguments[1])return U.apply(null,arguments);if(Ze(e))return e;var r=v(e)?$.object(e,t,n):Array.isArray(e)?$.array(e,t):b(e)?$.map(e,t):_(e)?$.set(e,t):e;if(r!==e)return r;f(!1)};function q(e){f("Expected one or two arguments to observable."+e+". Did you accidentally try to use observable."+e+" as decorator?")}Object.keys(Y).forEach((function(e){return $[e]=Y[e]}));var Q=D(!1,(function(e,t,n,r,o){var a=n.get,s=n.set,l=o[0]||{};Tt(e).addComputedProp(e,t,i({get:a,set:s,context:e},l))}));Q({equals:O.structural});function G(e,t){var n=function(){return X(e,t,this,arguments)};return n.isMobxAction=!0,n}function X(e,t,n,r){var o=function(e,t,n,r){var o=!1,i=0;var a=he();Se();var s=Z(!0);return{prevDerivation:a,prevAllowStateChanges:s,notifySpy:o,startTime:i}}(),i=!0;try{var a=t.apply(n,r);return i=!1,a}finally{i?(_e.suppressReactionErrors=i,K(o),_e.suppressReactionErrors=!1):K(o)}}function K(e){ee(e.prevAllowStateChanges),Oe(),me(e.prevDerivation),e.notifySpy}function J(e,t){var n,r=Z(e);try{n=t()}finally{ee(r)}return n}function Z(e){var t=_e.allowStateChanges;return _e.allowStateChanges=e,t}function ee(e){_e.allowStateChanges=e}var te,ne,re,oe=function(e){function t(t,n,r,o,i){void 0===r&&(r="ObservableValue@"+c()),void 0===o&&(o=!0),void 0===i&&(i=O.default);var a=e.call(this,r)||this;return a.enhancer=n,a.name=r,a.equals=i,a.hasUnreportedChange=!1,a.value=n(t,void 0,r),a}return function(e,t){function n(){this.constructor=e}o(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}(t,e),t.prototype.dehanceValue=function(e){return void 0!==this.dehancer?this.dehancer(e):e},t.prototype.set=function(e){this.value;if((e=this.prepareNewValue(e))!==_e.UNCHANGED){false,this.setNewValue(e)}},t.prototype.prepareNewValue=function(e){if(ce(this),at(this)){var t=lt(this,{object:this,type:"update",newValue:e});if(!t)return _e.UNCHANGED;e=t.newValue}return e=this.enhancer(e,this.value,this.name),this.equals(this.value,e)?_e.UNCHANGED:e},t.prototype.setNewValue=function(e){var t=this.value;this.value=e,this.reportChanged(),ut(this)&&ft(this,{type:"update",object:this,newValue:e,oldValue:t})},t.prototype.get=function(){return this.reportObserved(),this.dehanceValue(this.value)},t.prototype.intercept=function(e){return st(this,e)},t.prototype.observe=function(e,t){return t&&e({object:this,type:"update",newValue:this.value,oldValue:void 0}),ct(this,e)},t.prototype.toJSON=function(){return this.get()},t.prototype.toString=function(){return this.name+"["+this.value+"]"},t.prototype.valueOf=function(){return w(this.get())},t.prototype[Symbol.toPrimitive]=function(){return this.valueOf()},t}(E),ie=(y("ObservableValue",oe),function(){function e(e){this.dependenciesState=te.NOT_TRACKING,this.observing=[],this.newObserving=null,this.isBeingObserved=!1,this.isPendingUnobservation=!1,this.observers=new Set,this.diffValue=0,this.runId=0,this.lastAccessedBy=0,this.lowestObserverState=te.UP_TO_DATE,this.unboundDepsCount=0,this.__mapid="#"+c(),this.value=new se(null),this.isComputing=!1,this.isRunningSetter=!1,this.isTracing=re.NONE,this.derivation=e.get,this.name=e.name||"ComputedValue@"+c(),e.set&&(this.setter=G(this.name+"-setter",e.set)),this.equals=e.equals||(e.compareStructural||e.struct?O.structural:O.default),this.scope=e.context,this.requiresReaction=!!e.requiresReaction,this.keepAlive=!!e.keepAlive}return e.prototype.onBecomeStale=function(){!function(e){if(e.lowestObserverState!==te.UP_TO_DATE)return;e.lowestObserverState=te.POSSIBLY_STALE,e.observers.forEach((function(t){t.dependenciesState===te.UP_TO_DATE&&(t.dependenciesState=te.POSSIBLY_STALE,t.isTracing!==re.NONE&&Ne(t,e),t.onBecomeStale())}))}(this)},e.prototype.onBecomeObserved=function(){this.onBecomeObservedListeners&&this.onBecomeObservedListeners.forEach((function(e){return e()}))},e.prototype.onBecomeUnobserved=function(){this.onBecomeUnobservedListeners&&this.onBecomeUnobservedListeners.forEach((function(e){return e()}))},e.prototype.get=function(){this.isComputing&&f("Cycle detected in computation "+this.name+": "+this.derivation),0!==_e.inBatch||0!==this.observers.size||this.keepAlive?(Te(this),ue(this)&&this.trackAndCompute()&&function(e){if(e.lowestObserverState===te.STALE)return;e.lowestObserverState=te.STALE,e.observers.forEach((function(t){t.dependenciesState===te.POSSIBLY_STALE?t.dependenciesState=te.STALE:t.dependenciesState===te.UP_TO_DATE&&(e.lowestObserverState=te.UP_TO_DATE)}))}(this)):ue(this)&&(this.warnAboutUntrackedRead(),Se(),this.value=this.computeValue(!1),Oe());var e=this.value;if(le(e))throw e.cause;return e},e.prototype.peek=function(){var e=this.computeValue(!1);if(le(e))throw e.cause;return e},e.prototype.set=function(e){if(this.setter){d(!this.isRunningSetter,"The setter of computed value '"+this.name+"' is trying to update itself. Did you intend to update an _observable_ value, instead of the computed property?"),this.isRunningSetter=!0;try{this.setter.call(this.scope,e)}finally{this.isRunningSetter=!1}}else d(!1,!1)},e.prototype.trackAndCompute=function(){var e=this.value,t=this.dependenciesState===te.NOT_TRACKING,n=this.computeValue(!0),r=t||le(e)||le(n)||!this.equals(e,n);return r&&(this.value=n),r},e.prototype.computeValue=function(e){var t;if(this.isComputing=!0,_e.computationDepth++,e)t=fe(this,this.derivation,this.scope);else if(!0===_e.disableErrorBoundaries)t=this.derivation.call(this.scope);else try{t=this.derivation.call(this.scope)}catch(e){t=new se(e)}return _e.computationDepth--,this.isComputing=!1,t},e.prototype.suspend=function(){this.keepAlive||(de(this),this.value=void 0)},e.prototype.observe=function(e,t){var n=this,r=!0,o=void 0;return He((function(){var i=n.get();if(!r||t){var a=he();e({type:"update",object:n,newValue:i,oldValue:o}),me(a)}r=!1,o=i}))},e.prototype.warnAboutUntrackedRead=function(){},e.prototype.toJSON=function(){return this.get()},e.prototype.toString=function(){return this.name+"["+this.derivation.toString()+"]"},e.prototype.valueOf=function(){return w(this.get())},e.prototype[Symbol.toPrimitive]=function(){return this.valueOf()},e}()),ae=y("ComputedValue",ie);(ne=te||(te={}))[ne.NOT_TRACKING=-1]="NOT_TRACKING",ne[ne.UP_TO_DATE=0]="UP_TO_DATE",ne[ne.POSSIBLY_STALE=1]="POSSIBLY_STALE",ne[ne.STALE=2]="STALE",function(e){e[e.NONE=0]="NONE",e[e.LOG=1]="LOG",e[e.BREAK=2]="BREAK"}(re||(re={}));var se=function(e){this.cause=e};function le(e){return e instanceof se}function ue(e){switch(e.dependenciesState){case te.UP_TO_DATE:return!1;case te.NOT_TRACKING:case te.STALE:return!0;case te.POSSIBLY_STALE:for(var t=he(),n=e.observing,r=n.length,o=0;o0;_e.computationDepth>0&&t&&f(!1),_e.allowStateChanges||!t&&"strict"!==_e.enforceActions||f(!1)}function fe(e,t,n){ve(e),e.newObserving=new Array(e.observing.length+100),e.unboundDepsCount=0,e.runId=++_e.runId;var r,o=_e.trackingDerivation;if(_e.trackingDerivation=e,!0===_e.disableErrorBoundaries)r=t.call(n);else try{r=t.call(n)}catch(e){r=new se(e)}return _e.trackingDerivation=o,function(e){for(var t=e.observing,n=e.observing=e.newObserving,r=te.UP_TO_DATE,o=0,i=e.unboundDepsCount,a=0;ar&&(r=s.dependenciesState)}n.length=o,e.newObserving=null,i=t.length;for(;i--;){0===(s=t[i]).diffValue&&Ee(s,e),s.diffValue=0}for(;o--;){var s;1===(s=n[o]).diffValue&&(s.diffValue=0,xe(s,e))}r!==te.UP_TO_DATE&&(e.dependenciesState=r,e.onBecomeStale())}(e),r}function de(e){var t=e.observing;e.observing=[];for(var n=t.length;n--;)Ee(t[n],e);e.dependenciesState=te.NOT_TRACKING}function pe(e){var t=he();try{return e()}finally{me(t)}}function he(){var e=_e.trackingDerivation;return _e.trackingDerivation=null,e}function me(e){_e.trackingDerivation=e}function ve(e){if(e.dependenciesState!==te.UP_TO_DATE){e.dependenciesState=te.UP_TO_DATE;for(var t=e.observing,n=t.length;n--;)t[n].lowestObserverState=te.UP_TO_DATE}}var ge=function(){this.version=5,this.UNCHANGED={},this.trackingDerivation=null,this.computationDepth=0,this.runId=0,this.mobxGuid=0,this.inBatch=0,this.pendingUnobservations=[],this.pendingReactions=[],this.isRunningReactions=!1,this.allowStateChanges=!0,this.enforceActions=!1,this.spyListeners=[],this.globalReactionErrorHandlers=[],this.computedRequiresReaction=!1,this.disableErrorBoundaries=!1,this.suppressReactionErrors=!1},ye=!0,be=!1,_e=function(){var e=we();return e.__mobxInstanceCount>0&&!e.__mobxGlobals&&(ye=!1),e.__mobxGlobals&&e.__mobxGlobals.version!==(new ge).version&&(ye=!1),ye?e.__mobxGlobals?(e.__mobxInstanceCount+=1,e.__mobxGlobals.UNCHANGED||(e.__mobxGlobals.UNCHANGED={}),e.__mobxGlobals):(e.__mobxInstanceCount=1,e.__mobxGlobals=new ge):(setTimeout((function(){be||f("There are multiple, different versions of MobX active. Make sure MobX is loaded only once or use `configure({ isolateGlobalState: true })`")}),1),new ge)}();function we(){return"undefined"!=typeof window?window:r}function xe(e,t){e.observers.add(t),e.lowestObserverState>t.dependenciesState&&(e.lowestObserverState=t.dependenciesState)}function Ee(e,t){e.observers.delete(t),0===e.observers.size&&ke(e)}function ke(e){!1===e.isPendingUnobservation&&(e.isPendingUnobservation=!0,_e.pendingUnobservations.push(e))}function Se(){_e.inBatch++}function Oe(){if(0==--_e.inBatch){je();for(var e=_e.pendingUnobservations,t=0;t0&&ke(e),!1)}function Ne(e,t){if(console.log("[mobx.trace] '"+e.name+"' is invalidated due to a change in: '"+t.name+"'"),e.isTracing===re.BREAK){var n=[];Ce(Ke(Dt(e,r)),n,1),new Function("debugger;\n/*\nTracing '"+e.name+"'\n\nYou are entering this break point because derivation '"+e.name+"' is being traced and '"+t.name+"' is now forcing it to update.\nJust follow the stacktrace you should now see in the devtools to see precisely what piece of your code is causing this update\nThe stackframe you are looking for is at least ~6-8 stack-frames up.\n\n"+(e instanceof ie?e.derivation.toString().replace(/[*]\//g,"/"):"")+"\n\nThe dependencies for this derivation are:\n\n"+n.join("\n")+"\n*/\n ")()}var r}function Ce(e,t,n){t.length>=1e3?t.push("(and many more)"):(t.push(""+new Array(n).join("\t")+e.name),e.dependencies&&e.dependencies.forEach((function(e){return Ce(e,t,n+1)})))}var Pe=function(){function e(e,t,n){void 0===e&&(e="Reaction@"+c()),this.name=e,this.onInvalidate=t,this.errorHandler=n,this.observing=[],this.newObserving=[],this.dependenciesState=te.NOT_TRACKING,this.diffValue=0,this.runId=0,this.unboundDepsCount=0,this.__mapid="#"+c(),this.isDisposed=!1,this._isScheduled=!1,this._isTrackPending=!1,this._isRunning=!1,this.isTracing=re.NONE}return e.prototype.onBecomeStale=function(){this.schedule()},e.prototype.schedule=function(){this._isScheduled||(this._isScheduled=!0,_e.pendingReactions.push(this),je())},e.prototype.isScheduled=function(){return this._isScheduled},e.prototype.runReaction=function(){if(!this.isDisposed){if(Se(),this._isScheduled=!1,ue(this)){this._isTrackPending=!0;try{this.onInvalidate(),this._isTrackPending}catch(e){this.reportExceptionInDerivation(e)}}Oe()}},e.prototype.track=function(e){Se();this._isRunning=!0;var t=fe(this,e,void 0);this._isRunning=!1,this._isTrackPending=!1,this.isDisposed&&de(this),le(t)&&this.reportExceptionInDerivation(t.cause),Oe()},e.prototype.reportExceptionInDerivation=function(e){var t=this;if(this.errorHandler)this.errorHandler(e,this);else{if(_e.disableErrorBoundaries)throw e;var n="[mobx] Encountered an uncaught exception that was thrown by a reaction or observer component, in: '"+this+"'";_e.suppressReactionErrors?console.warn("[mobx] (error in reaction '"+this.name+"' suppressed, fix error of causing action below)"):console.error(n,e),_e.globalReactionErrorHandlers.forEach((function(n){return n(e,t)}))}},e.prototype.dispose=function(){this.isDisposed||(this.isDisposed=!0,this._isRunning||(Se(),de(this),Oe()))},e.prototype.getDisposer=function(){var e=this.dispose.bind(this);return e[x]=this,e},e.prototype.toString=function(){return"Reaction["+this.name+"]"},e.prototype.trace=function(e){void 0===e&&(e=!1),function(){for(var e=[],t=0;t0||_e.isRunningReactions||Me(De)}function De(){_e.isRunningReactions=!0;for(var e=_e.pendingReactions,t=0;e.length>0;){100==++t&&(console.error("Reaction doesn't converge to a stable state after 100 iterations. Probably there is a cycle in the reactive function: "+e[0]),e.splice(0));for(var n=e.splice(0),r=0,o=n.length;r",e):2===arguments.length&&"function"==typeof t?G(e,t):1===arguments.length&&"string"==typeof e?Fe(e):!0!==r?Fe(t).apply(null,arguments):void g(e,t,G(e.name||t,n.value))};function Be(e,t,n){g(e,t,G(t,n.bind(e)))}function He(e,t){void 0===t&&(t=u);var n,r=t&&t.name||e.name||"Autorun@"+c();if(!t.scheduler&&!t.delay)n=new Pe(r,(function(){this.track(a)}),t.onError);else{var o=We(t),i=!1;n=new Pe(r,(function(){i||(i=!0,o((function(){i=!1,n.isDisposed||n.track(a)})))}),t.onError)}function a(){e(n)}return n.schedule(),n.getDisposer()}Ue.bound=function(e,t,n,r){return!0===r?(Be(e,t,n.value),null):n?{configurable:!0,enumerable:!1,get:function(){return Be(this,t,n.value||n.initializer.call(this)),this[t]},set:ze}:{enumerable:!1,configurable:!0,set:function(e){Be(this,t,e)},get:function(){}}};var Ve=function(e){return e()};function We(e){return e.scheduler?e.scheduler:e.delay?function(t){return setTimeout(t,e.delay)}:Ve}function Ye(e,t,n){void 0===n&&(n=u);var r,o,i,a=n.name||"Reaction@"+c(),s=Ue(a,n.onError?(r=n.onError,o=t,function(){try{return o.apply(this,arguments)}catch(e){r.call(this,e)}}):t),l=!n.scheduler&&!n.delay,f=We(n),d=!0,p=!1,h=n.compareStructural?O.structural:n.equals||O.default,m=new Pe(a,(function(){d||l?v():p||(p=!0,f(v))}),n.onError);function v(){if(p=!1,!m.isDisposed){var t=!1;m.track((function(){var n=e(m);t=d||!h(i,n),i=n})),d&&n.fireImmediately&&s(i,m),d||!0!==t||s(i,m),d&&(d=!1)}}return m.schedule(),m.getDisposer()}function $e(e,t,n,r){var o="string"==typeof n?Dt(t,n):Dt(t),i="string"==typeof n?r:n,a=e+"Listeners";return o[a]?o[a].add(i):o[a]=new Set([i]),"function"!=typeof o[e]?f(!1):function(){var e=o[a];e&&(e.delete(i),0===e.size&&delete o[a])}}function qe(e){var t=e.enforceActions,n=e.computedRequiresReaction,r=e.disableErrorBoundaries,o=e.reactionScheduler;if(!0===e.isolateGlobalState&&((_e.pendingReactions.length||_e.inBatch||_e.isRunningReactions)&&f("isolateGlobalState should be called before MobX is running any reactions"),be=!0,ye&&(0==--we().__mobxInstanceCount&&(we().__mobxGlobals=void 0),_e=new ge)),void 0!==t){var i=void 0;switch(t){case!0:case"observed":i=!0;break;case!1:case"never":i=!1;break;case"strict":case"always":i="strict";break;default:f("Invalid value for 'enforceActions': '"+t+"', expected 'never', 'always' or 'observed'")}_e.enforceActions=i,_e.allowStateChanges=!0!==i&&"strict"!==i}void 0!==n&&(_e.computedRequiresReaction=!!n),void 0!==r&&(!0===r&&console.warn("WARNING: Debug feature only. MobX will NOT recover from errors when `disableErrorBoundaries` is enabled."),_e.disableErrorBoundaries=!!r),o&&Ie(o)}function Qe(e,t,n,r){var o=Ge(r=L(r));return j(e),Tt(e,r.name,o.enhancer),t&&Xe(e,t,n,o),e}function Ge(e){return e.defaultDecorator||(!1===e.deep?H:U)}function Xe(e,t,n,r){Se();try{for(var o in t){var i=Object.getOwnPropertyDescriptor(t,o);0;var a=(n&&o in n?n[o]:i.get?Q:r)(e,o,i,!0);a&&Object.defineProperty(e,o,a)}}finally{Oe()}}function Ke(e){var t,n,r={name:e.name};return e.observing&&e.observing.length>0&&(r.dependencies=(t=e.observing,n=[],t.forEach((function(e){-1===n.indexOf(e)&&n.push(e)})),n).map(Ke)),r}function Je(e,t){return null!=e&&(void 0!==t?!!jt(e)&&e[x].values.has(t):jt(e)||!!e[x]||k(e)||Ae(e)||ae(e))}function Ze(e){return 1!==arguments.length&&f(!1),Je(e)}function et(e,t,n){if(2!==arguments.length)if(jt(e)){var r=e[x],o=r.values.get(t);o?r.write(t,n):r.addObservableProp(t,n,r.defaultEnhancer)}else if(xt(e))e.set(t,n);else{if(!yt(e))return f(!1);"number"!=typeof t&&(t=parseInt(t,10)),d(t>=0,"Not a valid index: '"+t+"'"),Se(),t>=e.length&&(e.length=t+1),e[t]=n,Oe()}else{Se();var i=t;try{for(var a in i)et(e,a,i[a])}finally{Oe()}}}function tt(e){switch(e.length){case 0:return _e.trackingDerivation;case 1:return Dt(e[0]);case 2:return Dt(e[0],e[1])}}function nt(e,t){void 0===t&&(t=void 0),Se();try{return e.apply(t)}finally{Oe()}}function rt(e){return e[x]}var ot={has:function(e,t){if(t===x||"constructor"===t||t===T)return!0;var n=rt(e);return"string"==typeof t?n.has(t):t in e},get:function(e,t){if(t===x||"constructor"===t||t===T)return e[t];var n=rt(e),r=n.values.get(t);if(r instanceof E){var o=r.get();return void 0===o&&n.has(t),o}return"string"==typeof t&&n.has(t),e[t]},set:function(e,t,n){return"string"==typeof t&&(et(e,t,n),!0)},deleteProperty:function(e,t){return"string"==typeof t&&(rt(e).remove(t),!0)},ownKeys:function(e){return rt(e).keysAtom.reportObserved(),Reflect.ownKeys(e)},preventExtensions:function(e){return f("Dynamic observable objects cannot be frozen"),!1}};function it(e){var t=new Proxy(e,ot);return e[x].proxy=t,t}function at(e){return void 0!==e.interceptors&&e.interceptors.length>0}function st(e,t){var n=e.interceptors||(e.interceptors=[]);return n.push(t),p((function(){var e=n.indexOf(t);-1!==e&&n.splice(e,1)}))}function lt(e,t){var n=he();try{var r=e.interceptors;if(r)for(var o=0,i=r.length;o0}function ct(e,t){var n=e.changeListeners||(e.changeListeners=[]);return n.push(t),p((function(){var e=n.indexOf(t);-1!==e&&n.splice(e,1)}))}function ft(e,t){var n=he(),r=e.changeListeners;if(r){for(var o=0,i=(r=r.slice()).length;o0?e.map(this.dehancer):e},e.prototype.intercept=function(e){return st(this,e)},e.prototype.observe=function(e,t){return void 0===t&&(t=!1),t&&e({object:this.proxy,type:"splice",index:0,added:this.values.slice(),addedCount:this.values.length,removed:[],removedCount:0}),ct(this,e)},e.prototype.getArrayLength=function(){return this.atom.reportObserved(),this.values.length},e.prototype.setArrayLength=function(e){if("number"!=typeof e||e<0)throw new Error("[mobx.array] Out of range: "+e);var t=this.values.length;if(e!==t)if(e>t){for(var n=new Array(e-t),r=0;ro?e=o:e<0&&(e=Math.max(0,o+e)),t=1===arguments.length?o-e:null==t?0:Math.max(0,Math.min(t,o-e)),void 0===n&&(n=l),at(this)){var i=lt(this,{object:this.proxy,type:"splice",index:e,removedCount:t,added:n});if(!i)return l;t=i.removedCount,n=i.added}n=0===n.length?n:n.map((function(e){return r.enhancer(e,void 0)}));var a=this.spliceItemsIntoValues(e,t,n);return 0===t&&0===n.length||this.notifyArraySplice(e,n,a),this.dehanceValues(a)},e.prototype.spliceItemsIntoValues=function(e,t,n){var r;if(n.length<1e4)return(r=this.values).splice.apply(r,function(){for(var e=[],t=0;t-1&&(this.splice(n,1),!0)},get:function(e){var t=this[x];if(t){if(e=a.getTime()?n+1:t.getTime()>=l.getTime()?n:n-1}},function(e,t,n){var r=n(34);e.exports=function(e){return r(e,{weekStartsOn:1})}},function(e,t,n){var r=n(2);e.exports=function(e){var t=r(e);return t.setHours(0,0,0,0),t}},function(e,t,n){"use strict";!function e(){if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(e){console.error(e)}}(),e.exports=n(127)},function(e,t,n){var r=n(27),o=n(132),i=n(133),a=r?r.toStringTag:void 0;e.exports=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":a&&a in Object(e)?o(e):i(e)}},function(e,t){e.exports=function(e){return null!=e&&"object"==typeof e}},function(e,t,n){var r=n(140),o=n(143);e.exports=function(e,t){var n=o(e,t);return r(n)?n:void 0}},function(e,t,n){var r;!function(){"use strict";var n={}.hasOwnProperty;function o(){for(var e=[],t=0;to?1:0}},function(e,t,n){var r=n(62);e.exports=function(e,t,n){var o=null==e?void 0:r(e,t);return void 0===o?n:o}},function(e,t,n){!function(e){"object"==typeof window&&window||"object"==typeof self&&self;(function(e){var t,n=[],r=Object.keys,o={},i={},a=/^(no-?highlight|plain|text)$/i,s=/\blang(?:uage)?-([\w-]+)\b/i,l=/((^(<[^>]+>|\t|)+|(?:\n)))/gm,u="",c={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0};function f(e){return e.replace(/&/g,"&").replace(//g,">")}function d(e){return e.nodeName.toLowerCase()}function p(e,t){var n=e&&e.exec(t);return n&&0===n.index}function h(e){return a.test(e)}function m(e){var t,n,r,o,i=e.className+" ";if(i+=e.parentNode?e.parentNode.className:"",n=s.exec(i))return j(n[1])?n[1]:"no-highlight";for(t=0,r=(i=i.split(/\s+/)).length;t"}function u(e){i+=""}function c(e){("start"===e.event?l:u)(e.node)}for(;e.length||t.length;){var p=s();if(i+=f(r.substring(o,p[0].offset)),o=p[0].offset,p===e){a.reverse().forEach(u);do{c(p.splice(0,1)[0]),p=s()}while(p===e&&p.length&&p[0].offset===o);a.reverse().forEach(l)}else"start"===p[0].event?a.push(p[0].node):a.pop(),c(p.splice(0,1)[0])}return i+f(r.substr(o))}function b(e){return e.variants&&!e.cached_variants&&(e.cached_variants=e.variants.map((function(t){return v(e,{variants:null},t)}))),e.cached_variants||e.endsWithParent&&[v(e)]||[e]}function _(e){if(t&&!e.langApiRestored){for(var n in e.langApiRestored=!0,t)e[n]&&(e[t[n]]=e[n]);(e.contains||[]).concat(e.variants||[]).forEach(_)}}function w(e){function t(e){return e&&e.source||e}function n(n,r){return new RegExp(t(n),"m"+(e.case_insensitive?"i":"")+(r?"g":""))}function o(e,n){for(var r=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./,o=0,i="",a=0;a0&&(i+=n);l.length>0;){var u=r.exec(l);if(null==u){i+=l;break}i+=l.substring(0,u.index),l=l.substring(u.index+u[0].length),"\\"==u[0][0]&&u[1]?i+="\\"+String(Number(u[1])+s):(i+=u[0],"("==u[0]&&o++)}}return i}function i(a,s){if(!a.compiled){if(a.compiled=!0,a.keywords=a.keywords||a.beginKeywords,a.keywords){var l={},u=function(t,n){e.case_insensitive&&(n=n.toLowerCase()),n.split(" ").forEach((function(e){var n=e.split("|");l[n[0]]=[t,n[1]?Number(n[1]):1]}))};"string"==typeof a.keywords?u("keyword",a.keywords):r(a.keywords).forEach((function(e){u(e,a.keywords[e])})),a.keywords=l}a.lexemesRe=n(a.lexemes||/\w+/,!0),s&&(a.beginKeywords&&(a.begin="\\b("+a.beginKeywords.split(" ").join("|")+")\\b"),a.begin||(a.begin=/\B|\b/),a.beginRe=n(a.begin),a.endSameAsBegin&&(a.end=a.begin),a.end||a.endsWithParent||(a.end=/\B|\b/),a.end&&(a.endRe=n(a.end)),a.terminator_end=t(a.end)||"",a.endsWithParent&&s.terminator_end&&(a.terminator_end+=(a.end?"|":"")+s.terminator_end)),a.illegal&&(a.illegalRe=n(a.illegal)),null==a.relevance&&(a.relevance=1),a.contains||(a.contains=[]),a.contains=Array.prototype.concat.apply([],a.contains.map((function(e){return b("self"===e?a:e)}))),a.contains.forEach((function(e){i(e,a)})),a.starts&&i(a.starts,s);var c=a.contains.map((function(e){return e.beginKeywords?"\\.?(?:"+e.begin+")\\.?":e.begin})).concat([a.terminator_end,a.illegal]).map(t).filter(Boolean);a.terminators=c.length?n(o(c,"|"),!0):{exec:function(){return null}}}}i(e)}function x(e,t,n,r){function i(e){return new RegExp(e.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&"),"m")}function a(e,t){var n,r;for(n=0,r=t.contains.length;n')+t+(n?"":u)}function m(){var e,t,n,r;if(!S.keywords)return f(N);for(r="",t=0,S.lexemesRe.lastIndex=0,n=S.lexemesRe.exec(N);n;)r+=f(N.substring(t,n.index)),(e=d(S,n))?(C+=e[1],r+=h(e[0],f(n[0]))):r+=f(n[0]),t=S.lexemesRe.lastIndex,n=S.lexemesRe.exec(N);return r+f(N.substr(t))}function v(){var e="string"==typeof S.subLanguage;if(e&&!o[S.subLanguage])return f(N);var t=e?x(S.subLanguage,N,!0,O[S.subLanguage]):E(N,S.subLanguage.length?S.subLanguage:void 0);return S.relevance>0&&(C+=t.relevance),e&&(O[S.subLanguage]=t.top),h(t.language,t.value,!1,!0)}function g(){T+=null!=S.subLanguage?v():m(),N=""}function y(e){T+=e.className?h(e.className,"",!0):"",S=Object.create(e,{parent:{value:S}})}function b(e,t){if(N+=e,null==t)return g(),0;var n=a(t,S);if(n)return n.skip?N+=t:(n.excludeBegin&&(N+=t),g(),n.returnBegin||n.excludeBegin||(N=t)),y(n,t),n.returnBegin?0:t.length;var r=s(S,t);if(r){var o=S;o.skip?N+=t:(o.returnEnd||o.excludeEnd||(N+=t),g(),o.excludeEnd&&(N=t));do{S.className&&(T+=u),S.skip||S.subLanguage||(C+=S.relevance),S=S.parent}while(S!==r.parent);return r.starts&&(r.endSameAsBegin&&(r.starts.endRe=r.endRe),y(r.starts,"")),o.returnEnd?0:t.length}if(l(t,S))throw new Error('Illegal lexeme "'+t+'" for mode "'+(S.className||"")+'"');return N+=t,t.length||1}var _=j(e);if(!_)throw new Error('Unknown language: "'+e+'"');w(_);var k,S=r||_,O={},T="";for(k=S;k!==_;k=k.parent)k.className&&(T=h(k.className,"",!0)+T);var N="",C=0;try{for(var P,M,D=0;S.terminators.lastIndex=D,P=S.terminators.exec(t);)M=b(t.substring(D,P.index),P[0]),D=P.index+M;for(b(t.substr(D)),k=S;k.parent;k=k.parent)k.className&&(T+=u);return{relevance:C,value:T,language:e,top:S}}catch(e){if(e.message&&-1!==e.message.indexOf("Illegal"))return{relevance:0,value:f(t)};throw e}}function E(e,t){t=t||c.languages||r(o);var n={relevance:0,value:f(e)},i=n;return t.filter(j).filter(D).forEach((function(t){var r=x(t,e,!1);r.language=t,r.relevance>i.relevance&&(i=r),r.relevance>n.relevance&&(i=n,n=r)})),i.language&&(n.second_best=i),n}function k(e){return c.tabReplace||c.useBR?e.replace(l,(function(e,t){return c.useBR&&"\n"===e?"
":c.tabReplace?t.replace(/\t/g,c.tabReplace):""})):e}function S(e,t,n){var r=t?i[t]:n,o=[e.trim()];return e.match(/\bhljs\b/)||o.push("hljs"),-1===e.indexOf(r)&&o.push(r),o.join(" ").trim()}function O(e){var t,n,r,o,i,a=m(e);h(a)||(c.useBR?(t=document.createElementNS("http://www.w3.org/1999/xhtml","div")).innerHTML=e.innerHTML.replace(/\n/g,"").replace(//g,"\n"):t=e,i=t.textContent,r=a?x(a,i,!0):E(i),(n=g(t)).length&&((o=document.createElementNS("http://www.w3.org/1999/xhtml","div")).innerHTML=r.value,r.value=y(n,g(o),i)),r.value=k(r.value),e.innerHTML=r.value,e.className=S(e.className,a,r.language),e.result={language:r.language,re:r.relevance},r.second_best&&(e.second_best={language:r.second_best.language,re:r.second_best.relevance}))}function T(e){c=v(c,e)}function N(){if(!N.called){N.called=!0;var e=document.querySelectorAll("pre code");n.forEach.call(e,O)}}function C(){addEventListener("DOMContentLoaded",N,!1),addEventListener("load",N,!1)}function P(t,n){var r=o[t]=n(e);_(r),r.aliases&&r.aliases.forEach((function(e){i[e]=t}))}function M(){return r(o)}function j(e){return e=(e||"").toLowerCase(),o[e]||o[i[e]]}function D(e){var t=j(e);return t&&!t.disableAutodetect}e.highlight=x,e.highlightAuto=E,e.fixMarkup=k,e.highlightBlock=O,e.configure=T,e.initHighlighting=N,e.initHighlightingOnLoad=C,e.registerLanguage=P,e.listLanguages=M,e.getLanguage=j,e.autoDetection=D,e.inherit=v,e.IDENT_RE="[a-zA-Z]\\w*",e.UNDERSCORE_IDENT_RE="[a-zA-Z_]\\w*",e.NUMBER_RE="\\b\\d+(\\.\\d+)?",e.C_NUMBER_RE="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",e.BINARY_NUMBER_RE="\\b(0b[01]+)",e.RE_STARTERS_RE="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",e.BACKSLASH_ESCAPE={begin:"\\\\[\\s\\S]",relevance:0},e.APOS_STRING_MODE={className:"string",begin:"'",end:"'",illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},e.QUOTE_STRING_MODE={className:"string",begin:'"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},e.PHRASAL_WORDS_MODE={begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},e.COMMENT=function(t,n,r){var o=e.inherit({className:"comment",begin:t,end:n,contains:[]},r||{});return o.contains.push(e.PHRASAL_WORDS_MODE),o.contains.push({className:"doctag",begin:"(?:TODO|FIXME|NOTE|BUG|XXX):",relevance:0}),o},e.C_LINE_COMMENT_MODE=e.COMMENT("//","$"),e.C_BLOCK_COMMENT_MODE=e.COMMENT("/\\*","\\*/"),e.HASH_COMMENT_MODE=e.COMMENT("#","$"),e.NUMBER_MODE={className:"number",begin:e.NUMBER_RE,relevance:0},e.C_NUMBER_MODE={className:"number",begin:e.C_NUMBER_RE,relevance:0},e.BINARY_NUMBER_MODE={className:"number",begin:e.BINARY_NUMBER_RE,relevance:0},e.CSS_NUMBER_MODE={className:"number",begin:e.NUMBER_RE+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},e.REGEXP_MODE={className:"regexp",begin:/\//,end:/\/[gimuy]*/,illegal:/\n/,contains:[e.BACKSLASH_ESCAPE,{begin:/\[/,end:/\]/,relevance:0,contains:[e.BACKSLASH_ESCAPE]}]},e.TITLE_MODE={className:"title",begin:e.IDENT_RE,relevance:0},e.UNDERSCORE_TITLE_MODE={className:"title",begin:e.UNDERSCORE_IDENT_RE,relevance:0},e.METHOD_GUARD={begin:"\\.\\s*"+e.UNDERSCORE_IDENT_RE,relevance:0}})(t)}()},function(e,t,n){var r=n(14),o=n(15);e.exports=function(e){return"symbol"==typeof e||o(e)&&"[object Symbol]"==r(e)}},function(e,t,n){var r=n(8).Symbol;e.exports=r},function(e,t,n){var r=n(16)(Object,"create");e.exports=r},function(e,t){e.exports=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},function(e,t,n){var r=n(148),o=n(149),i=n(150),a=n(151),s=n(152);function l(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t-1&&e%1==0&&e<=9007199254740991}},function(e,t,n){var r=n(38),o=n(49);e.exports=function(e){return null!=e&&o(e.length)&&!r(e)}},function(e,t){e.exports=function(e){return e instanceof Date}},function(e,t,n){var r=n(2);e.exports=function(e){var t=r(e),n=t.getFullYear(),o=t.getMonth(),i=new Date(0);return i.setFullYear(n,o+1,0),i.setHours(0,0,0,0),i.getDate()}},function(e,t,n){var r=n(20);e.exports=function(e,t){var n=Number(t);return r(e,7*n)}},function(e,t,n){var r=n(2);e.exports=function(e,t){var n=r(e).getTime(),o=r(t).getTime();return n>o?-1:n0?Math.floor(n):Math.ceil(n)}},function(e,t,n){var r=n(211),o=n(212);e.exports={distanceInWords:r(),format:o()}},function(e,t,n){var r=n(2);e.exports=function(e){var t=r(e);return t.setHours(23,59,59,999),t}},function(e,t,n){var r=n(2),o=n(11),i=n(22);e.exports=function(e){var t=r(e),n=o(t).getTime()-i(t).getTime();return Math.round(n/6048e5)+1}},function(e,t,n){var r=n(34);e.exports=function(e,t,n){var o=r(e,n),i=r(t,n);return o.getTime()===i.getTime()}},function(e,t,n){"use strict";var r=Object.getOwnPropertySymbols,o=Object.prototype.hasOwnProperty,i=Object.prototype.propertyIsEnumerable;function a(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map((function(e){return t[e]})).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach((function(e){r[e]=e})),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},r)).join("")}catch(e){return!1}}()?Object.assign:function(e,t){for(var n,s,l=a(e),u=1;uc))return!1;var d=l.get(e);if(d&&l.get(t))return d==t;var p=-1,h=!0,m=2&n?new r:void 0;for(l.set(e,t),l.set(t,e);++p-1&&e%1==0&&e0?(p=o(e),h=o(t)):(p=o(t),h=o(e));var v,g=i(h,p),y=h.getTimezoneOffset()-p.getTimezoneOffset(),b=Math.round(g/60)-y;if(b<2)return u.includeSeconds?g<5?d("lessThanXSeconds",5,m):g<10?d("lessThanXSeconds",10,m):g<20?d("lessThanXSeconds",20,m):g<40?d("halfAMinute",null,m):d(g<60?"lessThanXMinutes":"xMinutes",1,m):0===b?d("lessThanXMinutes",1,m):d("xMinutes",b,m);if(b<45)return d("xMinutes",b,m);if(b<90)return d("aboutXHours",1,m);if(b<1440)return d("aboutXHours",Math.round(b/60),m);if(b<2520)return d("xDays",1,m);if(b{if(!Number.isFinite(e))throw new TypeError("Expected a finite number");t.colonNotation&&(t.compact=!1,t.formatSubMilliseconds=!1,t.separateMilliseconds=!1,t.verbose=!1),t.compact&&(t.secondsDecimalDigits=0,t.millisecondsDecimalDigits=0);const n=[],o=(e,r,o,i)=>{if(!(0!==n.length&&t.colonNotation||0!==e||t.colonNotation&&"m"===o))return;let a,s;if(i=(i||e||"0").toString(),t.colonNotation){a=n.length>0?":":"",s="";const e=i.includes(".")?i.split(".")[0].length:i.length,t=n.length>0?2:1;i="0".repeat(Math.max(0,t-e))+i}else a="",s=t.verbose?" "+(l=r,1===e?l:`${l}s`):o;var l;n.push(a+i+s)},i=r(e);if(o(Math.trunc(i.days/365),"year","y"),o(i.days%365,"day","d"),o(i.hours,"hour","h"),o(i.minutes,"minute","m"),t.separateMilliseconds||t.formatSubMilliseconds||e<1e3)if(o(i.seconds,"second","s"),t.formatSubMilliseconds)o(i.milliseconds,"millisecond","ms"),o(i.microseconds,"microsecond","µs"),o(i.nanoseconds,"nanosecond","ns");else{const e=i.milliseconds+i.microseconds/1e3+i.nanoseconds/1e6,n="number"==typeof t.millisecondsDecimalDigits?t.millisecondsDecimalDigits:0,r=e>=1?Math.round(e):Math.ceil(e),a=n?e.toFixed(n):r;o(Number.parseFloat(a,10),"millisecond","ms",a)}else{const n=((e,t)=>{const n=Math.floor(e*10**t+1e-7);return(Math.round(n)/10**t).toFixed(t)})(e/1e3%60,"number"==typeof t.secondsDecimalDigits?t.secondsDecimalDigits:1),r=t.keepDecimalsOnWholeSeconds?n:n.replace(/\.0+$/,"");o(Number.parseFloat(r,10),"second","s",r)}if(0===n.length)return"0"+(t.verbose?" milliseconds":"ms");if(t.compact)return n[0];if("number"==typeof t.unitCount){const e=t.colonNotation?"":" ";return n.slice(0,Math.max(t.unitCount,1)).join(e)}return t.colonNotation?n.join(""):n.join(" ")}},function(e,t,n){e.exports={"trans-color":"footer--trans-color---205XF",component:"footer--component---1WcTR"}},function(e){e.exports={"3d_rotation":"e84d",ac_unit:"eb3b",access_alarm:"e190",access_alarms:"e191",access_time:"e192",accessibility:"e84e",accessible:"e914",account_balance:"e84f",account_balance_wallet:"e850",account_box:"e851",account_circle:"e853",adb:"e60e",add:"e145",add_a_photo:"e439",add_alarm:"e193",add_alert:"e003",add_box:"e146",add_circle:"e147",add_circle_outline:"e148",add_location:"e567",add_shopping_cart:"e854",add_to_photos:"e39d",add_to_queue:"e05c",adjust:"e39e",airline_seat_flat:"e630",airline_seat_flat_angled:"e631",airline_seat_individual_suite:"e632",airline_seat_legroom_extra:"e633",airline_seat_legroom_normal:"e634",airline_seat_legroom_reduced:"e635",airline_seat_recline_extra:"e636",airline_seat_recline_normal:"e637",airplanemode_active:"e195",airplanemode_inactive:"e194",airplay:"e055",airport_shuttle:"eb3c",alarm:"e855",alarm_add:"e856",alarm_off:"e857",alarm_on:"e858",album:"e019",all_inclusive:"eb3d",all_out:"e90b",android:"e859",announcement:"e85a",apps:"e5c3",archive:"e149",arrow_back:"e5c4",arrow_downward:"e5db",arrow_drop_down:"e5c5",arrow_drop_down_circle:"e5c6",arrow_drop_up:"e5c7",arrow_forward:"e5c8",arrow_upward:"e5d8",art_track:"e060",aspect_ratio:"e85b",assessment:"e85c",assignment:"e85d",assignment_ind:"e85e",assignment_late:"e85f",assignment_return:"e860",assignment_returned:"e861",assignment_turned_in:"e862",assistant:"e39f",assistant_photo:"e3a0",attach_file:"e226",attach_money:"e227",attachment:"e2bc",audiotrack:"e3a1",autorenew:"e863",av_timer:"e01b",backspace:"e14a",backup:"e864",battery_alert:"e19c",battery_charging_full:"e1a3",battery_full:"e1a4",battery_std:"e1a5",battery_unknown:"e1a6",beach_access:"eb3e",beenhere:"e52d",block:"e14b",bluetooth:"e1a7",bluetooth_audio:"e60f",bluetooth_connected:"e1a8",bluetooth_disabled:"e1a9",bluetooth_searching:"e1aa",blur_circular:"e3a2",blur_linear:"e3a3",blur_off:"e3a4",blur_on:"e3a5",book:"e865",bookmark:"e866",bookmark_border:"e867",border_all:"e228",border_bottom:"e229",border_clear:"e22a",border_color:"e22b",border_horizontal:"e22c",border_inner:"e22d",border_left:"e22e",border_outer:"e22f",border_right:"e230",border_style:"e231",border_top:"e232",border_vertical:"e233",branding_watermark:"e06b",brightness_1:"e3a6",brightness_2:"e3a7",brightness_3:"e3a8",brightness_4:"e3a9",brightness_5:"e3aa",brightness_6:"e3ab",brightness_7:"e3ac",brightness_auto:"e1ab",brightness_high:"e1ac",brightness_low:"e1ad",brightness_medium:"e1ae",broken_image:"e3ad",brush:"e3ae",bubble_chart:"e6dd",bug_report:"e868",build:"e869",burst_mode:"e43c",business:"e0af",business_center:"eb3f",cached:"e86a",cake:"e7e9",call:"e0b0",call_end:"e0b1",call_made:"e0b2",call_merge:"e0b3",call_missed:"e0b4",call_missed_outgoing:"e0e4",call_received:"e0b5",call_split:"e0b6",call_to_action:"e06c",camera:"e3af",camera_alt:"e3b0",camera_enhance:"e8fc",camera_front:"e3b1",camera_rear:"e3b2",camera_roll:"e3b3",cancel:"e5c9",card_giftcard:"e8f6",card_membership:"e8f7",card_travel:"e8f8",casino:"eb40",cast:"e307",cast_connected:"e308",center_focus_strong:"e3b4",center_focus_weak:"e3b5",change_history:"e86b",chat:"e0b7",chat_bubble:"e0ca",chat_bubble_outline:"e0cb",check:"e5ca",check_box:"e834",check_box_outline_blank:"e835",check_circle:"e86c",chevron_left:"e5cb",chevron_right:"e5cc",child_care:"eb41",child_friendly:"eb42",chrome_reader_mode:"e86d",class:"e86e",clear:"e14c",clear_all:"e0b8",close:"e5cd",closed_caption:"e01c",cloud:"e2bd",cloud_circle:"e2be",cloud_done:"e2bf",cloud_download:"e2c0",cloud_off:"e2c1",cloud_queue:"e2c2",cloud_upload:"e2c3",code:"e86f",collections:"e3b6",collections_bookmark:"e431",color_lens:"e3b7",colorize:"e3b8",comment:"e0b9",compare:"e3b9",compare_arrows:"e915",computer:"e30a",confirmation_number:"e638",contact_mail:"e0d0",contact_phone:"e0cf",contacts:"e0ba",content_copy:"e14d",content_cut:"e14e",content_paste:"e14f",control_point:"e3ba",control_point_duplicate:"e3bb",copyright:"e90c",create:"e150",create_new_folder:"e2cc",credit_card:"e870",crop:"e3be",crop_16_9:"e3bc",crop_3_2:"e3bd",crop_5_4:"e3bf",crop_7_5:"e3c0",crop_din:"e3c1",crop_free:"e3c2",crop_landscape:"e3c3",crop_original:"e3c4",crop_portrait:"e3c5",crop_rotate:"e437",crop_square:"e3c6",dashboard:"e871",data_usage:"e1af",date_range:"e916",dehaze:"e3c7",delete:"e872",delete_forever:"e92b",delete_sweep:"e16c",description:"e873",desktop_mac:"e30b",desktop_windows:"e30c",details:"e3c8",developer_board:"e30d",developer_mode:"e1b0",device_hub:"e335",devices:"e1b1",devices_other:"e337",dialer_sip:"e0bb",dialpad:"e0bc",directions:"e52e",directions_bike:"e52f",directions_boat:"e532",directions_bus:"e530",directions_car:"e531",directions_railway:"e534",directions_run:"e566",directions_subway:"e533",directions_transit:"e535",directions_walk:"e536",disc_full:"e610",dns:"e875",do_not_disturb:"e612",do_not_disturb_alt:"e611",do_not_disturb_off:"e643",do_not_disturb_on:"e644",dock:"e30e",domain:"e7ee",done:"e876",done_all:"e877",donut_large:"e917",donut_small:"e918",drafts:"e151",drag_handle:"e25d",drive_eta:"e613",dvr:"e1b2",edit:"e3c9",edit_location:"e568",eject:"e8fb",email:"e0be",enhanced_encryption:"e63f",equalizer:"e01d",error:"e000",error_outline:"e001",euro_symbol:"e926",ev_station:"e56d",event:"e878",event_available:"e614",event_busy:"e615",event_note:"e616",event_seat:"e903",exit_to_app:"e879",expand_less:"e5ce",expand_more:"e5cf",explicit:"e01e",explore:"e87a",exposure:"e3ca",exposure_neg_1:"e3cb",exposure_neg_2:"e3cc",exposure_plus_1:"e3cd",exposure_plus_2:"e3ce",exposure_zero:"e3cf",extension:"e87b",face:"e87c",fast_forward:"e01f",fast_rewind:"e020",favorite:"e87d",favorite_border:"e87e",featured_play_list:"e06d",featured_video:"e06e",feedback:"e87f",fiber_dvr:"e05d",fiber_manual_record:"e061",fiber_new:"e05e",fiber_pin:"e06a",fiber_smart_record:"e062",file_download:"e2c4",file_upload:"e2c6",filter:"e3d3",filter_1:"e3d0",filter_2:"e3d1",filter_3:"e3d2",filter_4:"e3d4",filter_5:"e3d5",filter_6:"e3d6",filter_7:"e3d7",filter_8:"e3d8",filter_9:"e3d9",filter_9_plus:"e3da",filter_b_and_w:"e3db",filter_center_focus:"e3dc",filter_drama:"e3dd",filter_frames:"e3de",filter_hdr:"e3df",filter_list:"e152",filter_none:"e3e0",filter_tilt_shift:"e3e2",filter_vintage:"e3e3",find_in_page:"e880",find_replace:"e881",fingerprint:"e90d",first_page:"e5dc",fitness_center:"eb43",flag:"e153",flare:"e3e4",flash_auto:"e3e5",flash_off:"e3e6",flash_on:"e3e7",flight:"e539",flight_land:"e904",flight_takeoff:"e905",flip:"e3e8",flip_to_back:"e882",flip_to_front:"e883",folder:"e2c7",folder_open:"e2c8",folder_shared:"e2c9",folder_special:"e617",font_download:"e167",format_align_center:"e234",format_align_justify:"e235",format_align_left:"e236",format_align_right:"e237",format_bold:"e238",format_clear:"e239",format_color_fill:"e23a",format_color_reset:"e23b",format_color_text:"e23c",format_indent_decrease:"e23d",format_indent_increase:"e23e",format_italic:"e23f",format_line_spacing:"e240",format_list_bulleted:"e241",format_list_numbered:"e242",format_paint:"e243",format_quote:"e244",format_shapes:"e25e",format_size:"e245",format_strikethrough:"e246",format_textdirection_l_to_r:"e247",format_textdirection_r_to_l:"e248",format_underlined:"e249",forum:"e0bf",forward:"e154",forward_10:"e056",forward_30:"e057",forward_5:"e058",free_breakfast:"eb44",fullscreen:"e5d0",fullscreen_exit:"e5d1",functions:"e24a",g_translate:"e927",gamepad:"e30f",games:"e021",gavel:"e90e",gesture:"e155",get_app:"e884",gif:"e908",golf_course:"eb45",gps_fixed:"e1b3",gps_not_fixed:"e1b4",gps_off:"e1b5",grade:"e885",gradient:"e3e9",grain:"e3ea",graphic_eq:"e1b8",grid_off:"e3eb",grid_on:"e3ec",group:"e7ef",group_add:"e7f0",group_work:"e886",hd:"e052",hdr_off:"e3ed",hdr_on:"e3ee",hdr_strong:"e3f1",hdr_weak:"e3f2",headset:"e310",headset_mic:"e311",healing:"e3f3",hearing:"e023",help:"e887",help_outline:"e8fd",high_quality:"e024",highlight:"e25f",highlight_off:"e888",history:"e889",home:"e88a",hot_tub:"eb46",hotel:"e53a",hourglass_empty:"e88b",hourglass_full:"e88c",http:"e902",https:"e88d",image:"e3f4",image_aspect_ratio:"e3f5",import_contacts:"e0e0",import_export:"e0c3",important_devices:"e912",inbox:"e156",indeterminate_check_box:"e909",info:"e88e",info_outline:"e88f",input:"e890",insert_chart:"e24b",insert_comment:"e24c",insert_drive_file:"e24d",insert_emoticon:"e24e",insert_invitation:"e24f",insert_link:"e250",insert_photo:"e251",invert_colors:"e891",invert_colors_off:"e0c4",iso:"e3f6",keyboard:"e312",keyboard_arrow_down:"e313",keyboard_arrow_left:"e314",keyboard_arrow_right:"e315",keyboard_arrow_up:"e316",keyboard_backspace:"e317",keyboard_capslock:"e318",keyboard_hide:"e31a",keyboard_return:"e31b",keyboard_tab:"e31c",keyboard_voice:"e31d",kitchen:"eb47",label:"e892",label_outline:"e893",landscape:"e3f7",language:"e894",laptop:"e31e",laptop_chromebook:"e31f",laptop_mac:"e320",laptop_windows:"e321",last_page:"e5dd",launch:"e895",layers:"e53b",layers_clear:"e53c",leak_add:"e3f8",leak_remove:"e3f9",lens:"e3fa",library_add:"e02e",library_books:"e02f",library_music:"e030",lightbulb_outline:"e90f",line_style:"e919",line_weight:"e91a",linear_scale:"e260",link:"e157",linked_camera:"e438",list:"e896",live_help:"e0c6",live_tv:"e639",local_activity:"e53f",local_airport:"e53d",local_atm:"e53e",local_bar:"e540",local_cafe:"e541",local_car_wash:"e542",local_convenience_store:"e543",local_dining:"e556",local_drink:"e544",local_florist:"e545",local_gas_station:"e546",local_grocery_store:"e547",local_hospital:"e548",local_hotel:"e549",local_laundry_service:"e54a",local_library:"e54b",local_mall:"e54c",local_movies:"e54d",local_offer:"e54e",local_parking:"e54f",local_pharmacy:"e550",local_phone:"e551",local_pizza:"e552",local_play:"e553",local_post_office:"e554",local_printshop:"e555",local_see:"e557",local_shipping:"e558",local_taxi:"e559",location_city:"e7f1",location_disabled:"e1b6",location_off:"e0c7",location_on:"e0c8",location_searching:"e1b7",lock:"e897",lock_open:"e898",lock_outline:"e899",looks:"e3fc",looks_3:"e3fb",looks_4:"e3fd",looks_5:"e3fe",looks_6:"e3ff",looks_one:"e400",looks_two:"e401",loop:"e028",loupe:"e402",low_priority:"e16d",loyalty:"e89a",mail:"e158",mail_outline:"e0e1",map:"e55b",markunread:"e159",markunread_mailbox:"e89b",memory:"e322",menu:"e5d2",merge_type:"e252",message:"e0c9",mic:"e029",mic_none:"e02a",mic_off:"e02b",mms:"e618",mode_comment:"e253",mode_edit:"e254",monetization_on:"e263",money_off:"e25c",monochrome_photos:"e403",mood:"e7f2",mood_bad:"e7f3",more:"e619",more_horiz:"e5d3",more_vert:"e5d4",motorcycle:"e91b",mouse:"e323",move_to_inbox:"e168",movie:"e02c",movie_creation:"e404",movie_filter:"e43a",multiline_chart:"e6df",music_note:"e405",music_video:"e063",my_location:"e55c",nature:"e406",nature_people:"e407",navigate_before:"e408",navigate_next:"e409",navigation:"e55d",near_me:"e569",network_cell:"e1b9",network_check:"e640",network_locked:"e61a",network_wifi:"e1ba",new_releases:"e031",next_week:"e16a",nfc:"e1bb",no_encryption:"e641",no_sim:"e0cc",not_interested:"e033",note:"e06f",note_add:"e89c",notifications:"e7f4",notifications_active:"e7f7",notifications_none:"e7f5",notifications_off:"e7f6",notifications_paused:"e7f8",offline_pin:"e90a",ondemand_video:"e63a",opacity:"e91c",open_in_browser:"e89d",open_in_new:"e89e",open_with:"e89f",pages:"e7f9",pageview:"e8a0",palette:"e40a",pan_tool:"e925",panorama:"e40b",panorama_fish_eye:"e40c",panorama_horizontal:"e40d",panorama_vertical:"e40e",panorama_wide_angle:"e40f",party_mode:"e7fa",pause:"e034",pause_circle_filled:"e035",pause_circle_outline:"e036",payment:"e8a1",people:"e7fb",people_outline:"e7fc",perm_camera_mic:"e8a2",perm_contact_calendar:"e8a3",perm_data_setting:"e8a4",perm_device_information:"e8a5",perm_identity:"e8a6",perm_media:"e8a7",perm_phone_msg:"e8a8",perm_scan_wifi:"e8a9",person:"e7fd",person_add:"e7fe",person_outline:"e7ff",person_pin:"e55a",person_pin_circle:"e56a",personal_video:"e63b",pets:"e91d",phone:"e0cd",phone_android:"e324",phone_bluetooth_speaker:"e61b",phone_forwarded:"e61c",phone_in_talk:"e61d",phone_iphone:"e325",phone_locked:"e61e",phone_missed:"e61f",phone_paused:"e620",phonelink:"e326",phonelink_erase:"e0db",phonelink_lock:"e0dc",phonelink_off:"e327",phonelink_ring:"e0dd",phonelink_setup:"e0de",photo:"e410",photo_album:"e411",photo_camera:"e412",photo_filter:"e43b",photo_library:"e413",photo_size_select_actual:"e432",photo_size_select_large:"e433",photo_size_select_small:"e434",picture_as_pdf:"e415",picture_in_picture:"e8aa",picture_in_picture_alt:"e911",pie_chart:"e6c4",pie_chart_outlined:"e6c5",pin_drop:"e55e",place:"e55f",play_arrow:"e037",play_circle_filled:"e038",play_circle_outline:"e039",play_for_work:"e906",playlist_add:"e03b",playlist_add_check:"e065",playlist_play:"e05f",plus_one:"e800",poll:"e801",polymer:"e8ab",pool:"eb48",portable_wifi_off:"e0ce",portrait:"e416",power:"e63c",power_input:"e336",power_settings_new:"e8ac",pregnant_woman:"e91e",present_to_all:"e0df",print:"e8ad",priority_high:"e645",public:"e80b",publish:"e255",query_builder:"e8ae",question_answer:"e8af",queue:"e03c",queue_music:"e03d",queue_play_next:"e066",radio:"e03e",radio_button_checked:"e837",radio_button_unchecked:"e836",rate_review:"e560",receipt:"e8b0",recent_actors:"e03f",record_voice_over:"e91f",redeem:"e8b1",redo:"e15a",refresh:"e5d5",remove:"e15b",remove_circle:"e15c",remove_circle_outline:"e15d",remove_from_queue:"e067",remove_red_eye:"e417",remove_shopping_cart:"e928",reorder:"e8fe",repeat:"e040",repeat_one:"e041",replay:"e042",replay_10:"e059",replay_30:"e05a",replay_5:"e05b",reply:"e15e",reply_all:"e15f",report:"e160",report_problem:"e8b2",restaurant:"e56c",restaurant_menu:"e561",restore:"e8b3",restore_page:"e929",ring_volume:"e0d1",room:"e8b4",room_service:"eb49",rotate_90_degrees_ccw:"e418",rotate_left:"e419",rotate_right:"e41a",rounded_corner:"e920",router:"e328",rowing:"e921",rss_feed:"e0e5",rv_hookup:"e642",satellite:"e562",save:"e161",scanner:"e329",schedule:"e8b5",school:"e80c",screen_lock_landscape:"e1be",screen_lock_portrait:"e1bf",screen_lock_rotation:"e1c0",screen_rotation:"e1c1",screen_share:"e0e2",sd_card:"e623",sd_storage:"e1c2",search:"e8b6",security:"e32a",select_all:"e162",send:"e163",sentiment_dissatisfied:"e811",sentiment_neutral:"e812",sentiment_satisfied:"e813",sentiment_very_dissatisfied:"e814",sentiment_very_satisfied:"e815",settings:"e8b8",settings_applications:"e8b9",settings_backup_restore:"e8ba",settings_bluetooth:"e8bb",settings_brightness:"e8bd",settings_cell:"e8bc",settings_ethernet:"e8be",settings_input_antenna:"e8bf",settings_input_component:"e8c0",settings_input_composite:"e8c1",settings_input_hdmi:"e8c2",settings_input_svideo:"e8c3",settings_overscan:"e8c4",settings_phone:"e8c5",settings_power:"e8c6",settings_remote:"e8c7",settings_system_daydream:"e1c3",settings_voice:"e8c8",share:"e80d",shop:"e8c9",shop_two:"e8ca",shopping_basket:"e8cb",shopping_cart:"e8cc",short_text:"e261",show_chart:"e6e1",shuffle:"e043",signal_cellular_4_bar:"e1c8",signal_cellular_connected_no_internet_4_bar:"e1cd",signal_cellular_no_sim:"e1ce",signal_cellular_null:"e1cf",signal_cellular_off:"e1d0",signal_wifi_4_bar:"e1d8",signal_wifi_4_bar_lock:"e1d9",signal_wifi_off:"e1da",sim_card:"e32b",sim_card_alert:"e624",skip_next:"e044",skip_previous:"e045",slideshow:"e41b",slow_motion_video:"e068",smartphone:"e32c",smoke_free:"eb4a",smoking_rooms:"eb4b",sms:"e625",sms_failed:"e626",snooze:"e046",sort:"e164",sort_by_alpha:"e053",spa:"eb4c",space_bar:"e256",speaker:"e32d",speaker_group:"e32e",speaker_notes:"e8cd",speaker_notes_off:"e92a",speaker_phone:"e0d2",spellcheck:"e8ce",star:"e838",star_border:"e83a",star_half:"e839",stars:"e8d0",stay_current_landscape:"e0d3",stay_current_portrait:"e0d4",stay_primary_landscape:"e0d5",stay_primary_portrait:"e0d6",stop:"e047",stop_screen_share:"e0e3",storage:"e1db",store:"e8d1",store_mall_directory:"e563",straighten:"e41c",streetview:"e56e",strikethrough_s:"e257",style:"e41d",subdirectory_arrow_left:"e5d9",subdirectory_arrow_right:"e5da",subject:"e8d2",subscriptions:"e064",subtitles:"e048",subway:"e56f",supervisor_account:"e8d3",surround_sound:"e049",swap_calls:"e0d7",swap_horiz:"e8d4",swap_vert:"e8d5",swap_vertical_circle:"e8d6",switch_camera:"e41e",switch_video:"e41f",sync:"e627",sync_disabled:"e628",sync_problem:"e629",system_update:"e62a",system_update_alt:"e8d7",tab:"e8d8",tab_unselected:"e8d9",tablet:"e32f",tablet_android:"e330",tablet_mac:"e331",tag_faces:"e420",tap_and_play:"e62b",terrain:"e564",text_fields:"e262",text_format:"e165",textsms:"e0d8",texture:"e421",theaters:"e8da",thumb_down:"e8db",thumb_up:"e8dc",thumbs_up_down:"e8dd",time_to_leave:"e62c",timelapse:"e422",timeline:"e922",timer:"e425",timer_10:"e423",timer_3:"e424",timer_off:"e426",title:"e264",toc:"e8de",today:"e8df",toll:"e8e0",tonality:"e427",touch_app:"e913",toys:"e332",track_changes:"e8e1",traffic:"e565",train:"e570",tram:"e571",transfer_within_a_station:"e572",transform:"e428",translate:"e8e2",trending_down:"e8e3",trending_flat:"e8e4",trending_up:"e8e5",tune:"e429",turned_in:"e8e6",turned_in_not:"e8e7",tv:"e333",unarchive:"e169",undo:"e166",unfold_less:"e5d6",unfold_more:"e5d7",update:"e923",usb:"e1e0",verified_user:"e8e8",vertical_align_bottom:"e258",vertical_align_center:"e259",vertical_align_top:"e25a",vibration:"e62d",video_call:"e070",video_label:"e071",video_library:"e04a",videocam:"e04b",videocam_off:"e04c",videogame_asset:"e338",view_agenda:"e8e9",view_array:"e8ea",view_carousel:"e8eb",view_column:"e8ec",view_comfy:"e42a",view_compact:"e42b",view_day:"e8ed",view_headline:"e8ee",view_list:"e8ef",view_module:"e8f0",view_quilt:"e8f1",view_stream:"e8f2",view_week:"e8f3",vignette:"e435",visibility:"e8f4",visibility_off:"e8f5",voice_chat:"e62e",voicemail:"e0d9",volume_down:"e04d",volume_mute:"e04e",volume_off:"e04f",volume_up:"e050",vpn_key:"e0da",vpn_lock:"e62f",wallpaper:"e1bc",warning:"e002",watch:"e334",watch_later:"e924",wb_auto:"e42c",wb_cloudy:"e42d",wb_incandescent:"e42e",wb_iridescent:"e436",wb_sunny:"e430",wc:"e63d",web:"e051",web_asset:"e069",weekend:"e16b",whatshot:"e80e",widgets:"e1bd",wifi:"e63e",wifi_lock:"e1e1",wifi_tethering:"e1e2",work:"e8f9",wrap_text:"e25b",youtube_searched_for:"e8fa",zoom_in:"e8ff",zoom_out:"e900",zoom_out_map:"e56b"}},function(e,t,n){e.exports={"trans-color":"loader--trans-color---97r08",component:"loader--component---2grcA",wrap:"loader--wrap---3Fhrc",text:"loader--text---3Yu3g",spinner:"loader--spinner---2q6MO",spin:"loader--spin---K6Loh"}},function(e,t,n){e.exports={addDays:n(20),addHours:n(75),addISOYears:n(76),addMilliseconds:n(21),addMinutes:n(78),addMonths:n(36),addQuarters:n(79),addSeconds:n(80),addWeeks:n(53),addYears:n(81),areRangesOverlapping:n(199),closestIndexTo:n(200),closestTo:n(201),compareAsc:n(23),compareDesc:n(54),differenceInCalendarDays:n(35),differenceInCalendarISOWeeks:n(202),differenceInCalendarISOYears:n(82),differenceInCalendarMonths:n(83),differenceInCalendarQuarters:n(203),differenceInCalendarWeeks:n(204),differenceInCalendarYears:n(85),differenceInDays:n(86),differenceInHours:n(205),differenceInISOYears:n(206),differenceInMilliseconds:n(37),differenceInMinutes:n(207),differenceInMonths:n(55),differenceInQuarters:n(208),differenceInSeconds:n(56),differenceInWeeks:n(209),differenceInYears:n(210),distanceInWords:n(88),distanceInWordsStrict:n(214),distanceInWordsToNow:n(215),eachDay:n(216),endOfDay:n(58),endOfHour:n(217),endOfISOWeek:n(218),endOfISOYear:n(219),endOfMinute:n(220),endOfMonth:n(90),endOfQuarter:n(221),endOfSecond:n(222),endOfToday:n(223),endOfTomorrow:n(224),endOfWeek:n(89),endOfYear:n(225),endOfYesterday:n(226),format:n(227),getDate:n(228),getDay:n(229),getDayOfYear:n(91),getDaysInMonth:n(52),getDaysInYear:n(230),getHours:n(231),getISODay:n(95),getISOWeek:n(59),getISOWeeksInYear:n(232),getISOYear:n(10),getMilliseconds:n(233),getMinutes:n(234),getMonth:n(235),getOverlappingDaysInRanges:n(236),getQuarter:n(84),getSeconds:n(237),getTime:n(238),getYear:n(239),isAfter:n(240),isBefore:n(241),isDate:n(51),isEqual:n(242),isFirstDayOfMonth:n(243),isFriday:n(244),isFuture:n(245),isLastDayOfMonth:n(246),isLeapYear:n(94),isMonday:n(247),isPast:n(248),isSameDay:n(249),isSameHour:n(96),isSameISOWeek:n(98),isSameISOYear:n(99),isSameMinute:n(100),isSameMonth:n(102),isSameQuarter:n(103),isSameSecond:n(105),isSameWeek:n(60),isSameYear:n(107),isSaturday:n(250),isSunday:n(251),isThisHour:n(252),isThisISOWeek:n(253),isThisISOYear:n(254),isThisMinute:n(255),isThisMonth:n(256),isThisQuarter:n(257),isThisSecond:n(258),isThisWeek:n(259),isThisYear:n(260),isThursday:n(261),isToday:n(262),isTomorrow:n(263),isTuesday:n(264),isValid:n(93),isWednesday:n(265),isWeekend:n(266),isWithinRange:n(267),isYesterday:n(268),lastDayOfISOWeek:n(269),lastDayOfISOYear:n(270),lastDayOfMonth:n(271),lastDayOfQuarter:n(272),lastDayOfWeek:n(108),lastDayOfYear:n(273),max:n(274),min:n(275),parse:n(2),setDate:n(276),setDay:n(277),setDayOfYear:n(278),setHours:n(279),setISODay:n(280),setISOWeek:n(281),setISOYear:n(77),setMilliseconds:n(282),setMinutes:n(283),setMonth:n(109),setQuarter:n(284),setSeconds:n(285),setYear:n(286),startOfDay:n(12),startOfHour:n(97),startOfISOWeek:n(11),startOfISOYear:n(22),startOfMinute:n(101),startOfMonth:n(287),startOfQuarter:n(104),startOfSecond:n(106),startOfToday:n(288),startOfTomorrow:n(289),startOfWeek:n(34),startOfYear:n(92),startOfYesterday:n(290),subDays:n(291),subHours:n(292),subISOYears:n(87),subMilliseconds:n(293),subMinutes:n(294),subMonths:n(295),subQuarters:n(296),subSeconds:n(297),subWeeks:n(298),subYears:n(299)}},function(e,t,n){var r=n(300)(n(312));e.exports=r},function(e,t,n){e.exports={"trans-color":"navbar--trans-color---1tk7E",component:"navbar--component---2UCEi","report-info-cnt":"navbar--report-info-cnt---8y9Bb","menu-button":"navbar--menu-button---1ZRpz","report-title":"navbar--report-title---3bXCv","pct-bar":"navbar--pct-bar---3EwW-",pass:"navbar--pass---2oR-w",fail:"navbar--fail---3mN80",pend:"navbar--pend---2iqjh","pct-bar-segment":"navbar--pct-bar-segment---3T0_o"}},function(e,t,n){e.exports={"trans-color":"quick-summary--trans-color---HUJqE",cnt:"quick-summary--cnt---3s38x",list:"quick-summary--list---2_80W",item:"quick-summary--item---bfSQ0",icon:"quick-summary--icon---TW1oG",tests:"quick-summary--tests---2nNut",passes:"quick-summary--passes---3IjYH","single-filter":"quick-summary--single-filter---31Thy","single-filter--passed":"quick-summary--single-filter--passed---3QnUL",failures:"quick-summary--failures---14s29","single-filter--failed":"quick-summary--single-filter--failed---3_tAw",pending:"quick-summary--pending---261aV","single-filter--pending":"quick-summary--single-filter--pending---21lZM",skipped:"quick-summary--skipped---tyOc4","single-filter--skipped":"quick-summary--single-filter--skipped---1AdZA","circle-icon":"quick-summary--circle-icon---1HDS7"}},function(e,t,n){e.exports={"trans-color":"radio-button--trans-color---egsik",component:"radio-button--component---1ix3c",outer:"radio-button--outer---a_NqL",off:"radio-button--off---dBAOK",inner:"radio-button--inner---3bo9Q"}},function(e,t,n){var r,o;o=this,void 0===(r=function(){return o.Chartist=(e={version:"0.11.0"},function(e,t,n){"use strict";n.namespaces={svg:"http://www.w3.org/2000/svg",xmlns:"http://www.w3.org/2000/xmlns/",xhtml:"http://www.w3.org/1999/xhtml",xlink:"http://www.w3.org/1999/xlink",ct:"http://gionkunz.github.com/chartist-js/ct"},n.noop=function(e){return e},n.alphaNumerate=function(e){return String.fromCharCode(97+e%26)},n.extend=function(e){var t,r,o;for(e=e||{},t=1;t":">",'"':""","'":"'"},n.serialize=function(e){return null==e?e:("number"==typeof e?e=""+e:"object"==typeof e&&(e=JSON.stringify({data:e})),Object.keys(n.escapingMap).reduce((function(e,t){return n.replaceAll(e,t,n.escapingMap[t])}),e))},n.deserialize=function(e){if("string"!=typeof e)return e;e=Object.keys(n.escapingMap).reduce((function(e,t){return n.replaceAll(e,n.escapingMap[t],t)}),e);try{e=void 0!==(e=JSON.parse(e)).data?e.data:e}catch(e){}return e},n.createSvg=function(e,t,r,o){var i;return t=t||"100%",r=r||"100%",Array.prototype.slice.call(e.querySelectorAll("svg")).filter((function(e){return e.getAttributeNS(n.namespaces.xmlns,"ct")})).forEach((function(t){e.removeChild(t)})),(i=new n.Svg("svg").attr({width:t,height:r}).addClass(o))._node.style.width=t,i._node.style.height=r,e.appendChild(i._node),i},n.normalizeData=function(e,t,r){var o,i={raw:e,normalized:{}};return i.normalized.series=n.getDataArray({series:e.series||[]},t,r),o=i.normalized.series.every((function(e){return e instanceof Array}))?Math.max.apply(null,i.normalized.series.map((function(e){return e.length}))):i.normalized.series.length,i.normalized.labels=(e.labels||[]).slice(),Array.prototype.push.apply(i.normalized.labels,n.times(Math.max(0,o-i.normalized.labels.length)).map((function(){return""}))),t&&n.reverseData(i.normalized),i},n.safeHasProperty=function(e,t){return null!==e&&"object"==typeof e&&e.hasOwnProperty(t)},n.isDataHoleValue=function(e){return null==e||"number"==typeof e&&isNaN(e)},n.reverseData=function(e){e.labels.reverse(),e.series.reverse();for(var t=0;to.high&&(o.high=n),a&&n0||(o.high=1),o.low=0)),o},n.isNumeric=function(e){return null!==e&&isFinite(e)},n.isFalseyButZero=function(e){return!e&&0!==e},n.getNumberOrUndefined=function(e){return n.isNumeric(e)?+e:void 0},n.isMultiValue=function(e){return"object"==typeof e&&("x"in e||"y"in e)},n.getMultiValue=function(e,t){return n.isMultiValue(e)?n.getNumberOrUndefined(e[t||"y"]):n.getNumberOrUndefined(e)},n.rho=function(e){if(1===e)return e;function t(e,n){return e%n==0?n:t(n,e%n)}function n(e){return e*e+1}var r,o=2,i=2;if(e%2==0)return 2;do{o=n(o)%e,i=n(n(i))%e,r=t(Math.abs(o-i),e)}while(1===r);return r},n.getBounds=function(e,t,r,o){var i,a,s,l=0,u={high:t.high,low:t.low};u.valueRange=u.high-u.low,u.oom=n.orderOfMagnitude(u.valueRange),u.step=Math.pow(10,u.oom),u.min=Math.floor(u.low/u.step)*u.step,u.max=Math.ceil(u.high/u.step)*u.step,u.range=u.max-u.min,u.numberOfSteps=Math.round(u.range/u.step);var c=n.projectLength(e,u.step,u)=r)u.step=1;else if(o&&f=r)u.step=f;else for(;;){if(c&&n.projectLength(e,u.step,u)<=r)u.step*=2;else{if(c||!(n.projectLength(e,u.step/2,u)>=r))break;if(u.step/=2,o&&u.step%1!=0){u.step*=2;break}}if(l++>1e3)throw new Error("Exceeded maximum number of iterations while optimizing scale step!")}var d=2221e-19;function p(e,t){return e===(e+=t)&&(e*=1+(t>0?d:-d)),e}for(u.step=Math.max(u.step,d),a=u.min,s=u.max;a+u.step<=u.low;)a=p(a,u.step);for(;s-u.step>=u.high;)s=p(s,-u.step);u.min=a,u.max=s,u.range=u.max-u.min;var h=[];for(i=u.min;i<=u.max;i=p(i,u.step)){var m=n.roundWithPrecision(i);m!==h[h.length-1]&&h.push(m)}return u.values=h,u},n.polarToCartesian=function(e,t,n,r){var o=(r-90)*Math.PI/180;return{x:e+n*Math.cos(o),y:t+n*Math.sin(o)}},n.createChartRect=function(e,t,r){var o=!(!t.axisX&&!t.axisY),i=o?t.axisY.offset:0,a=o?t.axisX.offset:0,s=e.width()||n.quantity(t.width).value||0,l=e.height()||n.quantity(t.height).value||0,u=n.normalizePadding(t.chartPadding,r);s=Math.max(s,i+u.left+u.right),l=Math.max(l,a+u.top+u.bottom);var c={padding:u,width:function(){return this.x2-this.x1},height:function(){return this.y1-this.y2}};return o?("start"===t.axisX.position?(c.y2=u.top+a,c.y1=Math.max(l-u.bottom,c.y2+1)):(c.y2=u.top,c.y1=Math.max(l-u.bottom-a,c.y2+1)),"start"===t.axisY.position?(c.x1=u.left+i,c.x2=Math.max(s-u.right,c.x1+1)):(c.x1=u.left,c.x2=Math.max(s-u.right-i,c.x1+1))):(c.x1=u.left,c.x2=Math.max(s-u.right,c.x1+1),c.y2=u.top,c.y1=Math.max(l-u.bottom,c.y2+1)),c},n.createGrid=function(e,t,r,o,i,a,s,l){var u={};u[r.units.pos+"1"]=e,u[r.units.pos+"2"]=e,u[r.counterUnits.pos+"1"]=o,u[r.counterUnits.pos+"2"]=o+i;var c=a.elem("line",u,s.join(" "));l.emit("draw",n.extend({type:"grid",axis:r,index:t,group:a,element:c},u))},n.createGridBackground=function(e,t,n,r){var o=e.elem("rect",{x:t.x1,y:t.y2,width:t.width(),height:t.height()},n,!0);r.emit("draw",{type:"gridBackground",group:e,element:o})},n.createLabel=function(e,r,o,i,a,s,l,u,c,f,d){var p,h={};if(h[a.units.pos]=e+l[a.units.pos],h[a.counterUnits.pos]=l[a.counterUnits.pos],h[a.units.len]=r,h[a.counterUnits.len]=Math.max(0,s-10),f){var m=t.createElement("span");m.className=c.join(" "),m.setAttribute("xmlns",n.namespaces.xhtml),m.innerText=i[o],m.style[a.units.len]=Math.round(h[a.units.len])+"px",m.style[a.counterUnits.len]=Math.round(h[a.counterUnits.len])+"px",p=u.foreignObject(m,n.extend({style:"overflow: visible;"},h))}else p=u.elem("text",h,c.join(" ")).text(i[o]);d.emit("draw",n.extend({type:"label",axis:a,index:o,group:u,element:p,text:i[o]},h))},n.getSeriesOption=function(e,t,n){if(e.name&&t.series&&t.series[e.name]){var r=t.series[e.name];return r.hasOwnProperty(n)?r[n]:t[n]}return t[n]},n.optionsProvider=function(t,r,o){var i,a,s=n.extend({},t),l=[];function u(t){var l=i;if(i=n.extend({},s),r)for(a=0;a=2&&e[s]<=e[s-2]&&(a=!0),a&&(i.push({pathCoordinates:[],valueData:[]}),a=!1),i[i.length-1].pathCoordinates.push(e[s],e[s+1]),i[i.length-1].valueData.push(t[s/2]));return i}}(window,document,e),function(e,t,n){"use strict";n.Interpolation={},n.Interpolation.none=function(e){var t={fillHoles:!1};return e=n.extend({},t,e),function(t,r){for(var o=new n.Svg.Path,i=!0,a=0;a1){var l=[];return s.forEach((function(e){l.push(t(e.pathCoordinates,e.valueData))})),n.Svg.Path.join(l)}if(i=s[0].pathCoordinates,a=s[0].valueData,i.length<=4)return n.Interpolation.none()(i,a);for(var u,c=(new n.Svg.Path).move(i[0],i[1],!1,a[0]),f=0,d=i.length;d-2*!u>f;f+=2){var p=[{x:+i[f-2],y:+i[f-1]},{x:+i[f],y:+i[f+1]},{x:+i[f+2],y:+i[f+3]},{x:+i[f+4],y:+i[f+5]}];u?f?d-4===f?p[3]={x:+i[0],y:+i[1]}:d-2===f&&(p[2]={x:+i[0],y:+i[1]},p[3]={x:+i[2],y:+i[3]}):p[0]={x:+i[d-2],y:+i[d-1]}:d-4===f?p[3]=p[2]:f||(p[0]={x:+i[f],y:+i[f+1]}),c.curve(r*(-p[0].x+6*p[1].x+p[2].x)/6+o*p[2].x,r*(-p[0].y+6*p[1].y+p[2].y)/6+o*p[2].y,r*(p[1].x+6*p[2].x-p[3].x)/6+o*p[2].x,r*(p[1].y+6*p[2].y-p[3].y)/6+o*p[2].y,p[2].x,p[2].y,!1,a[(f+2)/2])}return c}return n.Interpolation.none()([])}},n.Interpolation.monotoneCubic=function(e){var t={fillHoles:!1};return e=n.extend({},t,e),function t(r,o){var i=n.splitIntoSegments(r,o,{fillHoles:e.fillHoles,increasingX:!0});if(i.length){if(i.length>1){var a=[];return i.forEach((function(e){a.push(t(e.pathCoordinates,e.valueData))})),n.Svg.Path.join(a)}if(r=i[0].pathCoordinates,o=i[0].valueData,r.length<=4)return n.Interpolation.none()(r,o);var s,l,u=[],c=[],f=r.length/2,d=[],p=[],h=[],m=[];for(s=0;s0!=p[s]>0?d[s]=0:(d[s]=3*(m[s-1]+m[s])/((2*m[s]+m[s-1])/p[s-1]+(m[s]+2*m[s-1])/p[s]),isFinite(d[s])||(d[s]=0));for(l=(new n.Svg.Path).move(u[0],c[0],!1,o[0]),s=0;s1})).map((function(e){var t=e.pathElements[0],n=e.pathElements[e.pathElements.length-1];return e.clone(!0).position(0).remove(1).move(t.x,v).line(t.x,t.y).position(e.pathElements.length+1).line(n.x,v)})).forEach(function(n){var s=l.elem("path",{d:n.stringify()},e.classNames.area,!0);this.eventEmitter.emit("draw",{type:"area",values:t.normalized.series[a],path:n.clone(),series:r,seriesIndex:a,axisX:o,axisY:i,chartRect:u,index:a,group:l,element:s})}.bind(this))}}.bind(this)),this.eventEmitter.emit("created",{bounds:i.bounds,chartRect:u,axisX:o,axisY:i,svg:this.svg,options:e})}function i(e,t,o,i){n.Line.super.constructor.call(this,e,t,r,n.extend({},r,o),i)}n.Line=n.Base.extend({constructor:i,createChart:o})}(window,document,e),function(e,t,n){"use strict";var r={axisX:{offset:30,position:"end",labelOffset:{x:0,y:0},showLabel:!0,showGrid:!0,labelInterpolationFnc:n.noop,scaleMinSpace:30,onlyInteger:!1},axisY:{offset:40,position:"start",labelOffset:{x:0,y:0},showLabel:!0,showGrid:!0,labelInterpolationFnc:n.noop,scaleMinSpace:20,onlyInteger:!1},width:void 0,height:void 0,high:void 0,low:void 0,referenceValue:0,chartPadding:{top:15,right:15,bottom:5,left:10},seriesBarDistance:15,stackBars:!1,stackMode:"accumulate",horizontalBars:!1,distributeSeries:!1,reverseData:!1,showGridBackground:!1,classNames:{chart:"ct-chart-bar",horizontalBars:"ct-horizontal-bars",label:"ct-label",labelGroup:"ct-labels",series:"ct-series",bar:"ct-bar",grid:"ct-grid",gridGroup:"ct-grids",gridBackground:"ct-grid-background",vertical:"ct-vertical",horizontal:"ct-horizontal",start:"ct-start",end:"ct-end"}};function o(e){var t,o;e.distributeSeries?(t=n.normalizeData(this.data,e.reverseData,e.horizontalBars?"x":"y")).normalized.series=t.normalized.series.map((function(e){return[e]})):t=n.normalizeData(this.data,e.reverseData,e.horizontalBars?"x":"y"),this.svg=n.createSvg(this.container,e.width,e.height,e.classNames.chart+(e.horizontalBars?" "+e.classNames.horizontalBars:""));var i=this.svg.elem("g").addClass(e.classNames.gridGroup),a=this.svg.elem("g"),s=this.svg.elem("g").addClass(e.classNames.labelGroup);if(e.stackBars&&0!==t.normalized.series.length){var l=n.serialMap(t.normalized.series,(function(){return Array.prototype.slice.call(arguments).map((function(e){return e})).reduce((function(e,t){return{x:e.x+(t&&t.x)||0,y:e.y+(t&&t.y)||0}}),{x:0,y:0})}));o=n.getHighLow([l],e,e.horizontalBars?"x":"y")}else o=n.getHighLow(t.normalized.series,e,e.horizontalBars?"x":"y");o.high=+e.high||(0===e.high?0:o.high),o.low=+e.low||(0===e.low?0:o.low);var u,c,f,d,p,h=n.createChartRect(this.svg,e,r.padding);c=e.distributeSeries&&e.stackBars?t.normalized.labels.slice(0,1):t.normalized.labels,e.horizontalBars?(u=d=void 0===e.axisX.type?new n.AutoScaleAxis(n.Axis.units.x,t.normalized.series,h,n.extend({},e.axisX,{highLow:o,referenceValue:0})):e.axisX.type.call(n,n.Axis.units.x,t.normalized.series,h,n.extend({},e.axisX,{highLow:o,referenceValue:0})),f=p=void 0===e.axisY.type?new n.StepAxis(n.Axis.units.y,t.normalized.series,h,{ticks:c}):e.axisY.type.call(n,n.Axis.units.y,t.normalized.series,h,e.axisY)):(f=d=void 0===e.axisX.type?new n.StepAxis(n.Axis.units.x,t.normalized.series,h,{ticks:c}):e.axisX.type.call(n,n.Axis.units.x,t.normalized.series,h,e.axisX),u=p=void 0===e.axisY.type?new n.AutoScaleAxis(n.Axis.units.y,t.normalized.series,h,n.extend({},e.axisY,{highLow:o,referenceValue:0})):e.axisY.type.call(n,n.Axis.units.y,t.normalized.series,h,n.extend({},e.axisY,{highLow:o,referenceValue:0})));var m=e.horizontalBars?h.x1+u.projectValue(0):h.y1-u.projectValue(0),v=[];f.createGridAndLabels(i,s,this.supportsForeignObject,e,this.eventEmitter),u.createGridAndLabels(i,s,this.supportsForeignObject,e,this.eventEmitter),e.showGridBackground&&n.createGridBackground(i,h,e.classNames.gridBackground,this.eventEmitter),t.raw.series.forEach(function(r,o){var i,s,l=o-(t.raw.series.length-1)/2;i=e.distributeSeries&&!e.stackBars?f.axisLength/t.normalized.series.length/2:e.distributeSeries&&e.stackBars?f.axisLength/2:f.axisLength/t.normalized.series[o].length/2,(s=a.elem("g")).attr({"ct:series-name":r.name,"ct:meta":n.serialize(r.meta)}),s.addClass([e.classNames.series,r.className||e.classNames.series+"-"+n.alphaNumerate(o)].join(" ")),t.normalized.series[o].forEach(function(a,c){var g,y,b,_;if(_=e.distributeSeries&&!e.stackBars?o:e.distributeSeries&&e.stackBars?0:c,g=e.horizontalBars?{x:h.x1+u.projectValue(a&&a.x?a.x:0,c,t.normalized.series[o]),y:h.y1-f.projectValue(a&&a.y?a.y:0,_,t.normalized.series[o])}:{x:h.x1+f.projectValue(a&&a.x?a.x:0,_,t.normalized.series[o]),y:h.y1-u.projectValue(a&&a.y?a.y:0,c,t.normalized.series[o])},f instanceof n.StepAxis&&(f.options.stretch||(g[f.units.pos]+=i*(e.horizontalBars?-1:1)),g[f.units.pos]+=e.stackBars||e.distributeSeries?0:l*e.seriesBarDistance*(e.horizontalBars?-1:1)),b=v[c]||m,v[c]=b-(m-g[f.counterUnits.pos]),void 0!==a){var w={};w[f.units.pos+"1"]=g[f.units.pos],w[f.units.pos+"2"]=g[f.units.pos],!e.stackBars||"accumulate"!==e.stackMode&&e.stackMode?(w[f.counterUnits.pos+"1"]=m,w[f.counterUnits.pos+"2"]=g[f.counterUnits.pos]):(w[f.counterUnits.pos+"1"]=b,w[f.counterUnits.pos+"2"]=v[c]),w.x1=Math.min(Math.max(w.x1,h.x1),h.x2),w.x2=Math.min(Math.max(w.x2,h.x1),h.x2),w.y1=Math.min(Math.max(w.y1,h.y2),h.y1),w.y2=Math.min(Math.max(w.y2,h.y2),h.y1);var x=n.getMetaData(r,c);y=s.elem("line",w,e.classNames.bar).attr({"ct:value":[a.x,a.y].filter(n.isNumeric).join(","),"ct:meta":n.serialize(x)}),this.eventEmitter.emit("draw",n.extend({type:"bar",value:a,index:c,meta:x,series:r,seriesIndex:o,axisX:d,axisY:p,chartRect:h,group:s,element:y},w))}}.bind(this))}.bind(this)),this.eventEmitter.emit("created",{bounds:u.bounds,chartRect:h,axisX:d,axisY:p,svg:this.svg,options:e})}function i(e,t,o,i){n.Bar.super.constructor.call(this,e,t,r,n.extend({},r,o),i)}n.Bar=n.Base.extend({constructor:i,createChart:o})}(window,document,e),function(e,t,n){"use strict";var r={width:void 0,height:void 0,chartPadding:5,classNames:{chartPie:"ct-chart-pie",chartDonut:"ct-chart-donut",series:"ct-series",slicePie:"ct-slice-pie",sliceDonut:"ct-slice-donut",sliceDonutSolid:"ct-slice-donut-solid",label:"ct-label"},startAngle:0,total:void 0,donut:!1,donutSolid:!1,donutWidth:60,showLabel:!0,labelOffset:0,labelPosition:"inside",labelInterpolationFnc:n.noop,labelDirection:"neutral",reverseData:!1,ignoreEmptyValues:!1};function o(e,t,n){var r=t.x>e.x;return r&&"explode"===n||!r&&"implode"===n?"start":r&&"implode"===n||!r&&"explode"===n?"end":"middle"}function i(e){var t,i,a,s,l,u=n.normalizeData(this.data),c=[],f=e.startAngle;this.svg=n.createSvg(this.container,e.width,e.height,e.donut?e.classNames.chartDonut:e.classNames.chartPie),i=n.createChartRect(this.svg,e,r.padding),a=Math.min(i.width()/2,i.height()/2),l=e.total||u.normalized.series.reduce((function(e,t){return e+t}),0);var d=n.quantity(e.donutWidth);"%"===d.unit&&(d.value*=a/100),a-=e.donut&&!e.donutSolid?d.value/2:0,s="outside"===e.labelPosition||e.donut&&!e.donutSolid?a:"center"===e.labelPosition?0:e.donutSolid?a-d.value/2:a/2,s+=e.labelOffset;var p={x:i.x1+i.width()/2,y:i.y2+i.height()/2},h=1===u.raw.series.filter((function(e){return e.hasOwnProperty("value")?0!==e.value:0!==e})).length;u.raw.series.forEach(function(e,t){c[t]=this.svg.elem("g",null,null)}.bind(this)),e.showLabel&&(t=this.svg.elem("g",null,null)),u.raw.series.forEach(function(r,i){if(0!==u.normalized.series[i]||!e.ignoreEmptyValues){c[i].attr({"ct:series-name":r.name}),c[i].addClass([e.classNames.series,r.className||e.classNames.series+"-"+n.alphaNumerate(i)].join(" "));var m=l>0?f+u.normalized.series[i]/l*360:0,v=Math.max(0,f-(0===i||h?0:.2));m-v>=359.99&&(m=v+359.99);var g,y,b,_=n.polarToCartesian(p.x,p.y,a,v),w=n.polarToCartesian(p.x,p.y,a,m),x=new n.Svg.Path(!e.donut||e.donutSolid).move(w.x,w.y).arc(a,a,0,m-f>180,0,_.x,_.y);e.donut?e.donutSolid&&(b=a-d.value,g=n.polarToCartesian(p.x,p.y,b,f-(0===i||h?0:.2)),y=n.polarToCartesian(p.x,p.y,b,m),x.line(g.x,g.y),x.arc(b,b,0,m-f>180,1,y.x,y.y)):x.line(p.x,p.y);var E=e.classNames.slicePie;e.donut&&(E=e.classNames.sliceDonut,e.donutSolid&&(E=e.classNames.sliceDonutSolid));var k=c[i].elem("path",{d:x.stringify()},E);if(k.attr({"ct:value":u.normalized.series[i],"ct:meta":n.serialize(r.meta)}),e.donut&&!e.donutSolid&&(k._node.style.strokeWidth=d.value+"px"),this.eventEmitter.emit("draw",{type:"slice",value:u.normalized.series[i],totalDataSum:l,index:i,meta:r.meta,series:r,group:c[i],element:k,path:x.clone(),center:p,radius:a,startAngle:f,endAngle:m}),e.showLabel){var S,O;S=1===u.raw.series.length?{x:p.x,y:p.y}:n.polarToCartesian(p.x,p.y,s,f+(m-f)/2),O=u.normalized.labels&&!n.isFalseyButZero(u.normalized.labels[i])?u.normalized.labels[i]:u.normalized.series[i];var T=e.labelInterpolationFnc(O,i);if(T||0===T){var N=t.elem("text",{dx:S.x,dy:S.y,"text-anchor":o(p,S,e.labelDirection)},e.classNames.label).text(""+T);this.eventEmitter.emit("draw",{type:"label",index:i,group:t,element:N,text:""+T,x:S.x,y:S.y})}}f=m}}.bind(this)),this.eventEmitter.emit("created",{chartRect:i,svg:this.svg,options:e})}function a(e,t,o,i){n.Pie.super.constructor.call(this,e,t,r,n.extend({},r,o),i)}n.Pie=n.Base.extend({constructor:a,createChart:i,determineAnchorPosition:o})}(window,document,e),e);var e}.apply(t,[]))||(e.exports=r)},function(e,t,n){e.exports={"trans-color":"suite-summary--trans-color---14JXk",component:"suite-summary--component---cFAkx","no-margin":"suite-summary--no-margin---3WX9n","summary-item":"suite-summary--summary-item---JHYFN",duration:"suite-summary--duration---AzGUQ",tests:"suite-summary--tests---3Zhct",passed:"suite-summary--passed---24BnC",failed:"suite-summary--failed---205C4",pending:"suite-summary--pending---3_Nkj",skipped:"suite-summary--skipped---TovqF",icon:"suite-summary--icon---3rZ6G"}},function(e,t,n){e.exports={"trans-color":"toggle-switch--trans-color---16in9",component:"toggle-switch--component---3vjvh",label:"toggle-switch--label---1Lu8U","toggle-input":"toggle-switch--toggle-input---3BB7e",toggle:"toggle-switch--toggle---2kPqc",disabled:"toggle-switch--disabled---1qDLf",icon:"toggle-switch--icon---348nT"}},function(e,t,n){"use strict";var r=n(61),o="function"==typeof Symbol&&Symbol.for,i=o?Symbol.for("react.element"):60103,a=o?Symbol.for("react.portal"):60106,s=o?Symbol.for("react.fragment"):60107,l=o?Symbol.for("react.strict_mode"):60108,u=o?Symbol.for("react.profiler"):60114,c=o?Symbol.for("react.provider"):60109,f=o?Symbol.for("react.context"):60110,d=o?Symbol.for("react.forward_ref"):60112,p=o?Symbol.for("react.suspense"):60113,h=o?Symbol.for("react.memo"):60115,m=o?Symbol.for("react.lazy"):60116,v="function"==typeof Symbol&&Symbol.iterator;function g(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;nP.length&&P.push(e)}function D(e,t,n,r){var o=typeof e;"undefined"!==o&&"boolean"!==o||(e=null);var s=!1;if(null===e)s=!0;else switch(o){case"string":case"number":s=!0;break;case"object":switch(e.$$typeof){case i:case a:s=!0}}if(s)return n(r,e,""===t?"."+I(e,0):t),1;if(s=0,t=""===t?".":t+":",Array.isArray(e))for(var l=0;l

kgYV&=aTZp6v>HirW%!Tl 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 literal 0 HcmV?d00001 diff --git a/sandbox/auth-ms-basic-example/mochawesome-report/assets/roboto-medium-webfont.woff b/sandbox/auth-ms-basic-example/mochawesome-report/assets/roboto-medium-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..38aebe506e576991c27a659b12d7be9d71534618 GIT binary patch literal 26292 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 literal 0 HcmV?d00001 diff --git a/sandbox/auth-ms-basic-example/mochawesome-report/assets/roboto-medium-webfont.woff2 b/sandbox/auth-ms-basic-example/mochawesome-report/assets/roboto-medium-webfont.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..6b22807f64e95721daccc8fb8a670f4b7c2cea7f GIT binary patch literal 19944 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 literal 0 HcmV?d00001 diff --git a/sandbox/auth-ms-basic-example/mochawesome-report/assets/roboto-regular-webfont.woff b/sandbox/auth-ms-basic-example/mochawesome-report/assets/roboto-regular-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..d0890af2110f6be98594dc5f96f1c950a1d58ecd GIT binary patch literal 26280 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 +Mochawesome Report

\ No newline at end of file diff --git a/sandbox/auth-ms-basic-example/mochawesome-report/mochawesome.json b/sandbox/auth-ms-basic-example/mochawesome-report/mochawesome.json new file mode 100644 index 0000000000..4ec3e10137 --- /dev/null +++ b/sandbox/auth-ms-basic-example/mochawesome-report/mochawesome.json @@ -0,0 +1,234 @@ +{ + "stats": { + "suites": 2, + "tests": 3, + "passes": 3, + "pending": 0, + "failures": 0, + "start": "2025-01-28T16:15:58.529Z", + "end": "2025-01-28T16:15:58.860Z", + "duration": 331, + "testsRegistered": 3, + "passPercent": 100, + "pendingPercent": 0, + "other": 0, + "hasOther": false, + "skipped": 0, + "hasSkipped": false + }, + "results": [ + { + "uuid": "4310987d-52a2-4c3b-b315-33799d8cb954", + "title": "", + "fullFile": "", + "file": "", + "beforeHooks": [], + "afterHooks": [], + "tests": [], + "suites": [ + { + "uuid": "4a2d4874-8175-42f6-b513-d5aa2e00a091", + "title": "HomePage", + "fullFile": "/home/sunny.tyagi/Desktop/loopback4-microservice-catalog/sandbox/auth-ms-basic-example/dist/__tests__/acceptance/home-page.acceptance.js", + "file": "/dist/__tests__/acceptance/home-page.acceptance.js", + "beforeHooks": [ + { + "title": "\"before all\" hook: setupApplication in \"HomePage\"", + "fullTitle": "HomePage \"before all\" hook: setupApplication in \"HomePage\"", + "timedOut": false, + "duration": 209, + "state": null, + "speed": null, + "pass": false, + "fail": false, + "pending": false, + "context": null, + "code": "({ app, client } = await (0, test_helper_1.setupApplication)());", + "err": {}, + "uuid": "8d2d3beb-b725-4f0f-885d-a013367d3525", + "parentUUID": "4a2d4874-8175-42f6-b513-d5aa2e00a091", + "isHook": true, + "skipped": false + } + ], + "afterHooks": [ + { + "title": "\"after all\" hook in \"HomePage\"", + "fullTitle": "HomePage \"after all\" hook in \"HomePage\"", + "timedOut": false, + "duration": 1, + "state": null, + "speed": null, + "pass": false, + "fail": false, + "pending": false, + "context": null, + "code": "await app.stop();", + "err": {}, + "uuid": "51d322f5-0bfc-42f9-a9b6-625bda6d3d27", + "parentUUID": "4a2d4874-8175-42f6-b513-d5aa2e00a091", + "isHook": true, + "skipped": false + } + ], + "tests": [ + { + "title": "exposes a default home page", + "fullTitle": "HomePage exposes a default home page", + "timedOut": false, + "duration": 49, + "state": "passed", + "speed": "medium", + "pass": true, + "fail": false, + "pending": false, + "context": null, + "code": "await client\n .get('/')\n .expect(200)\n .expect('Content-Type', /text\\/html/);", + "err": {}, + "uuid": "818c03f0-c547-453a-a8af-d73067c21422", + "parentUUID": "4a2d4874-8175-42f6-b513-d5aa2e00a091", + "isHook": false, + "skipped": false + }, + { + "title": "exposes self-hosted explorer", + "fullTitle": "HomePage exposes self-hosted explorer", + "timedOut": false, + "duration": 12, + "state": "passed", + "speed": "fast", + "pass": true, + "fail": false, + "pending": false, + "context": null, + "code": "await client\n .get('/explorer/')\n .expect(200)\n .expect('Content-Type', /text\\/html/)\n .expect(/LoopBack API Explorer/);", + "err": {}, + "uuid": "9d0fac57-11cf-462e-9ba3-62e64c1568a3", + "parentUUID": "4a2d4874-8175-42f6-b513-d5aa2e00a091", + "isHook": false, + "skipped": false + } + ], + "suites": [], + "passes": [ + "818c03f0-c547-453a-a8af-d73067c21422", + "9d0fac57-11cf-462e-9ba3-62e64c1568a3" + ], + "failures": [], + "pending": [], + "skipped": [], + "duration": 61, + "root": false, + "rootEmpty": false, + "_timeout": 2000 + }, + { + "uuid": "e6264d9d-4cb4-4f30-8f42-3e82446e732a", + "title": "PingController", + "fullFile": "/home/sunny.tyagi/Desktop/loopback4-microservice-catalog/sandbox/auth-ms-basic-example/dist/__tests__/acceptance/ping.controller.acceptance.js", + "file": "/dist/__tests__/acceptance/ping.controller.acceptance.js", + "beforeHooks": [ + { + "title": "\"before all\" hook: setupApplication in \"PingController\"", + "fullTitle": "PingController \"before all\" hook: setupApplication in \"PingController\"", + "timedOut": false, + "duration": 34, + "state": null, + "speed": null, + "pass": false, + "fail": false, + "pending": false, + "context": null, + "code": "({ app, client } = await (0, test_helper_1.setupApplication)());", + "err": {}, + "uuid": "33bcffa2-0b35-4997-954b-5d2a5d7b1409", + "parentUUID": "e6264d9d-4cb4-4f30-8f42-3e82446e732a", + "isHook": true, + "skipped": false + } + ], + "afterHooks": [ + { + "title": "\"after all\" hook in \"PingController\"", + "fullTitle": "PingController \"after all\" hook in \"PingController\"", + "timedOut": false, + "duration": 1, + "state": null, + "speed": null, + "pass": false, + "fail": false, + "pending": false, + "context": null, + "code": "await app.stop();", + "err": {}, + "uuid": "27ec5e4d-ff7c-4d37-986a-5d6ea8e8b88d", + "parentUUID": "e6264d9d-4cb4-4f30-8f42-3e82446e732a", + "isHook": true, + "skipped": false + } + ], + "tests": [ + { + "title": "invokes GET /ping", + "fullTitle": "PingController invokes GET /ping", + "timedOut": false, + "duration": 14, + "state": "passed", + "speed": "fast", + "pass": true, + "fail": false, + "pending": false, + "context": null, + "code": "const res = await client.get('/ping?msg=world').expect(200);\n(0, testlab_1.expect)(res.body).to.containEql({ greeting: 'Hello from LoopBack' });", + "err": {}, + "uuid": "51fb9cdc-b8e8-4dec-b1a9-f00769de4ee7", + "parentUUID": "e6264d9d-4cb4-4f30-8f42-3e82446e732a", + "isHook": false, + "skipped": false + } + ], + "suites": [], + "passes": [ + "51fb9cdc-b8e8-4dec-b1a9-f00769de4ee7" + ], + "failures": [], + "pending": [], + "skipped": [], + "duration": 14, + "root": false, + "rootEmpty": false, + "_timeout": 2000 + } + ], + "passes": [], + "failures": [], + "pending": [], + "skipped": [], + "duration": 0, + "root": true, + "rootEmpty": true, + "_timeout": 2000 + } + ], + "meta": { + "mocha": { + "version": "11.1.0" + }, + "mochawesome": { + "options": { + "quiet": false, + "reportFilename": "mochawesome", + "saveHtml": true, + "saveJson": true, + "consoleReporter": "spec", + "useInlineDiffs": false, + "code": true + }, + "version": "7.1.3" + }, + "marge": { + "options": null, + "version": "6.2.0" + } + } +} \ No newline at end of file diff --git a/sandbox/auth-basic-login-signup-example/package.json b/sandbox/auth-ms-basic-example/package.json similarity index 100% rename from sandbox/auth-basic-login-signup-example/package.json rename to sandbox/auth-ms-basic-example/package.json diff --git a/sandbox/auth-basic-login-signup-example/public/index.html b/sandbox/auth-ms-basic-example/public/index.html similarity index 100% rename from sandbox/auth-basic-login-signup-example/public/index.html rename to sandbox/auth-ms-basic-example/public/index.html diff --git a/sandbox/auth-basic-login-signup-example/src/__tests__/README.md b/sandbox/auth-ms-basic-example/src/__tests__/README.md similarity index 100% rename from sandbox/auth-basic-login-signup-example/src/__tests__/README.md rename to sandbox/auth-ms-basic-example/src/__tests__/README.md diff --git a/sandbox/auth-basic-login-signup-example/src/__tests__/acceptance/home-page.acceptance.ts b/sandbox/auth-ms-basic-example/src/__tests__/acceptance/home-page.acceptance.ts similarity index 100% rename from sandbox/auth-basic-login-signup-example/src/__tests__/acceptance/home-page.acceptance.ts rename to sandbox/auth-ms-basic-example/src/__tests__/acceptance/home-page.acceptance.ts diff --git a/sandbox/auth-basic-login-signup-example/src/__tests__/acceptance/ping.controller.acceptance.ts b/sandbox/auth-ms-basic-example/src/__tests__/acceptance/ping.controller.acceptance.ts similarity index 100% rename from sandbox/auth-basic-login-signup-example/src/__tests__/acceptance/ping.controller.acceptance.ts rename to sandbox/auth-ms-basic-example/src/__tests__/acceptance/ping.controller.acceptance.ts diff --git a/sandbox/auth-basic-login-signup-example/src/__tests__/acceptance/test-helper.ts b/sandbox/auth-ms-basic-example/src/__tests__/acceptance/test-helper.ts similarity index 73% rename from sandbox/auth-basic-login-signup-example/src/__tests__/acceptance/test-helper.ts rename to sandbox/auth-ms-basic-example/src/__tests__/acceptance/test-helper.ts index 3d1159a0c4..ae1428f1f8 100755 --- a/sandbox/auth-basic-login-signup-example/src/__tests__/acceptance/test-helper.ts +++ b/sandbox/auth-ms-basic-example/src/__tests__/acceptance/test-helper.ts @@ -1,9 +1,9 @@ -import {AuthBasicLoginSignupExampleApplication} from '../..'; import { + Client, createRestAppClient, givenHttpServerConfig, - Client, } from '@loopback/testlab'; +import {AuthBasicLoginSignupExampleApplication} from '../..'; export async function setupApplication(): Promise<AppWithClient> { const restConfig = givenHttpServerConfig({ @@ -19,18 +19,16 @@ export async function setupApplication(): Promise<AppWithClient> { rest: restConfig, }); - app.bind('datasources.config.db').to({ - name: 'db', - connector: 'memory', - }); - - - app.bind(`datasources.config.${process.env.REDIS_NAME}`).to({ - name: process.env.REDIS_NAME, - connector: 'kv-memory', - }); - - + app.bind('datasources.config.auth').to({ + name: 'auth', + connector: 'memory', + }); + + app.bind(`datasources.config.${process.env.REDIS_NAME}`).to({ + name: process.env.REDIS_NAME, + connector: 'kv-memory', + }); + await app.boot(); await app.start(); @@ -43,8 +41,8 @@ function setUpEnv() { process.env.NODE_ENV = 'test'; process.env.ENABLE_TRACING = '0'; process.env.ENABLE_OBF = '0'; - process.env.REDIS_NAME = 'redis'; - process.env.HOST='localhost'; + process.env.REDIS_NAME = 'redis'; + process.env.HOST = '127.0.0.1'; } export interface AppWithClient { diff --git a/sandbox/auth-basic-login-signup-example/src/application.ts b/sandbox/auth-ms-basic-example/src/application.ts similarity index 74% rename from sandbox/auth-basic-login-signup-example/src/application.ts rename to sandbox/auth-ms-basic-example/src/application.ts index d5863cba98..3f0d7294f9 100755 --- a/sandbox/auth-basic-login-signup-example/src/application.ts +++ b/sandbox/auth-ms-basic-example/src/application.ts @@ -1,33 +1,37 @@ import {BootMixin} from '@loopback/boot'; import {ApplicationConfig} from '@loopback/core'; +import {RepositoryMixin} from '@loopback/repository'; +import {RestApplication} from '@loopback/rest'; import { RestExplorerBindings, RestExplorerComponent, } from '@loopback/rest-explorer'; -import * as dotenv from 'dotenv'; -import * as dotenvExt from 'dotenv-extended'; -import {AuthenticationBindings, AuthenticationComponent, AuthStrategyProvider, Strategies} from 'loopback4-authentication'; +import {ServiceMixin} from '@loopback/service-proxy'; import { - AuthorizationBindings, - AuthorizationComponent, -} from 'loopback4-authorization'; + AuthenticationServiceComponent, + AuthServiceBindings, + SignUpBindings, +} from '@sourceloop/authentication-service'; import { - ServiceSequence, - SFCoreBindings, BearerVerifierBindings, BearerVerifierComponent, BearerVerifierConfig, BearerVerifierType, SECURITY_SCHEME_SPEC, + ServiceSequence, + SFCoreBindings, } from '@sourceloop/core'; -import {AuthenticationServiceComponent, AuthServiceBindings, SignUpBindings} from '@sourceloop/authentication-service' -import {RepositoryMixin} from '@loopback/repository'; -import {RestApplication} from '@loopback/rest'; -import {ServiceMixin} from '@loopback/service-proxy'; +import * as dotenv from 'dotenv'; +import * as dotenvExt from 'dotenv-extended'; +import {AuthenticationComponent, Strategies} from 'loopback4-authentication'; +import {LocalPasswordStrategyFactoryProvider} from 'loopback4-authentication/passport-local'; +import { + AuthorizationBindings, + AuthorizationComponent, +} from 'loopback4-authorization'; import path from 'path'; import * as openapi from './openapi.json'; -import { LocalPasswordStrategyFactoryProvider } from 'loopback4-authentication/passport-local'; -import { LocalSignupProvider, SignupTokenHandlerProvider } from './providers'; +import {LocalSignupProvider, SignupTokenHandlerProvider} from './providers'; export {ApplicationConfig}; @@ -60,17 +64,18 @@ export class AuthBasicLoginSignupExampleApplication extends BootMixin( // To check if monitoring is enabled from env or not const enableObf = !!+(process.env.ENABLE_OBF ?? 0); // To check if authorization is enabled for swagger stats or not - const authentication = - process.env.SWAGGER_USER && process.env.SWAGGER_PASSWORD ? true : false; - const obj={ - enableObf, - obfPath: process.env.OBF_PATH ?? '/obf', - openapiSpec: openapi, - authentication: authentication, - swaggerUsername: process.env.SWAGGER_USER, - swaggerPassword: process.env.SWAGGER_PASSWORD, - - } + const authentication = !!( + process.env.SWAGGER_USER && process.env.SWAGGER_PASSWORD + ); + + const obj = { + enableObf, + obfPath: process.env.OBF_PATH ?? '/obf', + openapiSpec: openapi, + authentication: authentication, + swaggerUsername: process.env.SWAGGER_USER, + swaggerPassword: process.env.SWAGGER_PASSWORD, + }; this.bind(SFCoreBindings.config).to(obj); // Set up the custom sequence @@ -80,15 +85,18 @@ export class AuthBasicLoginSignupExampleApplication extends BootMixin( this.component(AuthenticationComponent); this.bind(AuthServiceBindings.Config).to({ useSymmetricEncryption: true, - }); - + }); - this.bind(Strategies.Passport.LOCAL_STRATEGY_FACTORY).toProvider(LocalPasswordStrategyFactoryProvider); - this.component(AuthenticationServiceComponent); - this.bind(SignUpBindings.LOCAL_SIGNUP_PROVIDER).toProvider( - LocalSignupProvider, - ); - this.bind(SignUpBindings.SIGNUP_HANDLER_PROVIDER).toProvider(SignupTokenHandlerProvider); + this.bind(Strategies.Passport.LOCAL_STRATEGY_FACTORY).toProvider( + LocalPasswordStrategyFactoryProvider, + ); + this.component(AuthenticationServiceComponent); + this.bind(SignUpBindings.LOCAL_SIGNUP_PROVIDER).toProvider( + LocalSignupProvider, + ); + this.bind(SignUpBindings.SIGNUP_HANDLER_PROVIDER).toProvider( + SignupTokenHandlerProvider, + ); // Add bearer verifier component this.bind(BearerVerifierBindings.Config).to({ @@ -111,7 +119,6 @@ export class AuthBasicLoginSignupExampleApplication extends BootMixin( this.component(RestExplorerComponent); - this.projectRoot = __dirname; // Customize @loopback/boot Booter Conventions here this.bootOptions = { diff --git a/sandbox/auth-basic-login-signup-example/src/controllers/README.md b/sandbox/auth-ms-basic-example/src/controllers/README.md similarity index 100% rename from sandbox/auth-basic-login-signup-example/src/controllers/README.md rename to sandbox/auth-ms-basic-example/src/controllers/README.md diff --git a/sandbox/auth-basic-login-signup-example/src/controllers/home-page.controller.ts b/sandbox/auth-ms-basic-example/src/controllers/home-page.controller.ts similarity index 87% rename from sandbox/auth-basic-login-signup-example/src/controllers/home-page.controller.ts rename to sandbox/auth-ms-basic-example/src/controllers/home-page.controller.ts index aa0100d87c..4e6f52513c 100755 --- a/sandbox/auth-basic-login-signup-example/src/controllers/home-page.controller.ts +++ b/sandbox/auth-ms-basic-example/src/controllers/home-page.controller.ts @@ -23,7 +23,7 @@ export class HomePageController { ); } - @authorize({permissions: ['*']}) + @authorize({permissions: ['*']}) @get('/', { responses: { [STATUS_CODE.OK]: { @@ -33,10 +33,7 @@ export class HomePageController { }, }) homePage() { - this.response - .status(STATUS_CODE.OK) - .contentType('html') - .send(this.html); + this.response.status(STATUS_CODE.OK).contentType('html').send(this.html); return this.response; } -} \ No newline at end of file +} diff --git a/sandbox/auth-basic-login-signup-example/src/controllers/index.ts b/sandbox/auth-ms-basic-example/src/controllers/index.ts similarity index 100% rename from sandbox/auth-basic-login-signup-example/src/controllers/index.ts rename to sandbox/auth-ms-basic-example/src/controllers/index.ts diff --git a/sandbox/auth-basic-login-signup-example/src/controllers/ping.controller.ts b/sandbox/auth-ms-basic-example/src/controllers/ping.controller.ts similarity index 87% rename from sandbox/auth-basic-login-signup-example/src/controllers/ping.controller.ts rename to sandbox/auth-ms-basic-example/src/controllers/ping.controller.ts index 008dfbb01b..56b0d46398 100755 --- a/sandbox/auth-basic-login-signup-example/src/controllers/ping.controller.ts +++ b/sandbox/auth-ms-basic-example/src/controllers/ping.controller.ts @@ -1,10 +1,5 @@ import {inject} from '@loopback/core'; -import { - Request, - RestBindings, - get, - ResponseObject, -} from '@loopback/rest'; +import {Request, RestBindings, get, ResponseObject} from '@loopback/rest'; import {authorize} from 'loopback4-authorization'; import {STATUS_CODE} from '@sourceloop/core'; @@ -39,7 +34,9 @@ const PING_RESPONSE: ResponseObject = { * A simple controller to bounce back http requests */ export class PingController { - constructor(@inject(RestBindings.Http.REQUEST) private readonly req: Request) {} + constructor( + @inject(RestBindings.Http.REQUEST) private readonly req: Request, + ) {} // Map to `GET /ping` @authorize({permissions: ['*']}) diff --git a/sandbox/auth-basic-login-signup-example/src/datasources/README.md b/sandbox/auth-ms-basic-example/src/datasources/README.md similarity index 100% rename from sandbox/auth-basic-login-signup-example/src/datasources/README.md rename to sandbox/auth-ms-basic-example/src/datasources/README.md diff --git a/sandbox/auth-basic-login-signup-example/src/datasources/auth.datasource.ts b/sandbox/auth-ms-basic-example/src/datasources/auth.datasource.ts similarity index 84% rename from sandbox/auth-basic-login-signup-example/src/datasources/auth.datasource.ts rename to sandbox/auth-ms-basic-example/src/datasources/auth.datasource.ts index 2ac2d2e7ea..5a88844fb5 100755 --- a/sandbox/auth-basic-login-signup-example/src/datasources/auth.datasource.ts +++ b/sandbox/auth-ms-basic-example/src/datasources/auth.datasource.ts @@ -1,6 +1,6 @@ import {inject, lifeCycleObserver, LifeCycleObserver} from '@loopback/core'; import {juggler} from '@loopback/repository'; -import {AuthDbSourceName} from '@sourceloop/authentication-service' +import {AuthDbSourceName} from '@sourceloop/authentication-service'; const DEFAULT_MAX_CONNECTIONS = 25; const DEFAULT_DB_IDLE_TIMEOUT_MILLIS = 60000; @@ -12,9 +12,9 @@ const config = { host: process.env.DB_HOST, port: process.env.DB_PORT, user: process.env.DB_USER, - schema: process.env.DB_SCHEMA, - password: process.env.DB_PASSWORD, - database: process.env.DB_DATABASE + schema: process.env.DB_SCHEMA, + password: process.env.DB_PASSWORD, + database: process.env.DB_DATABASE, }; // Observe application's life cycle to disconnect the datasource when @@ -22,11 +22,11 @@ const config = { // gracefully. The `stop()` method is inherited from `juggler.DataSource`. // Learn more at https://loopback.io/doc/en/lb4/Life-cycle.html @lifeCycleObserver('datasource') -export class AuthDataSource extends juggler.DataSource - implements LifeCycleObserver { - - static dataSourceName = AuthDbSourceName; - +export class AuthDataSource + extends juggler.DataSource + implements LifeCycleObserver +{ + static readonly dataSourceName = AuthDbSourceName; static readonly defaultConfig = config; @@ -51,4 +51,4 @@ export class AuthDataSource extends juggler.DataSource super(dsConfig); } -} \ No newline at end of file +} diff --git a/sandbox/auth-basic-login-signup-example/src/datasources/index.ts b/sandbox/auth-ms-basic-example/src/datasources/index.ts similarity index 100% rename from sandbox/auth-basic-login-signup-example/src/datasources/index.ts rename to sandbox/auth-ms-basic-example/src/datasources/index.ts diff --git a/sandbox/auth-basic-login-signup-example/src/datasources/redis.datasource.ts b/sandbox/auth-ms-basic-example/src/datasources/redis.datasource.ts similarity index 94% rename from sandbox/auth-basic-login-signup-example/src/datasources/redis.datasource.ts rename to sandbox/auth-ms-basic-example/src/datasources/redis.datasource.ts index 8af9e0d40f..f590d836e5 100755 --- a/sandbox/auth-basic-login-signup-example/src/datasources/redis.datasource.ts +++ b/sandbox/auth-ms-basic-example/src/datasources/redis.datasource.ts @@ -1,7 +1,7 @@ import {inject, lifeCycleObserver, LifeCycleObserver} from '@loopback/core'; import {AnyObject, juggler} from '@loopback/repository'; +import {AuthCacheSourceName} from '@sourceloop/authentication-service'; import {readFileSync} from 'fs'; -import {AuthCacheSourceName} from '@sourceloop/authentication-service' const config = { name: process.env.REDIS_NAME, @@ -41,8 +41,8 @@ export class RedisDataSource extends juggler.DataSource implements LifeCycleObserver { - static dataSourceName = AuthCacheSourceName; - static readonly defaultConfig = config; + static readonly dataSourceName = AuthCacheSourceName; + static readonly defaultConfig = config; constructor( @inject(`datasources.config.${process.env.REDIS_NAME}`, {optional: true}) diff --git a/sandbox/auth-basic-login-signup-example/src/index.ts b/sandbox/auth-ms-basic-example/src/index.ts similarity index 92% rename from sandbox/auth-basic-login-signup-example/src/index.ts rename to sandbox/auth-ms-basic-example/src/index.ts index 5d29bcb899..a6063bb81b 100755 --- a/sandbox/auth-basic-login-signup-example/src/index.ts +++ b/sandbox/auth-ms-basic-example/src/index.ts @@ -1,4 +1,7 @@ -import {ApplicationConfig, AuthBasicLoginSignupExampleApplication} from './application'; +import { + ApplicationConfig, + AuthBasicLoginSignupExampleApplication, +} from './application'; export * from './application'; diff --git a/sandbox/auth-basic-login-signup-example/src/models/README.md b/sandbox/auth-ms-basic-example/src/models/README.md similarity index 100% rename from sandbox/auth-basic-login-signup-example/src/models/README.md rename to sandbox/auth-ms-basic-example/src/models/README.md diff --git a/sandbox/auth-basic-login-signup-example/src/models/index.ts b/sandbox/auth-ms-basic-example/src/models/index.ts similarity index 100% rename from sandbox/auth-basic-login-signup-example/src/models/index.ts rename to sandbox/auth-ms-basic-example/src/models/index.ts diff --git a/sandbox/auth-basic-login-signup-example/src/models/to-do.model.ts b/sandbox/auth-ms-basic-example/src/models/to-do.model.ts similarity index 100% rename from sandbox/auth-basic-login-signup-example/src/models/to-do.model.ts rename to sandbox/auth-ms-basic-example/src/models/to-do.model.ts diff --git a/sandbox/auth-basic-login-signup-example/src/models/user.dto.ts b/sandbox/auth-ms-basic-example/src/models/user.dto.ts similarity index 100% rename from sandbox/auth-basic-login-signup-example/src/models/user.dto.ts rename to sandbox/auth-ms-basic-example/src/models/user.dto.ts diff --git a/sandbox/auth-basic-login-signup-example/src/openapi-spec.ts b/sandbox/auth-ms-basic-example/src/openapi-spec.ts similarity index 82% rename from sandbox/auth-basic-login-signup-example/src/openapi-spec.ts rename to sandbox/auth-ms-basic-example/src/openapi-spec.ts index b78a2056f1..036f1a66f6 100755 --- a/sandbox/auth-basic-login-signup-example/src/openapi-spec.ts +++ b/sandbox/auth-ms-basic-example/src/openapi-spec.ts @@ -1,6 +1,6 @@ import {ApplicationConfig} from '@loopback/core'; import {AuthBasicLoginSignupExampleApplication} from './application'; - +const PORT_NUMBER = 3000; const ARGV_INDEX = 2; /** * Export the OpenAPI spec from the application @@ -8,7 +8,7 @@ const ARGV_INDEX = 2; async function exportOpenApiSpec(): Promise<void> { const config: ApplicationConfig = { rest: { - port: +(process.env.PORT ?? 3000), + port: +(process.env.PORT ?? PORT_NUMBER), host: process.env.HOST ?? 'localhost', }, }; @@ -23,9 +23,5 @@ exportOpenApiSpec() process.exit(0); }) .catch(err => { - console.error( - 'Fail to export OpenAPI spec from the application.', - err, - ); process.exit(1); }); diff --git a/sandbox/auth-basic-login-signup-example/src/openapi.json b/sandbox/auth-ms-basic-example/src/openapi.json similarity index 100% rename from sandbox/auth-basic-login-signup-example/src/openapi.json rename to sandbox/auth-ms-basic-example/src/openapi.json diff --git a/sandbox/auth-basic-login-signup-example/src/opentelemetry-registry.ts b/sandbox/auth-ms-basic-example/src/opentelemetry-registry.ts similarity index 82% rename from sandbox/auth-basic-login-signup-example/src/opentelemetry-registry.ts rename to sandbox/auth-ms-basic-example/src/opentelemetry-registry.ts index 6376fe3373..02aef44196 100755 --- a/sandbox/auth-basic-login-signup-example/src/opentelemetry-registry.ts +++ b/sandbox/auth-ms-basic-example/src/opentelemetry-registry.ts @@ -21,15 +21,11 @@ if (!!+(process.env.ENABLE_TRACING ?? 0)) { tags: [], // You can use the default UDPSender host: process.env.OPENTELEMETRY_HOST ?? '', - port: process.env.OPENTELEMETRY_PORT - ? +process.env.OPENTELEMETRY_PORT - : 0, + port: process.env.OPENTELEMETRY_PORT ? +process.env.OPENTELEMETRY_PORT : 0, }; // Configure span processor to send spans to the exporter const exporter = new JaegerExporter(option); provider.addSpanProcessor(new BatchSpanProcessor(exporter)); - provider.addSpanProcessor( - new BatchSpanProcessor(new ConsoleSpanExporter()), - ); + provider.addSpanProcessor(new BatchSpanProcessor(new ConsoleSpanExporter())); provider.register(); -} \ No newline at end of file +} diff --git a/sandbox/auth-ms-basic-example/src/providers/index.ts b/sandbox/auth-ms-basic-example/src/providers/index.ts new file mode 100755 index 0000000000..e939b0cbe8 --- /dev/null +++ b/sandbox/auth-ms-basic-example/src/providers/index.ts @@ -0,0 +1,2 @@ +export * from './local-signup.provider'; +export * from './signup-token-handler.provider'; diff --git a/sandbox/auth-basic-login-signup-example/src/providers/local-signup.provider.ts b/sandbox/auth-ms-basic-example/src/providers/local-signup.provider.ts similarity index 99% rename from sandbox/auth-basic-login-signup-example/src/providers/local-signup.provider.ts rename to sandbox/auth-ms-basic-example/src/providers/local-signup.provider.ts index 9982546b39..1026a2f2d5 100755 --- a/sandbox/auth-basic-login-signup-example/src/providers/local-signup.provider.ts +++ b/sandbox/auth-ms-basic-example/src/providers/local-signup.provider.ts @@ -16,8 +16,6 @@ export class LocalSignupProvider ) {} value(): UserSignupFn<UserDto, UserDto> { - - return async (model, token) => this.userOps.createUser(model, {}); } } diff --git a/sandbox/auth-basic-login-signup-example/src/providers/signup-token-handler.provider.ts b/sandbox/auth-ms-basic-example/src/providers/signup-token-handler.provider.ts similarity index 65% rename from sandbox/auth-basic-login-signup-example/src/providers/signup-token-handler.provider.ts rename to sandbox/auth-ms-basic-example/src/providers/signup-token-handler.provider.ts index 998421fe8c..e5e5897f3d 100755 --- a/sandbox/auth-basic-login-signup-example/src/providers/signup-token-handler.provider.ts +++ b/sandbox/auth-ms-basic-example/src/providers/signup-token-handler.provider.ts @@ -3,19 +3,17 @@ // This software is released under the MIT License. // https://opensource.org/licenses/MIT import {Provider, service} from '@loopback/core'; -import {HttpErrors} from '@loopback/rest'; -import { SignupTokenHandlerFn } from '@sourceloop/authentication-service'; -import { UserOpsService } from '../services'; +import {SignupTokenHandlerFn} from '@sourceloop/authentication-service'; +import {UserOpsService} from '../services'; export class SignupTokenHandlerProvider implements Provider<SignupTokenHandlerFn> { - constructor( @service(UserOpsService) private readonly userOps: UserOpsService, ) {} value(): SignupTokenHandlerFn { - return async (dto)=>this.userOps.createUserToken(dto); + return async dto => this.userOps.createUserToken(dto); } } diff --git a/sandbox/auth-basic-login-signup-example/src/services/index.ts b/sandbox/auth-ms-basic-example/src/services/index.ts similarity index 100% rename from sandbox/auth-basic-login-signup-example/src/services/index.ts rename to sandbox/auth-ms-basic-example/src/services/index.ts diff --git a/sandbox/auth-basic-login-signup-example/src/services/user-ops.service.ts b/sandbox/auth-ms-basic-example/src/services/user-ops.service.ts similarity index 63% rename from sandbox/auth-basic-login-signup-example/src/services/user-ops.service.ts rename to sandbox/auth-ms-basic-example/src/services/user-ops.service.ts index eae8a9aaf3..88409a0228 100755 --- a/sandbox/auth-basic-login-signup-example/src/services/user-ops.service.ts +++ b/sandbox/auth-ms-basic-example/src/services/user-ops.service.ts @@ -14,7 +14,6 @@ import { User, UserCredentials, UserRepository, - UserTenant, UserTenantRepository, } from '@sourceloop/authentication-service'; import {UserStatus} from '@sourceloop/core'; @@ -22,6 +21,7 @@ import {AuthenticateErrorKeys} from '@sourceloop/core/src/enums'; import bcrypt from 'bcrypt'; import {UserDto} from '../models/user.dto'; const saltRounds = 10; +const DEFAULT_TENANT_ID = '91afb1b3-15ef-66f9-b5c3-d9c4daaa0b34'; // tenant with this id needs to be present in db @injectable({scope: BindingScope.TRANSIENT}) export class UserOpsService { @@ -36,83 +36,110 @@ export class UserOpsService { private readonly authClientsRepository: AuthClientRepository, ) {} - createUserToken(dto:DataObject<SignupRequestResponseDto>){ - console.log(dto); + createUserToken(dto: DataObject<SignupRequestResponseDto>) { + console.log(dto); } async createUser(user: LocalUserProfileDto, options: AnyObject) { - const tenantId="91afb1b3-15ef-66f9-b5c3-d9c4daaa0b34"; // tenant with this id needs to be present in db + const userDto = await this.prepareUserDto(user); + this.validateUserCreation(userDto, options); + + await this.validateAuthClient(userDto.clientId); + + const existingUser = await this.findExistingUser(userDto); + if (existingUser) { + return this.handleExistingUser(existingUser, userDto, options); + } + + return this.createNewUser(userDto, user, options); + } - let userDto:UserDto=new UserDto({ + private async prepareUserDto(user: LocalUserProfileDto): Promise<UserDto> { + const role = await this.roleRepository.create( + new Role({ + name: 'USER', + tenantId: DEFAULT_TENANT_ID, + roleType: 1, + }), + ); + + return new UserDto({ ...user, - tenantId:tenantId, - username:user.email, - firstName:'test', - lastName:'NA' - }) - this.validateUserCreation(userDto, options); + tenantId: DEFAULT_TENANT_ID, + username: user.email, + firstName: 'test', + lastName: 'NA', + roleId: role.id ?? '', + }); + } + private async validateAuthClient(clientId: string) { const authClient = await this.authClientsRepository.findOne({ - where: { - clientId: userDto.clientId, - }, + where: {clientId}, }); if (!authClient) { throw new HttpErrors.BadRequest('Invalid Client'); } + } - const userExists = await this.userRepository.findOne({ + private async findExistingUser(userDto: UserDto) { + return this.userRepository.findOne({ where: { - or: [{username: userDto.username}, {email: user.email}], + or: [{username: userDto.username}, {email: userDto.email}], }, - fields: { - id: true, + fields: {id: true}, + }); + } + + private async handleExistingUser( + existingUser: User, + userDto: UserDto, + options: AnyObject, + ) { + const userTenantExists = await this.utRepository.findOne({ + where: { + userId: existingUser.id, + tenantId: userDto.tenantId, }, }); - const role:Role=await this.roleRepository.create(new Role({ - name:'USER', - tenantId:userDto.tenantId, - roleType:1 - })) - userDto.roleId=role.id??''; - - if (userExists) { - const userTenantExists = await this.utRepository.findOne({ - where: { - userId: userExists.id, - tenantId: userDto.tenantId, - }, - }); - if (userTenantExists) { - throw new HttpErrors.BadRequest('User already exists'); - } else { - const userTenant: UserTenant = await this.createUserTenantData( - userDto, - UserStatus.ACTIVE, - userExists?.id, - options, - ); - return new UserDto({ - roleId: userTenant.roleId, - status: userTenant.status, - tenantId: userTenant.tenantId, - userTenantId: userTenant.id, - }); - } + + if (userTenantExists) { + throw new HttpErrors.BadRequest('User already exists'); } - const username = user.email; - userDto.username = username.toLowerCase(); - //Override default tenant id + const userTenant = await this.createUserTenantData( + userDto, + UserStatus.ACTIVE, + existingUser?.id, + options, + ); + + return new UserDto({ + roleId: userTenant.roleId, + status: userTenant.status, + tenantId: userTenant.tenantId, + userTenantId: userTenant.id, + }); + } + + private async createNewUser( + userDto: UserDto, + user: LocalUserProfileDto, + options: AnyObject, + ) { + const authClient = await this.authClientsRepository.findOne({ + where: {clientId: userDto.clientId}, + }); + const userSaved = await this.userRepository.createWithoutPassword( new User({ - username: userDto.username??'NA', - firstName: userDto.firstName??'NA', - lastName: userDto.lastName??'NA', - email: userDto.email??'NA', - phone: userDto.phone??'NA', - defaultTenantId: userDto.tenantId??'NA', + username: userDto.username?.toLowerCase() ?? 'NA', + firstName: userDto.firstName ?? 'NA', + lastName: userDto.lastName ?? 'NA', + email: userDto.email ?? 'NA', + phone: userDto.phone ?? 'NA', + defaultTenantId: userDto.tenantId ?? 'NA', authClientIds: `{${authClient?.id}}`, }), options, @@ -202,6 +229,4 @@ export class UserOpsService { await this.userRepository.credentials(user.id).create(creds); return true; } - - } diff --git a/sandbox/auth-basic-login-signup-example/tsconfig.json b/sandbox/auth-ms-basic-example/tsconfig.json similarity index 100% rename from sandbox/auth-basic-login-signup-example/tsconfig.json rename to sandbox/auth-ms-basic-example/tsconfig.json From cdcd12b14091d37fd5ceb56138c8b040047afeca Mon Sep 17 00:00:00 2001 From: Tyagi-Sunny <sunny.tyagi@sourcefuse.com> Date: Wed, 29 Jan 2025 11:56:14 +0530 Subject: [PATCH 3/3] refactor(sandbox): update user ops service to remove sonar update user ops service to remove sonar 0 --- package-lock.json | 4886 +++++++++++------ .../src/services/user-ops.service.ts | 2 +- 2 files changed, 3263 insertions(+), 1625 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2542e79325..04409154b8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -33,6 +33,10 @@ "typedoc-plugin-markdown": "3.14.0" } }, + "node_modules/-auth-basic-login-signup-example": { + "resolved": "sandbox/auth-ms-basic-example", + "link": true + }, "node_modules/@ampproject/remapping": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", @@ -265,6 +269,18 @@ "openapi-types": ">=7" } }, + "node_modules/@asamuzakjp/css-color": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-2.8.3.tgz", + "integrity": "sha512-GIc76d9UI1hCvOATjZPyHFmE5qhRccp3/zGfMPapK3jBi+yocEzp6BBB0UnfRYP9NP4FANqUZYb0hnfs3TM3hw==", + "dependencies": { + "@csstools/css-calc": "^2.1.1", + "@csstools/css-color-parser": "^3.0.7", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "lru-cache": "^10.4.3" + } + }, "node_modules/@aws-crypto/crc32": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz", @@ -452,396 +468,288 @@ } }, "node_modules/@aws-sdk/client-s3": { - "version": "3.717.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.717.0.tgz", - "integrity": "sha512-jzaH8IskAXVnqlZ3/H/ROwrB2HCnq/atlN7Hi7FIfjWvMPf5nfcJKfzJ1MXFX0EQR5qO6X4TbK7rgi7Bjw9NjQ==", + "version": "3.735.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.735.0.tgz", + "integrity": "sha512-6NcxX06c4tnnu6FTFiyS8shoYLy+8TvIDkYjJ5r9tvbaysOptUKQdolOuh7+Lz95QyaqiznpCsNTxsfywLXcqw==", "dependencies": { "@aws-crypto/sha1-browser": "5.2.0", "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.716.0", - "@aws-sdk/client-sts": "3.716.0", - "@aws-sdk/core": "3.716.0", - "@aws-sdk/credential-provider-node": "3.716.0", - "@aws-sdk/middleware-bucket-endpoint": "3.714.0", - "@aws-sdk/middleware-expect-continue": "3.714.0", - "@aws-sdk/middleware-flexible-checksums": "3.717.0", - "@aws-sdk/middleware-host-header": "3.714.0", - "@aws-sdk/middleware-location-constraint": "3.714.0", - "@aws-sdk/middleware-logger": "3.714.0", - "@aws-sdk/middleware-recursion-detection": "3.714.0", - "@aws-sdk/middleware-sdk-s3": "3.716.0", - "@aws-sdk/middleware-ssec": "3.714.0", - "@aws-sdk/middleware-user-agent": "3.716.0", - "@aws-sdk/region-config-resolver": "3.714.0", - "@aws-sdk/signature-v4-multi-region": "3.716.0", - "@aws-sdk/types": "3.714.0", - "@aws-sdk/util-endpoints": "3.714.0", - "@aws-sdk/util-user-agent-browser": "3.714.0", - "@aws-sdk/util-user-agent-node": "3.716.0", - "@aws-sdk/xml-builder": "3.709.0", - "@smithy/config-resolver": "^3.0.13", - "@smithy/core": "^2.5.5", - "@smithy/eventstream-serde-browser": "^3.0.14", - "@smithy/eventstream-serde-config-resolver": "^3.0.11", - "@smithy/eventstream-serde-node": "^3.0.13", - "@smithy/fetch-http-handler": "^4.1.2", - "@smithy/hash-blob-browser": "^3.1.10", - "@smithy/hash-node": "^3.0.11", - "@smithy/hash-stream-node": "^3.1.10", - "@smithy/invalid-dependency": "^3.0.11", - "@smithy/md5-js": "^3.0.11", - "@smithy/middleware-content-length": "^3.0.13", - "@smithy/middleware-endpoint": "^3.2.6", - "@smithy/middleware-retry": "^3.0.31", - "@smithy/middleware-serde": "^3.0.11", - "@smithy/middleware-stack": "^3.0.11", - "@smithy/node-config-provider": "^3.1.12", - "@smithy/node-http-handler": "^3.3.2", - "@smithy/protocol-http": "^4.1.8", - "@smithy/smithy-client": "^3.5.1", - "@smithy/types": "^3.7.2", - "@smithy/url-parser": "^3.0.11", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.31", - "@smithy/util-defaults-mode-node": "^3.0.31", - "@smithy/util-endpoints": "^2.1.7", - "@smithy/util-middleware": "^3.0.11", - "@smithy/util-retry": "^3.0.11", - "@smithy/util-stream": "^3.3.2", - "@smithy/util-utf8": "^3.0.0", - "@smithy/util-waiter": "^3.2.0", + "@aws-sdk/core": "3.734.0", + "@aws-sdk/credential-provider-node": "3.734.0", + "@aws-sdk/middleware-bucket-endpoint": "3.734.0", + "@aws-sdk/middleware-expect-continue": "3.734.0", + "@aws-sdk/middleware-flexible-checksums": "3.735.0", + "@aws-sdk/middleware-host-header": "3.734.0", + "@aws-sdk/middleware-location-constraint": "3.734.0", + "@aws-sdk/middleware-logger": "3.734.0", + "@aws-sdk/middleware-recursion-detection": "3.734.0", + "@aws-sdk/middleware-sdk-s3": "3.734.0", + "@aws-sdk/middleware-ssec": "3.734.0", + "@aws-sdk/middleware-user-agent": "3.734.0", + "@aws-sdk/region-config-resolver": "3.734.0", + "@aws-sdk/signature-v4-multi-region": "3.734.0", + "@aws-sdk/types": "3.734.0", + "@aws-sdk/util-endpoints": "3.734.0", + "@aws-sdk/util-user-agent-browser": "3.734.0", + "@aws-sdk/util-user-agent-node": "3.734.0", + "@aws-sdk/xml-builder": "3.734.0", + "@smithy/config-resolver": "^4.0.1", + "@smithy/core": "^3.1.1", + "@smithy/eventstream-serde-browser": "^4.0.1", + "@smithy/eventstream-serde-config-resolver": "^4.0.1", + "@smithy/eventstream-serde-node": "^4.0.1", + "@smithy/fetch-http-handler": "^5.0.1", + "@smithy/hash-blob-browser": "^4.0.1", + "@smithy/hash-node": "^4.0.1", + "@smithy/hash-stream-node": "^4.0.1", + "@smithy/invalid-dependency": "^4.0.1", + "@smithy/md5-js": "^4.0.1", + "@smithy/middleware-content-length": "^4.0.1", + "@smithy/middleware-endpoint": "^4.0.2", + "@smithy/middleware-retry": "^4.0.3", + "@smithy/middleware-serde": "^4.0.1", + "@smithy/middleware-stack": "^4.0.1", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/node-http-handler": "^4.0.2", + "@smithy/protocol-http": "^5.0.1", + "@smithy/smithy-client": "^4.1.2", + "@smithy/types": "^4.1.0", + "@smithy/url-parser": "^4.0.1", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-body-length-node": "^4.0.0", + "@smithy/util-defaults-mode-browser": "^4.0.3", + "@smithy/util-defaults-mode-node": "^4.0.3", + "@smithy/util-endpoints": "^3.0.1", + "@smithy/util-middleware": "^4.0.1", + "@smithy/util-retry": "^4.0.1", + "@smithy/util-stream": "^4.0.2", + "@smithy/util-utf8": "^4.0.0", + "@smithy/util-waiter": "^4.0.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.716.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.716.0.tgz", - "integrity": "sha512-5Nb0jJXce2TclbjG7WVPufwhgV1TRydz1QnsuBtKU0AdViEpr787YrZhPpGnNIM1Dx+R1H/tmAHZnOoohS6D8g==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.716.0", - "@aws-sdk/middleware-host-header": "3.714.0", - "@aws-sdk/middleware-logger": "3.714.0", - "@aws-sdk/middleware-recursion-detection": "3.714.0", - "@aws-sdk/middleware-user-agent": "3.716.0", - "@aws-sdk/region-config-resolver": "3.714.0", - "@aws-sdk/types": "3.714.0", - "@aws-sdk/util-endpoints": "3.714.0", - "@aws-sdk/util-user-agent-browser": "3.714.0", - "@aws-sdk/util-user-agent-node": "3.716.0", - "@smithy/config-resolver": "^3.0.13", - "@smithy/core": "^2.5.5", - "@smithy/fetch-http-handler": "^4.1.2", - "@smithy/hash-node": "^3.0.11", - "@smithy/invalid-dependency": "^3.0.11", - "@smithy/middleware-content-length": "^3.0.13", - "@smithy/middleware-endpoint": "^3.2.6", - "@smithy/middleware-retry": "^3.0.31", - "@smithy/middleware-serde": "^3.0.11", - "@smithy/middleware-stack": "^3.0.11", - "@smithy/node-config-provider": "^3.1.12", - "@smithy/node-http-handler": "^3.3.2", - "@smithy/protocol-http": "^4.1.8", - "@smithy/smithy-client": "^3.5.1", - "@smithy/types": "^3.7.2", - "@smithy/url-parser": "^3.0.11", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.31", - "@smithy/util-defaults-mode-node": "^3.0.31", - "@smithy/util-endpoints": "^2.1.7", - "@smithy/util-middleware": "^3.0.11", - "@smithy/util-retry": "^3.0.11", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.716.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.716.0.tgz", - "integrity": "sha512-lA4IB9FzR2KjH7EVCo+mHGFKqdViVyeBQEIX9oVratL/l7P0bMS1fMwgfHOc3ACazqNxBxDES7x08ZCp32y6Lw==", + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.734.0.tgz", + "integrity": "sha512-oerepp0mut9VlgTwnG5Ds/lb0C0b2/rQ+hL/rF6q+HGKPfGsCuPvFx1GtwGKCXd49ase88/jVgrhcA9OQbz3kg==", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.716.0", - "@aws-sdk/credential-provider-node": "3.716.0", - "@aws-sdk/middleware-host-header": "3.714.0", - "@aws-sdk/middleware-logger": "3.714.0", - "@aws-sdk/middleware-recursion-detection": "3.714.0", - "@aws-sdk/middleware-user-agent": "3.716.0", - "@aws-sdk/region-config-resolver": "3.714.0", - "@aws-sdk/types": "3.714.0", - "@aws-sdk/util-endpoints": "3.714.0", - "@aws-sdk/util-user-agent-browser": "3.714.0", - "@aws-sdk/util-user-agent-node": "3.716.0", - "@smithy/config-resolver": "^3.0.13", - "@smithy/core": "^2.5.5", - "@smithy/fetch-http-handler": "^4.1.2", - "@smithy/hash-node": "^3.0.11", - "@smithy/invalid-dependency": "^3.0.11", - "@smithy/middleware-content-length": "^3.0.13", - "@smithy/middleware-endpoint": "^3.2.6", - "@smithy/middleware-retry": "^3.0.31", - "@smithy/middleware-serde": "^3.0.11", - "@smithy/middleware-stack": "^3.0.11", - "@smithy/node-config-provider": "^3.1.12", - "@smithy/node-http-handler": "^3.3.2", - "@smithy/protocol-http": "^4.1.8", - "@smithy/smithy-client": "^3.5.1", - "@smithy/types": "^3.7.2", - "@smithy/url-parser": "^3.0.11", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.31", - "@smithy/util-defaults-mode-node": "^3.0.31", - "@smithy/util-endpoints": "^2.1.7", - "@smithy/util-middleware": "^3.0.11", - "@smithy/util-retry": "^3.0.11", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.716.0" - } - }, - "node_modules/@aws-sdk/client-sts": { - "version": "3.716.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.716.0.tgz", - "integrity": "sha512-i4SVNsrdXudp8T4bkm7Fi3YWlRnvXCSwvNDqf6nLqSJxqr4CN3VlBELueDyjBK7TAt453/qSif+eNx+bHmwo4Q==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.716.0", - "@aws-sdk/core": "3.716.0", - "@aws-sdk/credential-provider-node": "3.716.0", - "@aws-sdk/middleware-host-header": "3.714.0", - "@aws-sdk/middleware-logger": "3.714.0", - "@aws-sdk/middleware-recursion-detection": "3.714.0", - "@aws-sdk/middleware-user-agent": "3.716.0", - "@aws-sdk/region-config-resolver": "3.714.0", - "@aws-sdk/types": "3.714.0", - "@aws-sdk/util-endpoints": "3.714.0", - "@aws-sdk/util-user-agent-browser": "3.714.0", - "@aws-sdk/util-user-agent-node": "3.716.0", - "@smithy/config-resolver": "^3.0.13", - "@smithy/core": "^2.5.5", - "@smithy/fetch-http-handler": "^4.1.2", - "@smithy/hash-node": "^3.0.11", - "@smithy/invalid-dependency": "^3.0.11", - "@smithy/middleware-content-length": "^3.0.13", - "@smithy/middleware-endpoint": "^3.2.6", - "@smithy/middleware-retry": "^3.0.31", - "@smithy/middleware-serde": "^3.0.11", - "@smithy/middleware-stack": "^3.0.11", - "@smithy/node-config-provider": "^3.1.12", - "@smithy/node-http-handler": "^3.3.2", - "@smithy/protocol-http": "^4.1.8", - "@smithy/smithy-client": "^3.5.1", - "@smithy/types": "^3.7.2", - "@smithy/url-parser": "^3.0.11", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.31", - "@smithy/util-defaults-mode-node": "^3.0.31", - "@smithy/util-endpoints": "^2.1.7", - "@smithy/util-middleware": "^3.0.11", - "@smithy/util-retry": "^3.0.11", - "@smithy/util-utf8": "^3.0.0", + "@aws-sdk/core": "3.734.0", + "@aws-sdk/middleware-host-header": "3.734.0", + "@aws-sdk/middleware-logger": "3.734.0", + "@aws-sdk/middleware-recursion-detection": "3.734.0", + "@aws-sdk/middleware-user-agent": "3.734.0", + "@aws-sdk/region-config-resolver": "3.734.0", + "@aws-sdk/types": "3.734.0", + "@aws-sdk/util-endpoints": "3.734.0", + "@aws-sdk/util-user-agent-browser": "3.734.0", + "@aws-sdk/util-user-agent-node": "3.734.0", + "@smithy/config-resolver": "^4.0.1", + "@smithy/core": "^3.1.1", + "@smithy/fetch-http-handler": "^5.0.1", + "@smithy/hash-node": "^4.0.1", + "@smithy/invalid-dependency": "^4.0.1", + "@smithy/middleware-content-length": "^4.0.1", + "@smithy/middleware-endpoint": "^4.0.2", + "@smithy/middleware-retry": "^4.0.3", + "@smithy/middleware-serde": "^4.0.1", + "@smithy/middleware-stack": "^4.0.1", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/node-http-handler": "^4.0.2", + "@smithy/protocol-http": "^5.0.1", + "@smithy/smithy-client": "^4.1.2", + "@smithy/types": "^4.1.0", + "@smithy/url-parser": "^4.0.1", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-body-length-node": "^4.0.0", + "@smithy/util-defaults-mode-browser": "^4.0.3", + "@smithy/util-defaults-mode-node": "^4.0.3", + "@smithy/util-endpoints": "^3.0.1", + "@smithy/util-middleware": "^4.0.1", + "@smithy/util-retry": "^4.0.1", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/core": { - "version": "3.716.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.716.0.tgz", - "integrity": "sha512-5DkUiTrbyzO8/W4g7UFEqRFpuhgizayHI/Zbh0wtFMcot8801nJV+MP/YMhdjimlvAr/OqYB08FbGsPyWppMTw==", - "dependencies": { - "@aws-sdk/types": "3.714.0", - "@smithy/core": "^2.5.5", - "@smithy/node-config-provider": "^3.1.12", - "@smithy/property-provider": "^3.1.11", - "@smithy/protocol-http": "^4.1.8", - "@smithy/signature-v4": "^4.2.4", - "@smithy/smithy-client": "^3.5.1", - "@smithy/types": "^3.7.2", - "@smithy/util-middleware": "^3.0.11", + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.734.0.tgz", + "integrity": "sha512-SxnDqf3vobdm50OLyAKfqZetv6zzwnSqwIwd3jrbopxxHKqNIM/I0xcYjD6Tn+mPig+u7iRKb9q3QnEooFTlmg==", + "dependencies": { + "@aws-sdk/types": "3.734.0", + "@smithy/core": "^3.1.1", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/property-provider": "^4.0.1", + "@smithy/protocol-http": "^5.0.1", + "@smithy/signature-v4": "^5.0.1", + "@smithy/smithy-client": "^4.1.2", + "@smithy/types": "^4.1.0", + "@smithy/util-middleware": "^4.0.1", "fast-xml-parser": "4.4.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.716.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.716.0.tgz", - "integrity": "sha512-JI2KQUnn2arICwP9F3CnqP1W3nAbm4+meQg/yOhp9X0DMzQiHrHRd4HIrK2vyVgi2/6hGhONY5uLF26yRTA7nQ==", - "dependencies": { - "@aws-sdk/core": "3.716.0", - "@aws-sdk/types": "3.714.0", - "@smithy/property-provider": "^3.1.11", - "@smithy/types": "^3.7.2", + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.734.0.tgz", + "integrity": "sha512-gtRkzYTGafnm1FPpiNO8VBmJrYMoxhDlGPYDVcijzx3DlF8dhWnowuSBCxLSi+MJMx5hvwrX2A+e/q0QAeHqmw==", + "dependencies": { + "@aws-sdk/core": "3.734.0", + "@aws-sdk/types": "3.734.0", + "@smithy/property-provider": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.716.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.716.0.tgz", - "integrity": "sha512-CZ04pl2z7igQPysQyH2xKZHM3fLwkemxQbKOlje3TmiS1NwXvcKvERhp9PE/H23kOL7beTM19NMRog/Fka/rlw==", - "dependencies": { - "@aws-sdk/core": "3.716.0", - "@aws-sdk/types": "3.714.0", - "@smithy/fetch-http-handler": "^4.1.2", - "@smithy/node-http-handler": "^3.3.2", - "@smithy/property-provider": "^3.1.11", - "@smithy/protocol-http": "^4.1.8", - "@smithy/smithy-client": "^3.5.1", - "@smithy/types": "^3.7.2", - "@smithy/util-stream": "^3.3.2", + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.734.0.tgz", + "integrity": "sha512-JFSL6xhONsq+hKM8xroIPhM5/FOhiQ1cov0lZxhzZWj6Ai3UAjucy3zyIFDr9MgP1KfCYNdvyaUq9/o+HWvEDg==", + "dependencies": { + "@aws-sdk/core": "3.734.0", + "@aws-sdk/types": "3.734.0", + "@smithy/fetch-http-handler": "^5.0.1", + "@smithy/node-http-handler": "^4.0.2", + "@smithy/property-provider": "^4.0.1", + "@smithy/protocol-http": "^5.0.1", + "@smithy/smithy-client": "^4.1.2", + "@smithy/types": "^4.1.0", + "@smithy/util-stream": "^4.0.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.716.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.716.0.tgz", - "integrity": "sha512-P37We2GtZvdROxiwP0zrpEL81/HuYK1qlYxp5VCj3uV+G4mG8UQN2gMIU/baYrpOQqa0h81RfyQGRFUjVaDVqw==", - "dependencies": { - "@aws-sdk/core": "3.716.0", - "@aws-sdk/credential-provider-env": "3.716.0", - "@aws-sdk/credential-provider-http": "3.716.0", - "@aws-sdk/credential-provider-process": "3.716.0", - "@aws-sdk/credential-provider-sso": "3.716.0", - "@aws-sdk/credential-provider-web-identity": "3.716.0", - "@aws-sdk/types": "3.714.0", - "@smithy/credential-provider-imds": "^3.2.8", - "@smithy/property-provider": "^3.1.11", - "@smithy/shared-ini-file-loader": "^3.1.12", - "@smithy/types": "^3.7.2", + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.734.0.tgz", + "integrity": "sha512-HEyaM/hWI7dNmb4NhdlcDLcgJvrilk8G4DQX6qz0i4pBZGC2l4iffuqP8K6ZQjUfz5/6894PzeFuhTORAMd+cg==", + "dependencies": { + "@aws-sdk/core": "3.734.0", + "@aws-sdk/credential-provider-env": "3.734.0", + "@aws-sdk/credential-provider-http": "3.734.0", + "@aws-sdk/credential-provider-process": "3.734.0", + "@aws-sdk/credential-provider-sso": "3.734.0", + "@aws-sdk/credential-provider-web-identity": "3.734.0", + "@aws-sdk/nested-clients": "3.734.0", + "@aws-sdk/types": "3.734.0", + "@smithy/credential-provider-imds": "^4.0.1", + "@smithy/property-provider": "^4.0.1", + "@smithy/shared-ini-file-loader": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.716.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.716.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.716.0.tgz", - "integrity": "sha512-FGQPK2uKfS53dVvoskN/s/t6m0Po24BGd1PzJdzHBFCOjxbZLM6+8mDMXeyi2hCLVVQOUcuW41kOgmJ0+zMbww==", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.716.0", - "@aws-sdk/credential-provider-http": "3.716.0", - "@aws-sdk/credential-provider-ini": "3.716.0", - "@aws-sdk/credential-provider-process": "3.716.0", - "@aws-sdk/credential-provider-sso": "3.716.0", - "@aws-sdk/credential-provider-web-identity": "3.716.0", - "@aws-sdk/types": "3.714.0", - "@smithy/credential-provider-imds": "^3.2.8", - "@smithy/property-provider": "^3.1.11", - "@smithy/shared-ini-file-loader": "^3.1.12", - "@smithy/types": "^3.7.2", + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.734.0.tgz", + "integrity": "sha512-9NOSNbkPVb91JwaXOhyfahkzAwWdMsbWHL6fh5/PHlXYpsDjfIfT23I++toepNF2nODAJNLnOEHGYIxgNgf6jQ==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.734.0", + "@aws-sdk/credential-provider-http": "3.734.0", + "@aws-sdk/credential-provider-ini": "3.734.0", + "@aws-sdk/credential-provider-process": "3.734.0", + "@aws-sdk/credential-provider-sso": "3.734.0", + "@aws-sdk/credential-provider-web-identity": "3.734.0", + "@aws-sdk/types": "3.734.0", + "@smithy/credential-provider-imds": "^4.0.1", + "@smithy/property-provider": "^4.0.1", + "@smithy/shared-ini-file-loader": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.716.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.716.0.tgz", - "integrity": "sha512-0spcu2MWVVHSTHH3WE2E//ttUJPwXRM3BCp+WyI41xLzpNu1Fd8zjOrDpEo0SnGUzsSiRTIJWgkuu/tqv9NJ2A==", - "dependencies": { - "@aws-sdk/core": "3.716.0", - "@aws-sdk/types": "3.714.0", - "@smithy/property-provider": "^3.1.11", - "@smithy/shared-ini-file-loader": "^3.1.12", - "@smithy/types": "^3.7.2", + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.734.0.tgz", + "integrity": "sha512-zvjsUo+bkYn2vjT+EtLWu3eD6me+uun+Hws1IyWej/fKFAqiBPwyeyCgU7qjkiPQSXqk1U9+/HG9IQ6Iiz+eBw==", + "dependencies": { + "@aws-sdk/core": "3.734.0", + "@aws-sdk/types": "3.734.0", + "@smithy/property-provider": "^4.0.1", + "@smithy/shared-ini-file-loader": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.716.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.716.0.tgz", - "integrity": "sha512-J2IA3WuCpRGGoZm6VHZVFCnrxXP+41iUWb9Ct/1spljegTa1XjiaZ5Jf3+Ubj7WKiyvP9/dgz1L0bu2bYEjliw==", - "dependencies": { - "@aws-sdk/client-sso": "3.716.0", - "@aws-sdk/core": "3.716.0", - "@aws-sdk/token-providers": "3.714.0", - "@aws-sdk/types": "3.714.0", - "@smithy/property-provider": "^3.1.11", - "@smithy/shared-ini-file-loader": "^3.1.12", - "@smithy/types": "^3.7.2", + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.734.0.tgz", + "integrity": "sha512-cCwwcgUBJOsV/ddyh1OGb4gKYWEaTeTsqaAK19hiNINfYV/DO9r4RMlnWAo84sSBfJuj9shUNsxzyoe6K7R92Q==", + "dependencies": { + "@aws-sdk/client-sso": "3.734.0", + "@aws-sdk/core": "3.734.0", + "@aws-sdk/token-providers": "3.734.0", + "@aws-sdk/types": "3.734.0", + "@smithy/property-provider": "^4.0.1", + "@smithy/shared-ini-file-loader": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.716.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.716.0.tgz", - "integrity": "sha512-vzgpWKs2gGXZGdbMKRFrMW4PqEFWkGvwWH2T7ZwQv9m+8lQ7P4Dk2uimqu0f37HZAbpn8HFMqRh4CaySjU354A==", - "dependencies": { - "@aws-sdk/core": "3.716.0", - "@aws-sdk/types": "3.714.0", - "@smithy/property-provider": "^3.1.11", - "@smithy/types": "^3.7.2", + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.734.0.tgz", + "integrity": "sha512-t4OSOerc+ppK541/Iyn1AS40+2vT/qE+MFMotFkhCgCJbApeRF2ozEdnDN6tGmnl4ybcUuxnp9JWLjwDVlR/4g==", + "dependencies": { + "@aws-sdk/core": "3.734.0", + "@aws-sdk/nested-clients": "3.734.0", + "@aws-sdk/types": "3.734.0", + "@smithy/property-provider": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.716.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/lib-storage": { - "version": "3.717.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/lib-storage/-/lib-storage-3.717.0.tgz", - "integrity": "sha512-3Wpsi5soTH2XCEEu9qctj6zVH4ViZ3Qe3crFL7fJQrE9Uw3X60/+IfYfJMgZdQY3pIqmUsjydR93PZG0x6cXLw==", + "version": "3.735.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/lib-storage/-/lib-storage-3.735.0.tgz", + "integrity": "sha512-rKCtjP1MC+coDXFJUpxVEZXY5qShE4aduWZTlmEdGptu81GgM6efNAU/GvMIB6Ttju/m+VqLYLWBuxG5js7Uhw==", "dependencies": { - "@smithy/abort-controller": "^3.1.9", - "@smithy/middleware-endpoint": "^3.2.6", - "@smithy/smithy-client": "^3.5.1", + "@smithy/abort-controller": "^4.0.1", + "@smithy/middleware-endpoint": "^4.0.2", + "@smithy/smithy-client": "^4.1.2", "buffer": "5.6.0", "events": "3.3.0", "stream-browserify": "3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" }, "peerDependencies": { - "@aws-sdk/client-s3": "^3.717.0" + "@aws-sdk/client-s3": "^3.735.0" } }, "node_modules/@aws-sdk/lib-storage/node_modules/buffer": { @@ -862,321 +770,367 @@ } }, "node_modules/@aws-sdk/middleware-bucket-endpoint": { - "version": "3.714.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.714.0.tgz", - "integrity": "sha512-I/xSOskiseJJ8i183Z522BgqbgYzLKP7jGcg2Qeib/IWoG2IP+9DH8pwqagKaPAycyswtnoKBJiiFXY43n0CkA==", - "dependencies": { - "@aws-sdk/types": "3.714.0", - "@aws-sdk/util-arn-parser": "3.693.0", - "@smithy/node-config-provider": "^3.1.12", - "@smithy/protocol-http": "^4.1.8", - "@smithy/types": "^3.7.2", - "@smithy/util-config-provider": "^3.0.0", + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.734.0.tgz", + "integrity": "sha512-etC7G18aF7KdZguW27GE/wpbrNmYLVT755EsFc8kXpZj8D6AFKxc7OuveinJmiy0bYXAMspJUWsF6CrGpOw6CQ==", + "dependencies": { + "@aws-sdk/types": "3.734.0", + "@aws-sdk/util-arn-parser": "3.723.0", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", + "@smithy/util-config-provider": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/middleware-expect-continue": { - "version": "3.714.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.714.0.tgz", - "integrity": "sha512-rlzsXdG8Lzo4Qpl35ZnpOBAWlzvDHpP9++0AXoUwAJA0QmMm7auIRmgxJuNj91VwT9h15ZU6xjU4S7fJl4W0+w==", + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.734.0.tgz", + "integrity": "sha512-P38/v1l6HjuB2aFUewt7ueAW5IvKkFcv5dalPtbMGRhLeyivBOHwbCyuRKgVs7z7ClTpu9EaViEGki2jEQqEsQ==", "dependencies": { - "@aws-sdk/types": "3.714.0", - "@smithy/protocol-http": "^4.1.8", - "@smithy/types": "^3.7.2", + "@aws-sdk/types": "3.734.0", + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/middleware-flexible-checksums": { - "version": "3.717.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.717.0.tgz", - "integrity": "sha512-a5kY5r7/7bDZZlOQQGWOR1ulQewdtNexdW1Ex5DD0FLKlFY7RD0va24hxQ6BP7mWHol+Dx4pj6UQ8ahk0ap1tw==", + "version": "3.735.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.735.0.tgz", + "integrity": "sha512-Tx7lYTPwQFRe/wQEHMR6Drh/S+X0ToAEq1Ava9QyxV1riwtepzRLojpNDELFb3YQVVYbX7FEiBMCJLMkmIIY+A==", "dependencies": { "@aws-crypto/crc32": "5.2.0", "@aws-crypto/crc32c": "5.2.0", "@aws-crypto/util": "5.2.0", - "@aws-sdk/core": "3.716.0", - "@aws-sdk/types": "3.714.0", - "@smithy/is-array-buffer": "^3.0.0", - "@smithy/node-config-provider": "^3.1.12", - "@smithy/protocol-http": "^4.1.8", - "@smithy/types": "^3.7.2", - "@smithy/util-middleware": "^3.0.11", - "@smithy/util-stream": "^3.3.2", - "@smithy/util-utf8": "^3.0.0", + "@aws-sdk/core": "3.734.0", + "@aws-sdk/types": "3.734.0", + "@smithy/is-array-buffer": "^4.0.0", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", + "@smithy/util-middleware": "^4.0.1", + "@smithy/util-stream": "^4.0.2", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.714.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.714.0.tgz", - "integrity": "sha512-6l68kjNrh5QC8FGX3I3geBDavWN5Tg1RLHJ2HLA8ByGBtJyCwnz3hEkKfaxn0bBx0hF9DzbfjEOUF6cDqy2Kjg==", + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.734.0.tgz", + "integrity": "sha512-LW7RRgSOHHBzWZnigNsDIzu3AiwtjeI2X66v+Wn1P1u+eXssy1+up4ZY/h+t2sU4LU36UvEf+jrZti9c6vRnFw==", "dependencies": { - "@aws-sdk/types": "3.714.0", - "@smithy/protocol-http": "^4.1.8", - "@smithy/types": "^3.7.2", + "@aws-sdk/types": "3.734.0", + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/middleware-location-constraint": { - "version": "3.714.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.714.0.tgz", - "integrity": "sha512-MX7M+V+FblujKck3fyuzePVIAy9530gY719IiSxV6uN1qLHl7VDJxNblpF/KpXakD6rOg8OpvtmqsXj9aBMftw==", + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.734.0.tgz", + "integrity": "sha512-EJEIXwCQhto/cBfHdm3ZOeLxd2NlJD+X2F+ZTOxzokuhBtY0IONfC/91hOo5tWQweerojwshSMHRCKzRv1tlwg==", "dependencies": { - "@aws-sdk/types": "3.714.0", - "@smithy/types": "^3.7.2", + "@aws-sdk/types": "3.734.0", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/middleware-logger": { - "version": "3.714.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.714.0.tgz", - "integrity": "sha512-RkqHlMvQWUaRklU1bMfUuBvdWwxgUtEqpADaHXlGVj3vtEY2UgBjy+57CveC4MByqKIunNvVHBBbjrGVtwY7Lg==", + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.734.0.tgz", + "integrity": "sha512-mUMFITpJUW3LcKvFok176eI5zXAUomVtahb9IQBwLzkqFYOrMJvWAvoV4yuxrJ8TlQBG8gyEnkb9SnhZvjg67w==", "dependencies": { - "@aws-sdk/types": "3.714.0", - "@smithy/types": "^3.7.2", + "@aws-sdk/types": "3.734.0", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.714.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.714.0.tgz", - "integrity": "sha512-AVU5ixnh93nqtsfgNc284oXsXaadyHGPHpql/jwgaaqQfEXjS/1/j3j9E/vpacfTTz2Vzo7hAOjnvrOXSEVDaA==", + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.734.0.tgz", + "integrity": "sha512-CUat2d9ITsFc2XsmeiRQO96iWpxSKYFjxvj27Hc7vo87YUHRnfMfnc8jw1EpxEwMcvBD7LsRa6vDNky6AjcrFA==", "dependencies": { - "@aws-sdk/types": "3.714.0", - "@smithy/protocol-http": "^4.1.8", - "@smithy/types": "^3.7.2", + "@aws-sdk/types": "3.734.0", + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/middleware-sdk-s3": { - "version": "3.716.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.716.0.tgz", - "integrity": "sha512-Qzz5OfRA/5brqfvq+JHTInwS1EuJ1+tC6qMtwKWJN3czMnVJVdnnsPTf+G5IM/1yYaGEIjY8rC1ExQLcc8ApFQ==", - "dependencies": { - "@aws-sdk/core": "3.716.0", - "@aws-sdk/types": "3.714.0", - "@aws-sdk/util-arn-parser": "3.693.0", - "@smithy/core": "^2.5.5", - "@smithy/node-config-provider": "^3.1.12", - "@smithy/protocol-http": "^4.1.8", - "@smithy/signature-v4": "^4.2.4", - "@smithy/smithy-client": "^3.5.1", - "@smithy/types": "^3.7.2", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.11", - "@smithy/util-stream": "^3.3.2", - "@smithy/util-utf8": "^3.0.0", + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.734.0.tgz", + "integrity": "sha512-zeZPenDhkP/RXYMFG3exhNOe2Qukg2l2KpIjxq9o66meELiTULoIXjCmgPoWcM8zzrue06SBdTsaJDHfDl2vdA==", + "dependencies": { + "@aws-sdk/core": "3.734.0", + "@aws-sdk/types": "3.734.0", + "@aws-sdk/util-arn-parser": "3.723.0", + "@smithy/core": "^3.1.1", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/protocol-http": "^5.0.1", + "@smithy/signature-v4": "^5.0.1", + "@smithy/smithy-client": "^4.1.2", + "@smithy/types": "^4.1.0", + "@smithy/util-config-provider": "^4.0.0", + "@smithy/util-middleware": "^4.0.1", + "@smithy/util-stream": "^4.0.2", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/middleware-ssec": { - "version": "3.714.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.714.0.tgz", - "integrity": "sha512-RkK8REAVwNUQmYbIDRw8eYbMJ8F1Rw4C9mlME4BBMhFlelGcD3ErU2ce24moQbDxBjNwHNESmIqgmdQk93CDCQ==", + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.734.0.tgz", + "integrity": "sha512-d4yd1RrPW/sspEXizq2NSOUivnheac6LPeLSLnaeTbBG9g1KqIqvCzP1TfXEqv2CrWfHEsWtJpX7oyjySSPvDQ==", "dependencies": { - "@aws-sdk/types": "3.714.0", - "@smithy/types": "^3.7.2", + "@aws-sdk/types": "3.734.0", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.716.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.716.0.tgz", - "integrity": "sha512-FpAtT6nNKrYdkDZndutEraiRMf+TgDzAGvniqRtZ/YTPA+gIsWrsn+TwMKINR81lFC3nQfb9deS5CFtxd021Ew==", - "dependencies": { - "@aws-sdk/core": "3.716.0", - "@aws-sdk/types": "3.714.0", - "@aws-sdk/util-endpoints": "3.714.0", - "@smithy/core": "^2.5.5", - "@smithy/protocol-http": "^4.1.8", - "@smithy/types": "^3.7.2", + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.734.0.tgz", + "integrity": "sha512-MFVzLWRkfFz02GqGPjqSOteLe5kPfElUrXZft1eElnqulqs6RJfVSpOV7mO90gu293tNAeggMWAVSGRPKIYVMg==", + "dependencies": { + "@aws-sdk/core": "3.734.0", + "@aws-sdk/types": "3.734.0", + "@aws-sdk/util-endpoints": "3.734.0", + "@smithy/core": "^3.1.1", + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.714.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.714.0.tgz", - "integrity": "sha512-HJzsQxgMOAzZrbf/YIqEx30or4tZK1oNAk6Wm6xecUQx+23JXIaePRu1YFUOLBBERQ4QBPpISFurZWBMZ5ibAw==", + "node_modules/@aws-sdk/nested-clients": { + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.734.0.tgz", + "integrity": "sha512-iph2XUy8UzIfdJFWo1r0Zng9uWj3253yvW9gljhtu+y/LNmNvSnJxQk1f3D2BC5WmcoPZqTS3UsycT3mLPSzWA==", "dependencies": { - "@aws-sdk/types": "3.714.0", - "@smithy/node-config-provider": "^3.1.12", - "@smithy/types": "^3.7.2", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.11", + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.734.0", + "@aws-sdk/middleware-host-header": "3.734.0", + "@aws-sdk/middleware-logger": "3.734.0", + "@aws-sdk/middleware-recursion-detection": "3.734.0", + "@aws-sdk/middleware-user-agent": "3.734.0", + "@aws-sdk/region-config-resolver": "3.734.0", + "@aws-sdk/types": "3.734.0", + "@aws-sdk/util-endpoints": "3.734.0", + "@aws-sdk/util-user-agent-browser": "3.734.0", + "@aws-sdk/util-user-agent-node": "3.734.0", + "@smithy/config-resolver": "^4.0.1", + "@smithy/core": "^3.1.1", + "@smithy/fetch-http-handler": "^5.0.1", + "@smithy/hash-node": "^4.0.1", + "@smithy/invalid-dependency": "^4.0.1", + "@smithy/middleware-content-length": "^4.0.1", + "@smithy/middleware-endpoint": "^4.0.2", + "@smithy/middleware-retry": "^4.0.3", + "@smithy/middleware-serde": "^4.0.1", + "@smithy/middleware-stack": "^4.0.1", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/node-http-handler": "^4.0.2", + "@smithy/protocol-http": "^5.0.1", + "@smithy/smithy-client": "^4.1.2", + "@smithy/types": "^4.1.0", + "@smithy/url-parser": "^4.0.1", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-body-length-node": "^4.0.0", + "@smithy/util-defaults-mode-browser": "^4.0.3", + "@smithy/util-defaults-mode-node": "^4.0.3", + "@smithy/util-endpoints": "^3.0.1", + "@smithy/util-middleware": "^4.0.1", + "@smithy/util-retry": "^4.0.1", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/region-config-resolver": { + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.734.0.tgz", + "integrity": "sha512-Lvj1kPRC5IuJBr9DyJ9T9/plkh+EfKLy+12s/mykOy1JaKHDpvj+XGy2YO6YgYVOb8JFtaqloid+5COtje4JTQ==", + "dependencies": { + "@aws-sdk/types": "3.734.0", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/types": "^4.1.0", + "@smithy/util-config-provider": "^4.0.0", + "@smithy/util-middleware": "^4.0.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/s3-request-presigner": { - "version": "3.717.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.717.0.tgz", - "integrity": "sha512-gpT310jVQiqVxE6Nh4yEABbYNVOfUC/DuMtp5/JAb+cz1nNLfA45KgaJ73UCPbimVszUH0Cb7RouC/zv1uB84w==", - "dependencies": { - "@aws-sdk/signature-v4-multi-region": "3.716.0", - "@aws-sdk/types": "3.714.0", - "@aws-sdk/util-format-url": "3.714.0", - "@smithy/middleware-endpoint": "^3.2.6", - "@smithy/protocol-http": "^4.1.8", - "@smithy/smithy-client": "^3.5.1", - "@smithy/types": "^3.7.2", + "version": "3.735.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.735.0.tgz", + "integrity": "sha512-PzfS4rWDLlp22NORWmezA8ZH6uwz7fAmYfdIbWsPKoy1Rpm+/6Kqn7Nx+Taz6UKNhGPtexutCoJqsMxCy0ZmxQ==", + "dependencies": { + "@aws-sdk/signature-v4-multi-region": "3.734.0", + "@aws-sdk/types": "3.734.0", + "@aws-sdk/util-format-url": "3.734.0", + "@smithy/middleware-endpoint": "^4.0.2", + "@smithy/protocol-http": "^5.0.1", + "@smithy/smithy-client": "^4.1.2", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/signature-v4-multi-region": { - "version": "3.716.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.716.0.tgz", - "integrity": "sha512-k0goWotZKKz+kV6Ln0qeAMSeSVi4NipuIIz5R8A0uCF2zBK4CXWdZR7KeaIoLBhJwQnHj1UU7E+2MK74KIUBzA==", - "dependencies": { - "@aws-sdk/middleware-sdk-s3": "3.716.0", - "@aws-sdk/types": "3.714.0", - "@smithy/protocol-http": "^4.1.8", - "@smithy/signature-v4": "^4.2.4", - "@smithy/types": "^3.7.2", + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.734.0.tgz", + "integrity": "sha512-GSRP8UH30RIYkcpPILV4pWrKFjRmmNjtUd41HTKWde5GbjJvNYpxqFXw2aIJHjKTw/js3XEtGSNeTaQMVVt3CQ==", + "dependencies": { + "@aws-sdk/middleware-sdk-s3": "3.734.0", + "@aws-sdk/types": "3.734.0", + "@smithy/protocol-http": "^5.0.1", + "@smithy/signature-v4": "^5.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.714.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.714.0.tgz", - "integrity": "sha512-vKN064aLE3kl+Zl16Ony3jltHnMddMBT7JRkP1L+lLywhA0PcAKxpdvComul/sTBWnbnwLnaS5NsDUhcWySH8A==", - "dependencies": { - "@aws-sdk/types": "3.714.0", - "@smithy/property-provider": "^3.1.11", - "@smithy/shared-ini-file-loader": "^3.1.12", - "@smithy/types": "^3.7.2", + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.734.0.tgz", + "integrity": "sha512-2U6yWKrjWjZO8Y5SHQxkFvMVWHQWbS0ufqfAIBROqmIZNubOL7jXCiVdEFekz6MZ9LF2tvYGnOW4jX8OKDGfIw==", + "dependencies": { + "@aws-sdk/nested-clients": "3.734.0", + "@aws-sdk/types": "3.734.0", + "@smithy/property-provider": "^4.0.1", + "@smithy/shared-ini-file-loader": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sso-oidc": "^3.714.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/types": { - "version": "3.714.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.714.0.tgz", - "integrity": "sha512-ZjpP2gYbSFlxxaUDa1Il5AVvfggvUPbjzzB/l3q0gIE5Thd6xKW+yzEpt2mLZ5s5UaYSABZbF94g8NUOF4CVGA==", + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.734.0.tgz", + "integrity": "sha512-o11tSPTT70nAkGV1fN9wm/hAIiLPyWX6SuGf+9JyTp7S/rC2cFWhR26MvA69nplcjNaXVzB0f+QFrLXXjOqCrg==", "dependencies": { - "@smithy/types": "^3.7.2", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/util-arn-parser": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.693.0.tgz", - "integrity": "sha512-WC8x6ca+NRrtpAH64rWu+ryDZI3HuLwlEr8EU6/dbC/pt+r/zC0PBoC15VEygUaBA+isppCikQpGyEDu0Yj7gQ==", + "version": "3.723.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.723.0.tgz", + "integrity": "sha512-ZhEfvUwNliOQROcAk34WJWVYTlTa4694kSVhDSjW6lE1bMataPnIN8A0ycukEzBXmd8ZSoBcQLn6lKGl7XIJ5w==", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/util-endpoints": { - "version": "3.714.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.714.0.tgz", - "integrity": "sha512-Xv+Z2lhe7w7ZZRsgBwBMZgGTVmS+dkkj2S13uNHAx9lhB5ovM8PhK5G/j28xYf6vIibeuHkRAbb7/ozdZIGR+A==", + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.734.0.tgz", + "integrity": "sha512-w2+/E88NUbqql6uCVAsmMxDQKu7vsKV0KqhlQb0lL+RCq4zy07yXYptVNs13qrnuTfyX7uPXkXrlugvK9R1Ucg==", "dependencies": { - "@aws-sdk/types": "3.714.0", - "@smithy/types": "^3.7.2", - "@smithy/util-endpoints": "^2.1.7", + "@aws-sdk/types": "3.734.0", + "@smithy/types": "^4.1.0", + "@smithy/util-endpoints": "^3.0.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/util-format-url": { - "version": "3.714.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-format-url/-/util-format-url-3.714.0.tgz", - "integrity": "sha512-PA/ES6BeKmYzFOsZ3az/8MqSLf6uzXAS7GsYONZMF6YASn4ewd/AspuvQMp6+x9VreAPCq7PecF+XL9KXejtPg==", + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-format-url/-/util-format-url-3.734.0.tgz", + "integrity": "sha512-TxZMVm8V4aR/QkW9/NhujvYpPZjUYqzLwSge5imKZbWFR806NP7RMwc5ilVuHF/bMOln/cVHkl42kATElWBvNw==", "dependencies": { - "@aws-sdk/types": "3.714.0", - "@smithy/querystring-builder": "^3.0.11", - "@smithy/types": "^3.7.2", + "@aws-sdk/types": "3.734.0", + "@smithy/querystring-builder": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/util-locate-window": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.693.0.tgz", - "integrity": "sha512-ttrag6haJLWABhLqtg1Uf+4LgHWIMOVSYL+VYZmAp2v4PUGOwWmWQH0Zk8RM7YuQcLfH/EoR72/Yxz6A4FKcuw==", + "version": "3.723.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.723.0.tgz", + "integrity": "sha512-Yf2CS10BqK688DRsrKI/EO6B8ff5J86NXe4C+VCysK7UOgN0l1zOTeTukZ3H8Q9tYYX3oaF1961o8vRkFm7Nmw==", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.714.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.714.0.tgz", - "integrity": "sha512-OdJJ03cP9/MgIVToPJPCPUImbpZzTcwdIgbXC0tUQPJhbD7b7cB4LdnkhNHko+MptpOrCq4CPY/33EpOjRdofw==", + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.734.0.tgz", + "integrity": "sha512-xQTCus6Q9LwUuALW+S76OL0jcWtMOVu14q+GoLnWPUM7QeUw963oQcLhF7oq0CtaLLKyl4GOUfcwc773Zmwwng==", "dependencies": { - "@aws-sdk/types": "3.714.0", - "@smithy/types": "^3.7.2", + "@aws-sdk/types": "3.734.0", + "@smithy/types": "^4.1.0", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.716.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.716.0.tgz", - "integrity": "sha512-3PqaXmQbxrtHKAsPCdp7kn5FrQktj8j3YyuNsqFZ8rWZeEQ88GWlsvE61PTsr2peYCKzpFqYVddef2x1axHU0w==", - "dependencies": { - "@aws-sdk/middleware-user-agent": "3.716.0", - "@aws-sdk/types": "3.714.0", - "@smithy/node-config-provider": "^3.1.12", - "@smithy/types": "^3.7.2", + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.734.0.tgz", + "integrity": "sha512-c6Iinh+RVQKs6jYUFQ64htOU2HUXFQ3TVx+8Tu3EDF19+9vzWi9UukhIMH9rqyyEXIAkk9XL7avt8y2Uyw2dGA==", + "dependencies": { + "@aws-sdk/middleware-user-agent": "3.734.0", + "@aws-sdk/types": "3.734.0", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" }, "peerDependencies": { "aws-crt": ">=1.0.0" @@ -1188,15 +1142,15 @@ } }, "node_modules/@aws-sdk/xml-builder": { - "version": "3.709.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.709.0.tgz", - "integrity": "sha512-2GPCwlNxeHspoK/Mc8nbk9cBOkSpp3j2SJUQmFnyQK6V/pR6II2oPRyZkMomug1Rc10hqlBHByMecq4zhV2uUw==", + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.734.0.tgz", + "integrity": "sha512-Zrjxi5qwGEcUsJ0ru7fRtW74WcTS0rbLcehoFB+rN1GRi2hbLcFaYs4PwVA5diLeAJH0gszv3x4Hr/S87MfbKQ==", "dependencies": { - "@smithy/types": "^3.7.2", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@babel/code-frame": { @@ -1213,30 +1167,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.3.tgz", - "integrity": "sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.5.tgz", + "integrity": "sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", - "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.7.tgz", + "integrity": "sha512-SRijHmF0PSPgLIBYlWnG0hyeJLwXE2CgpsXaMOrtt2yp9/86ALw6oUlj9KYuZ0JN07T4eBMVIW4li/9S1j2BGA==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.26.0", - "@babel/generator": "^7.26.0", - "@babel/helper-compilation-targets": "^7.25.9", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.5", + "@babel/helper-compilation-targets": "^7.26.5", "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.0", - "@babel/parser": "^7.26.0", + "@babel/helpers": "^7.26.7", + "@babel/parser": "^7.26.7", "@babel/template": "^7.25.9", - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.26.0", + "@babel/traverse": "^7.26.7", + "@babel/types": "^7.26.7", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -1258,13 +1212,13 @@ "dev": true }, "node_modules/@babel/generator": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz", - "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.5.tgz", + "integrity": "sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==", "dev": true, "dependencies": { - "@babel/parser": "^7.26.3", - "@babel/types": "^7.26.3", + "@babel/parser": "^7.26.5", + "@babel/types": "^7.26.5", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -1274,12 +1228,12 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", - "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", + "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.25.9", + "@babel/compat-data": "^7.26.5", "@babel/helper-validator-option": "^7.25.9", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", @@ -1335,9 +1289,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", - "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", "dev": true, "engines": { "node": ">=6.9.0" @@ -1370,25 +1324,25 @@ } }, "node_modules/@babel/helpers": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", - "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.7.tgz", + "integrity": "sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A==", "dev": true, "dependencies": { "@babel/template": "^7.25.9", - "@babel/types": "^7.26.0" + "@babel/types": "^7.26.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz", - "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.7.tgz", + "integrity": "sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w==", "dev": true, "dependencies": { - "@babel/types": "^7.26.3" + "@babel/types": "^7.26.7" }, "bin": { "parser": "bin/babel-parser.js" @@ -1619,16 +1573,16 @@ } }, "node_modules/@babel/traverse": { - "version": "7.26.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.4.tgz", - "integrity": "sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.7.tgz", + "integrity": "sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA==", "dev": true, "dependencies": { "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.3", - "@babel/parser": "^7.26.3", + "@babel/generator": "^7.26.5", + "@babel/parser": "^7.26.7", "@babel/template": "^7.25.9", - "@babel/types": "^7.26.3", + "@babel/types": "^7.26.7", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -1646,9 +1600,9 @@ } }, "node_modules/@babel/types": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", - "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.7.tgz", + "integrity": "sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.25.9", @@ -1961,6 +1915,111 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "node_modules/@csstools/color-helpers": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.0.1.tgz", + "integrity": "sha512-MKtmkA0BX87PKaO1NFRTFH+UnkgnmySQOvNxJubsadusqPEC2aJ9MOQiMceZJJ6oitUl/i0L6u0M1IrmAOmgBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/css-calc": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.1.tgz", + "integrity": "sha512-rL7kaUnTkL9K+Cvo2pnCieqNpTKgQzy5f+N+5Iuko9HAoasP+xgprVh7KN/MaJVvVL1l0EzQq2MoqBHKSrDrag==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.7.tgz", + "integrity": "sha512-nkMp2mTICw32uE5NN+EsJ4f5N+IGFeCFu4bGpiKgb2Pq/7J/MpyLBeQ5ry4KKtRFZaYs6sTmcMYrSRIyj5DFKA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/color-helpers": "^5.0.1", + "@csstools/css-calc": "^2.1.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.4.tgz", + "integrity": "sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.3.tgz", + "integrity": "sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@dabh/diagnostics": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", @@ -2242,11 +2301,11 @@ "integrity": "sha512-JPgcXKCuO+CWqGDnigBtvo09HeBs5u/Ktc2GaFj2m01hLarbxthLNm7Fk8iOP1aqAtXV+fnnGj7U28xmk7IwVA==" }, "node_modules/@firebase/component": { - "version": "0.6.11", - "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.11.tgz", - "integrity": "sha512-eQbeCgPukLgsKD0Kw5wQgsMDX5LeoI1MIrziNDjmc6XDq5ZQnuUymANQgAb2wp1tSF9zDSXyxJmIUXaKgN58Ug==", + "version": "0.6.12", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.12.tgz", + "integrity": "sha512-YnxqjtohLbnb7raXt2YuA44cC1wA9GiehM/cmxrsoxKlFxBLy2V0OkRSj9gpngAE0UoJ421Wlav9ycO7lTPAUw==", "dependencies": { - "@firebase/util": "1.10.2", + "@firebase/util": "1.10.3", "tslib": "^2.1.0" }, "engines": { @@ -2254,15 +2313,15 @@ } }, "node_modules/@firebase/database": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/@firebase/database/-/database-1.0.10.tgz", - "integrity": "sha512-sWp2g92u7xT4BojGbTXZ80iaSIaL6GAL0pwvM0CO/hb0nHSnABAqsH7AhnWGsGvXuEvbPr7blZylPaR9J+GSuQ==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@firebase/database/-/database-1.0.11.tgz", + "integrity": "sha512-gLrw/XeioswWUXgpVKCPAzzoOuvYNqK5fRUeiJTzO7Mlp9P6ylFEyPJlRBl1djqYye641r3MX6AmIeMXwjgwuQ==", "dependencies": { "@firebase/app-check-interop-types": "0.3.3", "@firebase/auth-interop-types": "0.2.4", - "@firebase/component": "0.6.11", + "@firebase/component": "0.6.12", "@firebase/logger": "0.4.4", - "@firebase/util": "1.10.2", + "@firebase/util": "1.10.3", "faye-websocket": "0.11.4", "tslib": "^2.1.0" }, @@ -2271,15 +2330,15 @@ } }, "node_modules/@firebase/database-compat": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-2.0.1.tgz", - "integrity": "sha512-IsFivOjdE1GrjTeKoBU/ZMenESKDXidFDzZzHBPQ/4P20ptGdrl3oLlWrV/QJqJ9lND4IidE3z4Xr5JyfUW1vg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-2.0.2.tgz", + "integrity": "sha512-5zvdnMsfDHvrQAVM6jBS7CkBpu+z3YbpFdhxRsrK1FP45IEfxlzpeuEUb17D/tpM10vfq4Ok0x5akIBaCv7gfA==", "dependencies": { - "@firebase/component": "0.6.11", - "@firebase/database": "1.0.10", - "@firebase/database-types": "1.0.7", + "@firebase/component": "0.6.12", + "@firebase/database": "1.0.11", + "@firebase/database-types": "1.0.8", "@firebase/logger": "0.4.4", - "@firebase/util": "1.10.2", + "@firebase/util": "1.10.3", "tslib": "^2.1.0" }, "engines": { @@ -2287,12 +2346,12 @@ } }, "node_modules/@firebase/database-types": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.7.tgz", - "integrity": "sha512-I7zcLfJXrM0WM+ksFmFdAMdlq/DFmpeMNa+/GNsLyFo5u/lX5zzkPzGe3srVWqaBQBY5KprylDGxOsP6ETfL0A==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.8.tgz", + "integrity": "sha512-6lPWIGeufhUq1heofZULyVvWFhD01TUrkkB9vyhmksjZ4XF7NaivQp9rICMk7QNhqwa+uDCaj4j+Q8qqcSVZ9g==", "dependencies": { "@firebase/app-types": "0.9.3", - "@firebase/util": "1.10.2" + "@firebase/util": "1.10.3" } }, "node_modules/@firebase/logger": { @@ -2307,9 +2366,9 @@ } }, "node_modules/@firebase/util": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.10.2.tgz", - "integrity": "sha512-qnSHIoE9FK+HYnNhTI8q14evyqbc/vHRivfB4TgCIUOl4tosmKSQlp7ltymOlMP4xVIJTg5wrkfcZ60X4nUf7Q==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.10.3.tgz", + "integrity": "sha512-wfoF5LTy0m2ufUapV0ZnpcGQvuavTbJ5Qr1Ze9OJGL70cSMvhDyjS4w2121XdA3lGZSTOsDOyGhpoDtYwck85A==", "dependencies": { "tslib": "^2.1.0" }, @@ -2370,9 +2429,9 @@ } }, "node_modules/@google-cloud/storage": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-7.14.0.tgz", - "integrity": "sha512-H41bPL2cMfSi4EEnFzKvg7XSb7T67ocSXrmF7MPjfgFB0L6CKGzfIYJheAZi1iqXjz6XaCT1OBf6HCG5vDBTOQ==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-7.15.0.tgz", + "integrity": "sha512-/j/+8DFuEOo33fbdX0V5wjooOoFahEaMEdImHBmM2tH9MPHJYNtmXOf2sGUmZmiufSukmBEvdlzYgDkkgeBiVQ==", "optional": true, "dependencies": { "@google-cloud/paginator": "^5.0.0", @@ -2639,9 +2698,9 @@ } }, "node_modules/@hapi/podium": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@hapi/podium/-/podium-5.0.1.tgz", - "integrity": "sha512-eznFTw6rdBhAijXFIlBOMJJd+lXTvqbrBIS4Iu80r2KTVIo4g+7fLy4NKp/8+UnSt5Ox6mJtAlKBU/Sf5080TQ==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@hapi/podium/-/podium-5.0.2.tgz", + "integrity": "sha512-T7gf2JYHQQfEfewTQFbsaXoZxSvuXO/QBIGljucUQ/lmPnTTNAepoIKOakWNVWvo2fMEDjycu77r8k6dhreqHA==", "dev": true, "dependencies": { "@hapi/hoek": "^11.0.2", @@ -4296,9 +4355,9 @@ } }, "node_modules/@lerna/create/node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", + "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", "dev": true, "dependencies": { "graceful-fs": "^4.2.0", @@ -4341,6 +4400,59 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@lerna/create/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@lerna/create/node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@lerna/create/node_modules/glob/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@lerna/create/node_modules/glob/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/@lerna/create/node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -4430,6 +4542,21 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, + "node_modules/@lerna/create/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/@lerna/create/node_modules/lru-cache": { "version": "7.18.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", @@ -4648,6 +4775,28 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/@lerna/create/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@lerna/create/node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true + }, "node_modules/@lerna/create/node_modules/proc-log": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", @@ -4893,18 +5042,18 @@ } }, "node_modules/@loopback/boot": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@loopback/boot/-/boot-7.0.9.tgz", - "integrity": "sha512-ccsTFxEfUxoHbfZCMsb0uUDhQbW1yEzUMHskdi4cTxFPEIvl2zvic8gA/GsTuypbo8joqxS6o0jHyHR9jETtzQ==", + "version": "7.0.10", + "resolved": "https://registry.npmjs.org/@loopback/boot/-/boot-7.0.10.tgz", + "integrity": "sha512-VasJ2zSc10w6l4pwXRqzT/pdX2t0xKRB6pRDjCle7j4CuVTkcV83yc6ek5BP1Zs9TV7yY6yEB+Fa7xuvrhUX7Q==", "dependencies": { - "@loopback/model-api-builder": "^6.0.9", - "@loopback/repository": "^7.0.9", - "@loopback/service-proxy": "^7.0.9", + "@loopback/model-api-builder": "^6.0.10", + "@loopback/repository": "^7.0.10", + "@loopback/service-proxy": "^7.0.10", "@types/debug": "^4.1.12", "@types/glob": "^8.1.0", "debug": "^4.4.0", - "glob": "^10.4.5", - "tslib": "^2.6.3" + "glob": "^11.0.1", + "tslib": "^2.8.1" }, "engines": { "node": "18 || 20 || 22" @@ -4914,23 +5063,23 @@ } }, "node_modules/@loopback/build": { - "version": "11.0.8", - "resolved": "https://registry.npmjs.org/@loopback/build/-/build-11.0.8.tgz", - "integrity": "sha512-aFR2mTj1jnK9OynxEoiGkAr+kHYhraHLPBVYOHYP5G83/DD/Ji6rAxXmCmXt4xb71Yk2nG34u+whyNcAFZNQfA==", + "version": "11.0.9", + "resolved": "https://registry.npmjs.org/@loopback/build/-/build-11.0.9.tgz", + "integrity": "sha512-3TcMPpoJJvtABHTN0UXGoyC9KKd7aXSUe4offMptHAs94c1X5bHOpwy9QMP139qQEL/KA9hZC/WaM+KfOBnneQ==", "dev": true, "dependencies": { - "@loopback/eslint-config": "^15.0.4", + "@loopback/eslint-config": "^15.0.5", "@types/mocha": "^10.0.10", - "@types/node": "^16.18.119", + "@types/node": "^16.18.123", "cross-spawn": "^7.0.6", "debug": "^4.4.0", - "eslint": "^8.57.0", + "eslint": "^8.57.1", "fs-extra": "^11.2.0", - "glob": "^10.4.5", + "glob": "^11.0.1", "lodash": "^4.17.21", - "mocha": "^10.8.2", + "mocha": "^11.0.1", "nyc": "^17.1.0", - "prettier": "^3.3.2", + "prettier": "^3.4.2", "rimraf": "^5.0.10", "source-map-support": "^0.5.21", "typescript": "~5.2.2" @@ -4949,26 +5098,15 @@ } }, "node_modules/@loopback/build/node_modules/@types/node": { - "version": "16.18.122", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.122.tgz", - "integrity": "sha512-rF6rUBS80n4oK16EW8nE75U+9fw0SSUgoPtWSvHhPXdT7itbvmS7UjB/jyM8i3AkvI6yeSM5qCwo+xN0npGDHg==", + "version": "16.18.125", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.125.tgz", + "integrity": "sha512-w7U5ojboSPfZP4zD98d+/cjcN2BDW6lKH2M0ubipt8L8vUC7qUAC6ENKGSJL4tEktH2Saw2K4y1uwSjyRGKMhw==", "dev": true }, - "node_modules/@loopback/build/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, "node_modules/@loopback/build/node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", + "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", "dev": true, "dependencies": { "graceful-fs": "^4.2.0", @@ -4979,73 +5117,6 @@ "node": ">=14.14" } }, - "node_modules/@loopback/build/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@loopback/build/node_modules/mocha": { - "version": "10.8.2", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.8.2.tgz", - "integrity": "sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==", - "dev": true, - "dependencies": { - "ansi-colors": "^4.1.3", - "browser-stdout": "^1.3.1", - "chokidar": "^3.5.3", - "debug": "^4.3.5", - "diff": "^5.2.0", - "escape-string-regexp": "^4.0.0", - "find-up": "^5.0.0", - "glob": "^8.1.0", - "he": "^1.2.0", - "js-yaml": "^4.1.0", - "log-symbols": "^4.1.0", - "minimatch": "^5.1.6", - "ms": "^2.1.3", - "serialize-javascript": "^6.0.2", - "strip-json-comments": "^3.1.1", - "supports-color": "^8.1.1", - "workerpool": "^6.5.1", - "yargs": "^16.2.0", - "yargs-parser": "^20.2.9", - "yargs-unparser": "^2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha.js" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@loopback/build/node_modules/mocha/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@loopback/build/node_modules/typescript": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", @@ -5059,33 +5130,6 @@ "node": ">=14.17" } }, - "node_modules/@loopback/build/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@loopback/build/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/@loopback/cli": { "version": "5.2.4", "resolved": "https://registry.npmjs.org/@loopback/cli/-/cli-5.2.4.tgz", @@ -5181,9 +5225,9 @@ } }, "node_modules/@loopback/cli/node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", + "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -5193,6 +5237,62 @@ "node": ">=14.14" } }, + "node_modules/@loopback/cli/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@loopback/cli/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/@loopback/cli/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/@loopback/cli/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@loopback/cli/node_modules/ts-morph": { "version": "20.0.0", "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-20.0.0.tgz", @@ -5215,16 +5315,16 @@ } }, "node_modules/@loopback/context": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@loopback/context/-/context-7.0.9.tgz", - "integrity": "sha512-NDCNDRO/PaHBGASG/Q+upO+nYbPpabpyzQylLSpk0Ic06oAcyB4mXeUYoxLWIZf9f3F/CMQSvxZz+Zjr2Lvkbg==", + "version": "7.0.10", + "resolved": "https://registry.npmjs.org/@loopback/context/-/context-7.0.10.tgz", + "integrity": "sha512-3gwjtJk0D2JeMTRzHyyMKwtaQGHa6UlN55Ms7WPjwYKOkhEyeMTTLBYnVtL/J7VoY91lBEcB7CXXAfj6JEHpyQ==", "dependencies": { - "@loopback/metadata": "^7.0.9", + "@loopback/metadata": "^7.0.10", "@types/debug": "^4.1.12", "debug": "^4.4.0", "hyperid": "^3.3.0", "p-event": "^4.2.0", - "tslib": "^2.6.3", + "tslib": "^2.8.1", "uuid": "^10.0.0" }, "engines": { @@ -5244,35 +5344,35 @@ } }, "node_modules/@loopback/core": { - "version": "6.1.6", - "resolved": "https://registry.npmjs.org/@loopback/core/-/core-6.1.6.tgz", - "integrity": "sha512-i4jKlv6O9avq5x3YSCYNUs2bRzrKZdb9svlIggRhGwokbeUuKvZ4D2n+PjpWFQbTM2j6OHi0ENg7UUdXiGOoqg==", + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/@loopback/core/-/core-6.1.7.tgz", + "integrity": "sha512-OlN3dszhLaihAjJ9U3GAxHo4a7a2VbT/h/majoxJhWG5MH8918CUbegYY2ZQ3F8bb/X9ATXShcLaKGAECV7aZg==", "dependencies": { - "@loopback/context": "^7.0.9", + "@loopback/context": "^7.0.10", "debug": "^4.4.0", - "tslib": "^2.6.3" + "tslib": "^2.8.1" }, "engines": { "node": "18 || 20 || 22" } }, "node_modules/@loopback/eslint-config": { - "version": "15.0.4", - "resolved": "https://registry.npmjs.org/@loopback/eslint-config/-/eslint-config-15.0.4.tgz", - "integrity": "sha512-ZmCd/2qoSQrKzvM4pBmSJJ1KAecVvFFimGQjZgafmxe7J5Jfb1bamLoDYMcMI1DmKCRxd77nweX1PJHC4AmGtg==", + "version": "15.0.5", + "resolved": "https://registry.npmjs.org/@loopback/eslint-config/-/eslint-config-15.0.5.tgz", + "integrity": "sha512-0YLaUx3sqjVKGlsmzZ5wkkDX38bOVIAzs8byygCYwLWQnZXehJ/aTrJ/b7/uPyCDllwY/0lTy67HhJqWOSNjRQ==", "dev": true, "dependencies": { - "@typescript-eslint/eslint-plugin": "^7.16.0", - "@typescript-eslint/parser": "^7.16.0", + "@typescript-eslint/eslint-plugin": "^7.18.0", + "@typescript-eslint/parser": "^7.18.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-eslint-plugin": "^5.5.1", - "eslint-plugin-mocha": "^10.4.3" + "eslint-plugin-mocha": "^10.5.0" }, "engines": { "node": "18 || 20 || 22" }, "peerDependencies": { - "eslint": "^8.57.0" + "eslint": "^8.57.1" } }, "node_modules/@loopback/eslint-config/node_modules/@typescript-eslint/eslint-plugin": { @@ -5481,11 +5581,11 @@ } }, "node_modules/@loopback/express": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@loopback/express/-/express-7.0.9.tgz", - "integrity": "sha512-S0jXDe0xhRHN5ATLuVIE4292+e/ZyUhZH9i79gDxJDinlj/ltJOpyA2rwkI9HaKJ6DLGH0dG4FJgv7dxgUdU3w==", + "version": "7.0.10", + "resolved": "https://registry.npmjs.org/@loopback/express/-/express-7.0.10.tgz", + "integrity": "sha512-NSHF41PmkrMWAh19F62M4Lf+qb6ILmBbFNaTHhnGnyX983D+as3Fp7hIN3/DpkEcUvHkzxpp8ODWIXdwm8pMlw==", "dependencies": { - "@loopback/http-server": "^6.0.9", + "@loopback/http-server": "^6.0.10", "@types/body-parser": "^1.19.5", "@types/express": "^4.17.21", "@types/express-serve-static-core": "^4.17.37", @@ -5496,7 +5596,7 @@ "http-errors": "^2.0.0", "on-finished": "^2.4.1", "toposort": "^2.0.2", - "tslib": "^2.6.3" + "tslib": "^2.8.1" }, "engines": { "node": "18 || 20 || 22" @@ -5506,38 +5606,38 @@ } }, "node_modules/@loopback/filter": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/@loopback/filter/-/filter-5.0.8.tgz", - "integrity": "sha512-WqHXTuMuR/tZzP8wcdMi9qrIF6dSoRGpq5Vqvu7CUFQUludbTJfvf5ol4x1yL5QmrrGEb+hyGx6DATexhsKJxw==", + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@loopback/filter/-/filter-5.0.9.tgz", + "integrity": "sha512-6Tzpixb3AczmpnxN4etChYmpB8Ihx7yuROrfRu2HzY369Hyvjd0KLYWQ+8oIkHka4wzkBh+CKcfBrJV4bPcaDg==", "dependencies": { - "tslib": "^2.6.3" + "tslib": "^2.8.1" }, "engines": { "node": "18 || 20 || 22" } }, "node_modules/@loopback/http-server": { - "version": "6.0.9", - "resolved": "https://registry.npmjs.org/@loopback/http-server/-/http-server-6.0.9.tgz", - "integrity": "sha512-LZlCqARGRzxpyY1R8uNFRKqRtavW3WZyuIU89QYomCp/UfckrXOzkdQe54/dWdwOkNrCibxSY1Nd6XJlM668Bw==", + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/@loopback/http-server/-/http-server-6.0.10.tgz", + "integrity": "sha512-vaf0XZxX2p/iKj24UgHbHeDwqBm640uq5VzDeTI+Yy83H188ZZ2fhhsEXjuECLzlQoqVzaxGZdMY+DQnkS+4iQ==", "dependencies": { "debug": "^4.4.0", "stoppable": "^1.1.0", - "tslib": "^2.6.3" + "tslib": "^2.8.1" }, "engines": { "node": "18 || 20 || 22" } }, "node_modules/@loopback/metadata": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@loopback/metadata/-/metadata-7.0.9.tgz", - "integrity": "sha512-5NmEnsGNQIBQ4ha+smH3QT6S6Y82NSA77A/xOo0zP5UTG8MexZZB3fZXXMpn/xj6qR/o7qwkD+DASN6abm91pA==", + "version": "7.0.10", + "resolved": "https://registry.npmjs.org/@loopback/metadata/-/metadata-7.0.10.tgz", + "integrity": "sha512-1mgN7k56NCyZVY1kpX7DbrDOYN4AQNqQ9lkhz+o42pprSgX2oBzqRZ5T+xPp6liAEvW9CLLxRunVRHOUQbukiw==", "dependencies": { "debug": "^4.4.0", "lodash": "^4.17.21", "reflect-metadata": "^0.2.1", - "tslib": "^2.6.3" + "tslib": "^2.8.1" }, "engines": { "node": "18 || 20 || 22" @@ -5549,11 +5649,11 @@ "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==" }, "node_modules/@loopback/model-api-builder": { - "version": "6.0.9", - "resolved": "https://registry.npmjs.org/@loopback/model-api-builder/-/model-api-builder-6.0.9.tgz", - "integrity": "sha512-ms9enF31IAu6spzb+Vv/avIYq5Um6JS9P62dZ+OoWVOoXlfAquNNJEGO29qh4VrMESJLpajzWWdxYqRJgnQ/3w==", + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/@loopback/model-api-builder/-/model-api-builder-6.0.10.tgz", + "integrity": "sha512-HgMnp+6AhK5WZUAEUHQ31WyfhOhdFpCemiGQxhlwDu4Cs4Yifg7FHHpAz+bYm3/23fKo9tq+9dY6hI5JuVW2lw==", "dependencies": { - "tslib": "^2.6.3" + "tslib": "^2.8.1" }, "engines": { "node": "18 || 20 || 22" @@ -5564,17 +5664,17 @@ } }, "node_modules/@loopback/openapi-v3": { - "version": "10.0.9", - "resolved": "https://registry.npmjs.org/@loopback/openapi-v3/-/openapi-v3-10.0.9.tgz", - "integrity": "sha512-T5QBlGRYNekjUj/sAFvbRnJatNfEspQg+Dv4rtHW/BMUrbKuzUqtaagypFW4CPDkvmTRKUinOGyVmibgAKfBug==", + "version": "10.0.10", + "resolved": "https://registry.npmjs.org/@loopback/openapi-v3/-/openapi-v3-10.0.10.tgz", + "integrity": "sha512-Qpsuc1YQ2IMiHN+Cg7WbKR0PuLFWf4RE3yrzD0SI8UsJQvr4yrlYGOYtToWPwkTezg2OD38PRB0WGB56lFiXtg==", "dependencies": { - "@loopback/repository-json-schema": "^8.0.9", + "@loopback/repository-json-schema": "^8.0.10", "debug": "^4.4.0", "http-status": "^1.8.1", "json-merge-patch": "^1.0.2", "lodash": "^4.17.21", "openapi3-ts": "^2.0.2", - "tslib": "^2.6.3" + "tslib": "^2.8.1" }, "engines": { "node": "18 || 20 || 22" @@ -5584,16 +5684,16 @@ } }, "node_modules/@loopback/repository": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@loopback/repository/-/repository-7.0.9.tgz", - "integrity": "sha512-I+sc5pSbThKCbCPnwKWLEyNcO97Er2HIEjK92BraFBXGvnEQ54TT7vSeXtaWhWahh02oXBtR2ecbY40HX11wHQ==", + "version": "7.0.10", + "resolved": "https://registry.npmjs.org/@loopback/repository/-/repository-7.0.10.tgz", + "integrity": "sha512-vkel6uR3aoNiJ5/U+EslPvck1OEFUHmMRyYkEodT2lDCirT803Tbne3b2uUjFBRR4dYouGOCaQIiFVSrpQN/XQ==", "dependencies": { - "@loopback/filter": "^5.0.8", + "@loopback/filter": "^5.0.9", "@types/debug": "^4.1.12", "debug": "^4.4.0", "lodash": "^4.17.21", - "loopback-datasource-juggler": "^5.1.3", - "tslib": "^2.6.3" + "loopback-datasource-juggler": "^5.1.4", + "tslib": "^2.8.1" }, "engines": { "node": "18 || 20 || 22" @@ -5603,13 +5703,13 @@ } }, "node_modules/@loopback/repository-json-schema": { - "version": "8.0.9", - "resolved": "https://registry.npmjs.org/@loopback/repository-json-schema/-/repository-json-schema-8.0.9.tgz", - "integrity": "sha512-kqDg05splhRsU2p3sYFPcMS5nrqcwSBjtqrtyodZwkn6rPj0VxVJV0qzRyNFFy7yO+m4KqbYnY6bep7tto18BA==", + "version": "8.0.10", + "resolved": "https://registry.npmjs.org/@loopback/repository-json-schema/-/repository-json-schema-8.0.10.tgz", + "integrity": "sha512-XG0Zt4xfGlEOzhUf7UIYf/ZeuzVpUaxzhf6w58TtLgnGo2Gpjo/jNBtQ7/vIDDjjB4A9EBsY0tMcwvKHZLAARA==", "dependencies": { "@types/json-schema": "^7.0.15", "debug": "^4.4.0", - "tslib": "^2.6.3" + "tslib": "^2.8.1" }, "engines": { "node": "18 || 20 || 22" @@ -5620,14 +5720,14 @@ } }, "node_modules/@loopback/repository-tests": { - "version": "0.24.9", - "resolved": "https://registry.npmjs.org/@loopback/repository-tests/-/repository-tests-0.24.9.tgz", - "integrity": "sha512-LIT/Q1wk781ai8O9u2uqYjorTS/DtjEqtPA/FXbRJiOhSvhdoNl4KwoLiMEbZfKVTV7YqgnDKsNzZ8d1izN7ZQ==", + "version": "0.24.10", + "resolved": "https://registry.npmjs.org/@loopback/repository-tests/-/repository-tests-0.24.10.tgz", + "integrity": "sha512-kn+CJdk8VMjVmQ/qNPhnVTJMyNnpVn+cB/muWTvOUjcRaRpucZeTnXm3wSo7Dxnpm1SuQMfKOazBcH9qoPu48Q==", "dependencies": { - "@loopback/testlab": "^7.0.8", + "@loopback/testlab": "^7.0.9", "@types/debug": "^4.1.12", "debug": "^4.4.0", - "tslib": "^2.6.3" + "tslib": "^2.8.1" }, "engines": { "node": "18 || 20 || 22" @@ -5638,13 +5738,13 @@ } }, "node_modules/@loopback/rest": { - "version": "14.0.9", - "resolved": "https://registry.npmjs.org/@loopback/rest/-/rest-14.0.9.tgz", - "integrity": "sha512-dKlXL7rXDnteiOfeS9802Ehj8sbKhr1nyJ0DiLgADQGRAH6o6rGn0/+I2nXwFCtxOFpqoLyyGCJhu1Ff5Jf3qA==", + "version": "14.0.10", + "resolved": "https://registry.npmjs.org/@loopback/rest/-/rest-14.0.10.tgz", + "integrity": "sha512-Ax3Dr0+Txg2Wi3p6FkM8nNQMrqH2PLUc+qCA1G6wlN+pEIF9oSkiNZI/PnSUk54zmAF+t8GdLT1zTqcHKHJFFA==", "dependencies": { - "@loopback/express": "^7.0.9", - "@loopback/http-server": "^6.0.9", - "@loopback/openapi-v3": "^10.0.9", + "@loopback/express": "^7.0.10", + "@loopback/http-server": "^6.0.10", + "@loopback/openapi-v3": "^10.0.10", "@openapi-contrib/openapi-schema-to-json-schema": "^5.1.0", "@types/body-parser": "^1.19.5", "@types/cors": "^2.8.17", @@ -5669,8 +5769,8 @@ "on-finished": "^2.4.1", "path-to-regexp": "^6.3.0", "qs": "^6.13.1", - "strong-error-handler": "^5.0.14", - "tslib": "^2.6.3", + "strong-error-handler": "^5.0.15", + "tslib": "^2.8.1", "type-is": "^1.6.18", "validator": "^13.12.0" }, @@ -5682,13 +5782,13 @@ } }, "node_modules/@loopback/rest-explorer": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@loopback/rest-explorer/-/rest-explorer-7.0.9.tgz", - "integrity": "sha512-ANJ0Rwl6zrQRoSTGARX/HLN5YroQFE6Z3aL9QCdNNbigclW/HGXrMmFESdet/EmextKqnFaBMluQ1haUQO8eWQ==", + "version": "7.0.10", + "resolved": "https://registry.npmjs.org/@loopback/rest-explorer/-/rest-explorer-7.0.10.tgz", + "integrity": "sha512-AiP4oRlqPiAdUxffivgTM+ZiRl6fB0eqavd3Ck69PRVze17uvFywcpWtRaOC4TxMbXjoqoaMvIkF36i7h7K5nA==", "dependencies": { "ejs": "^3.1.10", "swagger-ui-dist": "5.18.2", - "tslib": "^2.6.3" + "tslib": "^2.8.1" }, "engines": { "node": "18 || 20 || 22" @@ -5719,13 +5819,13 @@ } }, "node_modules/@loopback/sequelize": { - "version": "0.6.9", - "resolved": "https://registry.npmjs.org/@loopback/sequelize/-/sequelize-0.6.9.tgz", - "integrity": "sha512-xpGfaiRvMLWj6rLMSfe4XF+3bxTZ8CO+ihU9hxoOLLLnX9e32QzpLw7nMQk96ZVGf3sdNZwbdDGezrfX9A5xTQ==", + "version": "0.6.10", + "resolved": "https://registry.npmjs.org/@loopback/sequelize/-/sequelize-0.6.10.tgz", + "integrity": "sha512-AUTw5zRXUbWFskx6hOIWiTlXRxWUmRaufzuXlHa2G5Ge0HqdmORL8ec/UfB078+3wpbpzPbjXNcislbyPcum6Q==", "dependencies": { "debug": "^4.4.0", "sequelize": "^6.37.5", - "tslib": "^2.6.3" + "tslib": "^2.8.1" }, "engines": { "node": "18 || 20 || 22" @@ -5736,12 +5836,12 @@ } }, "node_modules/@loopback/service-proxy": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@loopback/service-proxy/-/service-proxy-7.0.9.tgz", - "integrity": "sha512-BMUilu8At5yrIVxPpkY12ay9iOatT1s8KIogZmctMONL8fvGTrEZTa/lUdOkH3rGP+i1YfoOXwCAgLugu3A/eA==", + "version": "7.0.10", + "resolved": "https://registry.npmjs.org/@loopback/service-proxy/-/service-proxy-7.0.10.tgz", + "integrity": "sha512-yO8CbAPqve9eJvQPIMaBIhYQWwQBQajIQ3h4azISNtdemqI5O+K9QUfGq6yZK0QUgKMI3wkyq1hqVj39cK5Ouw==", "dependencies": { - "loopback-datasource-juggler": "^5.1.3", - "tslib": "^2.6.3" + "loopback-datasource-juggler": "^5.1.4", + "tslib": "^2.8.1" }, "engines": { "node": "18 || 20 || 22" @@ -5751,9 +5851,9 @@ } }, "node_modules/@loopback/testlab": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/@loopback/testlab/-/testlab-7.0.8.tgz", - "integrity": "sha512-Xj6uRTwODOhE2dNjCp31Tq+b6tR5r22TCNNnc/O8g4qyklNYWZN6lxZkAswXJquUpOYUnbS5+eXwIUlseAoSNQ==", + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@loopback/testlab/-/testlab-7.0.9.tgz", + "integrity": "sha512-02OjJDFp6zXFjhWBHxVLyhoK8gBLQWbyx+faLPMhs6vpZ4SPpvhG43TuApqc8u7D5h5r09O/jMDjzCcNjUKibw==", "dependencies": { "@hapi/shot": "^6.0.1", "@types/express": "^4.17.21", @@ -5765,9 +5865,9 @@ "fs-extra": "^11.2.0", "oas-validator": "^5.0.8", "should": "^13.2.3", - "sinon": "^18.0.1", + "sinon": "^19.0.2", "supertest": "^7.0.0", - "tslib": "^2.6.3" + "tslib": "^2.8.1" }, "engines": { "node": "18 || 20 || 22" @@ -5782,11 +5882,11 @@ } }, "node_modules/@loopback/testlab/node_modules/@sinonjs/fake-timers": { - "version": "11.2.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-11.2.2.tgz", - "integrity": "sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw==", + "version": "13.0.5", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz", + "integrity": "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==", "dependencies": { - "@sinonjs/commons": "^3.0.0" + "@sinonjs/commons": "^3.0.1" } }, "node_modules/@loopback/testlab/node_modules/@types/sinon": { @@ -5797,6 +5897,14 @@ "@types/sinonjs__fake-timers": "*" } }, + "node_modules/@loopback/testlab/node_modules/diff": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", + "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==", + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/@loopback/testlab/node_modules/formidable": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.2.tgz", @@ -5811,9 +5919,9 @@ } }, "node_modules/@loopback/testlab/node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", + "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -5854,14 +5962,6 @@ "path-to-regexp": "^8.1.0" } }, - "node_modules/@loopback/testlab/node_modules/nise/node_modules/@sinonjs/fake-timers": { - "version": "13.0.5", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz", - "integrity": "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==", - "dependencies": { - "@sinonjs/commons": "^3.0.1" - } - }, "node_modules/@loopback/testlab/node_modules/path-to-regexp": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", @@ -5871,16 +5971,16 @@ } }, "node_modules/@loopback/testlab/node_modules/sinon": { - "version": "18.0.1", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-18.0.1.tgz", - "integrity": "sha512-a2N2TDY1uGviajJ6r4D1CyRAkzE9NNVlYOV1wX5xQDuAk0ONgzgRl0EjCQuRCPxOwp13ghsMwt9Gdldujs39qw==", + "version": "19.0.2", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-19.0.2.tgz", + "integrity": "sha512-euuToqM+PjO4UgXeLETsfQiuoyPXlqFezr6YZDFwHR3t4qaX0fZUe1MfPMznTL5f8BWrVS89KduLdMUsxFCO6g==", "dependencies": { "@sinonjs/commons": "^3.0.1", - "@sinonjs/fake-timers": "11.2.2", - "@sinonjs/samsam": "^8.0.0", - "diff": "^5.2.0", - "nise": "^6.0.0", - "supports-color": "^7" + "@sinonjs/fake-timers": "^13.0.2", + "@sinonjs/samsam": "^8.0.1", + "diff": "^7.0.0", + "nise": "^6.1.1", + "supports-color": "^7.2.0" }, "funding": { "type": "opencollective", @@ -6043,9 +6143,9 @@ "integrity": "sha512-xsgwcL7J7WhlHJ3RNbaVgssaIwcEyFkBqxHdcdaiJzwTZAWEOD8BuUFxnxV9k5S0qHN3v/KzUpq0IUpjH1seRg==" }, "node_modules/@messageformat/parser": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@messageformat/parser/-/parser-5.1.0.tgz", - "integrity": "sha512-jKlkls3Gewgw6qMjKZ9SFfHUpdzEVdovKFtW1qRhJ3WI4FW5R/NnGDqr8SDGz+krWDO3ki94boMmQvGke1HwUQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@messageformat/parser/-/parser-5.1.1.tgz", + "integrity": "sha512-3p0YRGCcTUCYvBKLIxtDDyrJ0YijGIwrTRu1DT8gIviIDZru8H23+FkY6MJBzM1n9n20CiM4VeDYuBsrrwnLjg==", "dependencies": { "moo": "^0.5.1" } @@ -6108,6 +6208,66 @@ } } }, + "node_modules/@nestjs/cli/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@nestjs/cli/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/@nestjs/cli/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/@nestjs/cli/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@nestjs/cli/node_modules/typescript": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", @@ -6192,11 +6352,11 @@ "integrity": "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==" }, "node_modules/@nestjs/mapped-types": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-2.0.6.tgz", - "integrity": "sha512-84ze+CPfp1OWdpRi1/lOu59hOhTz38eVzJvRKrg9ykRFwDz+XleKfMsG0gUqNZYFa6v53XYzeD+xItt8uDW7NQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-2.1.0.tgz", + "integrity": "sha512-W+n+rM69XsFdwORF11UqJahn4J3xi4g/ZEOlJNL6KoW5ygWSmBB2p0S2BZ4FQeS/NDH72e6xIcu35SfJnE8bXw==", "peerDependencies": { - "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0", + "@nestjs/common": "^10.0.0 || ^11.0.0", "class-transformer": "^0.4.0 || ^0.5.0", "class-validator": "^0.13.0 || ^0.14.0", "reflect-metadata": "^0.1.12 || ^0.2.0" @@ -6322,9 +6482,9 @@ "dev": true }, "node_modules/@nestjs/swagger": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@nestjs/swagger/-/swagger-8.1.0.tgz", - "integrity": "sha512-8hzH+r/31XshzXHC9vww4T0xjDAxMzvOaT1xAOvvY1LtXTWyNRCUP2iQsCYJOnnMrR+vydWjvRZiuB3hdvaHxA==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@nestjs/swagger/-/swagger-8.1.1.tgz", + "integrity": "sha512-5Mda7H1DKnhKtlsb0C7PYshcvILv8UFyUotHzxmWh0G65Z21R3LZH/J8wmpnlzL4bmXIfr42YwbEwRxgzpJ5sQ==", "dependencies": { "@microsoft/tsdoc": "^0.15.0", "@nestjs/mapped-types": "2.0.6", @@ -6353,6 +6513,25 @@ } } }, + "node_modules/@nestjs/swagger/node_modules/@nestjs/mapped-types": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-2.0.6.tgz", + "integrity": "sha512-84ze+CPfp1OWdpRi1/lOu59hOhTz38eVzJvRKrg9ykRFwDz+XleKfMsG0gUqNZYFa6v53XYzeD+xItt8uDW7NQ==", + "peerDependencies": { + "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0", + "class-transformer": "^0.4.0 || ^0.5.0", + "class-validator": "^0.13.0 || ^0.14.0", + "reflect-metadata": "^0.1.12 || ^0.2.0" + }, + "peerDependenciesMeta": { + "class-transformer": { + "optional": true + }, + "class-validator": { + "optional": true + } + } + }, "node_modules/@nestjs/swagger/node_modules/path-to-regexp": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz", @@ -7376,6 +7555,62 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/@npmcli/map-workspaces/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@npmcli/map-workspaces/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/@npmcli/map-workspaces/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/@npmcli/map-workspaces/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@npmcli/metavuln-calculator": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@npmcli/metavuln-calculator/-/metavuln-calculator-2.0.0.tgz", @@ -8038,6 +8273,62 @@ "node": "^16.14.0 || >=18.0.0" } }, + "node_modules/@npmcli/package-json/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@npmcli/package-json/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/@npmcli/package-json/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/@npmcli/package-json/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@npmcli/promise-spawn": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-7.0.2.tgz", @@ -9284,9 +9575,9 @@ } }, "node_modules/@opentelemetry/context-async-hooks": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.30.0.tgz", - "integrity": "sha512-roCetrG/cz0r/gugQm/jFo75UxblVvHaNSRoR0kSSRSzXFAiIBqFCZuH458BHBNRtRe+0yJdIJ21L9t94bw7+g==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.30.1.tgz", + "integrity": "sha512-s5vvxXPVdjqS3kTLKMeBMvop9hbWkwzBpu+mUO2M7sZtlkyDJGwFe33wRKnbaYDo8ExRVBIIdwIGrqpxHuKttA==", "engines": { "node": ">=14" }, @@ -9295,9 +9586,9 @@ } }, "node_modules/@opentelemetry/core": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.30.0.tgz", - "integrity": "sha512-Q/3u/K73KUjTCnFUP97ZY+pBjQ1kPEgjOfXj/bJl8zW7GbXdkw6cwuyZk6ZTXkVgCBsYRYUzx4fvYK1jxdb9MA==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.30.1.tgz", + "integrity": "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==", "dependencies": { "@opentelemetry/semantic-conventions": "1.28.0" }, @@ -9309,12 +9600,12 @@ } }, "node_modules/@opentelemetry/exporter-jaeger": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-jaeger/-/exporter-jaeger-1.30.0.tgz", - "integrity": "sha512-ovV16vnvx0h6dwsHaUnvLHrqkjmejeaUcbgtBPpR+gt65ZhdYso5dgDFkvzqvPnyclKU7muE6QBf+0xRMePJcw==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-jaeger/-/exporter-jaeger-1.30.1.tgz", + "integrity": "sha512-7Ki+x7cZ/PEQxp3UyB+CWkWBqLk22yRGQ4AWIGwZlEs6rpCOdWwIFOyQDO9DdeyWtTPTvO3An/7chPZcRHOgzQ==", "dependencies": { - "@opentelemetry/core": "1.30.0", - "@opentelemetry/sdk-trace-base": "1.30.0", + "@opentelemetry/core": "1.30.1", + "@opentelemetry/sdk-trace-base": "1.30.1", "@opentelemetry/semantic-conventions": "1.28.0", "jaeger-client": "^3.15.0" }, @@ -9518,11 +9809,11 @@ } }, "node_modules/@opentelemetry/propagator-b3": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.30.0.tgz", - "integrity": "sha512-lcobQQmd+hLdtxJJKu/i51lNXmF1PJJ7Y9B97ciHRVQuMI260vSZG7Uf4Zg0fqR8PB+fT/7rnlDwS0M7QldZQQ==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.30.1.tgz", + "integrity": "sha512-oATwWWDIJzybAZ4pO76ATN5N6FFbOA1otibAVlS8v90B4S1wClnhRUk7K+2CHAwN1JKYuj4jh/lpCEG5BAqFuQ==", "dependencies": { - "@opentelemetry/core": "1.30.0" + "@opentelemetry/core": "1.30.1" }, "engines": { "node": ">=14" @@ -9532,11 +9823,11 @@ } }, "node_modules/@opentelemetry/propagator-jaeger": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.30.0.tgz", - "integrity": "sha512-0hdP495V6HPRkVpowt54+Swn5NdesMIRof+rlp0mbnuIUOM986uF+eNxnPo9q5MmJegVBRTxgMHXXwvnXRnKRg==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.30.1.tgz", + "integrity": "sha512-Pj/BfnYEKIOImirH76M4hDaBSx6HyZ2CXUqk+Kj02m6BB80c/yo4BdWkn/1gDFfU+YPY+bPR2U0DKBfdxCKwmg==", "dependencies": { - "@opentelemetry/core": "1.30.0" + "@opentelemetry/core": "1.30.1" }, "engines": { "node": ">=14" @@ -9546,11 +9837,11 @@ } }, "node_modules/@opentelemetry/resources": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.30.0.tgz", - "integrity": "sha512-5mGMjL0Uld/99t7/pcd7CuVtJbkARckLVuiOX84nO8RtLtIz0/J6EOHM2TGvPZ6F4K+XjUq13gMx14w80SVCQg==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.30.1.tgz", + "integrity": "sha512-5UxZqiAgLYGFjS4s9qm5mBVo433u+dSPUFWVWXmLAD4wB65oMCoXaJP1KJa9DIYYMeHu3z4BZcStG3LC593cWA==", "dependencies": { - "@opentelemetry/core": "1.30.0", + "@opentelemetry/core": "1.30.1", "@opentelemetry/semantic-conventions": "1.28.0" }, "engines": { @@ -9561,12 +9852,12 @@ } }, "node_modules/@opentelemetry/sdk-trace-base": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.30.0.tgz", - "integrity": "sha512-RKQDaDIkV7PwizmHw+rE/FgfB2a6MBx+AEVVlAHXRG1YYxLiBpPX2KhmoB99R5vA4b72iJrjle68NDWnbrE9Dg==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.30.1.tgz", + "integrity": "sha512-jVPgBbH1gCy2Lb7X0AVQ8XAfgg0pJ4nvl8/IiQA6nxOsPvS+0zMJaFSs2ltXe0J6C8dqjcnpyqINDJmU30+uOg==", "dependencies": { - "@opentelemetry/core": "1.30.0", - "@opentelemetry/resources": "1.30.0", + "@opentelemetry/core": "1.30.1", + "@opentelemetry/resources": "1.30.1", "@opentelemetry/semantic-conventions": "1.28.0" }, "engines": { @@ -9577,15 +9868,15 @@ } }, "node_modules/@opentelemetry/sdk-trace-node": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.30.0.tgz", - "integrity": "sha512-MeXkXEdBs9xq1JSGTr/3P1lHBSUBaVmo1+UpoQhUpviPMzDXy0MNsdTC7KKI6/YcG74lTX6eqeNjlC1jV4Rstw==", - "dependencies": { - "@opentelemetry/context-async-hooks": "1.30.0", - "@opentelemetry/core": "1.30.0", - "@opentelemetry/propagator-b3": "1.30.0", - "@opentelemetry/propagator-jaeger": "1.30.0", - "@opentelemetry/sdk-trace-base": "1.30.0", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.30.1.tgz", + "integrity": "sha512-cBjYOINt1JxXdpw1e5MlHmFRc5fgj4GW/86vsKFxJCJ8AL4PdVtYH41gWwl4qd4uQjqEL1oJVrXkSy5cnduAnQ==", + "dependencies": { + "@opentelemetry/context-async-hooks": "1.30.1", + "@opentelemetry/core": "1.30.1", + "@opentelemetry/propagator-b3": "1.30.1", + "@opentelemetry/propagator-jaeger": "1.30.1", + "@opentelemetry/sdk-trace-base": "1.30.1", "semver": "^7.5.2" }, "engines": { @@ -10001,6 +10292,47 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/@sigstore/sign/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@sigstore/sign/node_modules/glob/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/@sigstore/sign/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/@sigstore/sign/node_modules/lru-cache": { "version": "7.18.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", @@ -10066,6 +10398,26 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/@sigstore/sign/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@sigstore/sign/node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, "node_modules/@sigstore/sign/node_modules/ssri": { "version": "10.0.6", "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz", @@ -10144,11 +10496,11 @@ } }, "node_modules/@sigstore/verify/node_modules/@sigstore/protobuf-specs": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.2.tgz", - "integrity": "sha512-c6B0ehIWxMI8wiS/bj6rHMPqeFvngFV7cDU/MY+B16P9Z3Mp9k8L93eYZ7BYzSickzuqAQqAq0V956b3Ju6mLw==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.3.tgz", + "integrity": "sha512-RpacQhBlwpBWd7KEJsRKcBQalbV28fvkxwTOJIqhIuDysMMaJW47V4OqW30iJB9uRpqOSxxEAQFdr8tTattReQ==", "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/@sinclair/typebox": { @@ -10224,272 +10576,293 @@ "integrity": "sha512-DE427ROAphMQzU4ENbliGYrBSYPXF+TtLg9S8vzeA+OF4ZKzoDdzfL8sxuMUGS/lgRhM6j1URSk9ghf7Xo1tyA==" }, "node_modules/@smithy/abort-controller": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.9.tgz", - "integrity": "sha512-yiW0WI30zj8ZKoSYNx90no7ugVn3khlyH/z5W8qtKBtVE6awRALbhSG+2SAHA1r6bO/6M9utxYKVZ3PCJ1rWxw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.1.tgz", + "integrity": "sha512-fiUIYgIgRjMWznk6iLJz35K2YxSLHzLBA/RC6lBrKfQ8fHbPfvk7Pk9UvpKoHgJjI18MnbPuEju53zcVy6KF1g==", "dependencies": { - "@smithy/types": "^3.7.2", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/chunked-blob-reader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-4.0.0.tgz", - "integrity": "sha512-jSqRnZvkT4egkq/7b6/QRCNXmmYVcHwnJldqJ3IhVpQE2atObVJ137xmGeuGFhjFUr8gCEVAOKwSY79OvpbDaQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-5.0.0.tgz", + "integrity": "sha512-+sKqDBQqb036hh4NPaUiEkYFkTUGYzRsn3EuFhyfQfMy6oGHEUJDurLP9Ufb5dasr/XiAmPNMr6wa9afjQB+Gw==", "dependencies": { "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@smithy/chunked-blob-reader-native": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-3.0.1.tgz", - "integrity": "sha512-VEYtPvh5rs/xlyqpm5NRnfYLZn+q0SRPELbvBV+C/G7IQ+ouTuo+NKKa3ShG5OaFR8NYVMXls9hPYLTvIKKDrQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-4.0.0.tgz", + "integrity": "sha512-R9wM2yPmfEMsUmlMlIgSzOyICs0x9uu7UTHoccMyt7BWw8shcGM8HqB355+BZCPBcySvbTYMs62EgEQkNxz2ig==", "dependencies": { - "@smithy/util-base64": "^3.0.0", + "@smithy/util-base64": "^4.0.0", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@smithy/config-resolver": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-3.0.13.tgz", - "integrity": "sha512-Gr/qwzyPaTL1tZcq8WQyHhTZREER5R1Wytmz4WnVGL4onA3dNk6Btll55c8Vr58pLdvWZmtG8oZxJTw3t3q7Jg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.0.1.tgz", + "integrity": "sha512-Igfg8lKu3dRVkTSEm98QpZUvKEOa71jDX4vKRcvJVyRc3UgN3j7vFMf0s7xLQhYmKa8kyJGQgUJDOV5V3neVlQ==", "dependencies": { - "@smithy/node-config-provider": "^3.1.12", - "@smithy/types": "^3.7.2", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.11", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/types": "^4.1.0", + "@smithy/util-config-provider": "^4.0.0", + "@smithy/util-middleware": "^4.0.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/core": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-2.5.5.tgz", - "integrity": "sha512-G8G/sDDhXA7o0bOvkc7bgai6POuSld/+XhNnWAbpQTpLv2OZPvyqQ58tLPPlz0bSNsXktldDDREIv1LczFeNEw==", - "dependencies": { - "@smithy/middleware-serde": "^3.0.11", - "@smithy/protocol-http": "^4.1.8", - "@smithy/types": "^3.7.2", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-middleware": "^3.0.11", - "@smithy/util-stream": "^3.3.2", - "@smithy/util-utf8": "^3.0.0", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.1.2.tgz", + "integrity": "sha512-htwQXkbdF13uwwDevz9BEzL5ABK+1sJpVQXywwGSH973AVOvisHNfpcB8A8761G6XgHoS2kHPqc9DqHJ2gp+/Q==", + "dependencies": { + "@smithy/middleware-serde": "^4.0.2", + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-middleware": "^4.0.1", + "@smithy/util-stream": "^4.0.2", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/credential-provider-imds": { - "version": "3.2.8", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-3.2.8.tgz", - "integrity": "sha512-ZCY2yD0BY+K9iMXkkbnjo+08T2h8/34oHd0Jmh6BZUSZwaaGlGCyBT/3wnS7u7Xl33/EEfN4B6nQr3Gx5bYxgw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.0.1.tgz", + "integrity": "sha512-l/qdInaDq1Zpznpmev/+52QomsJNZ3JkTl5yrTl02V6NBgJOQ4LY0SFw/8zsMwj3tLe8vqiIuwF6nxaEwgf6mg==", "dependencies": { - "@smithy/node-config-provider": "^3.1.12", - "@smithy/property-provider": "^3.1.11", - "@smithy/types": "^3.7.2", - "@smithy/url-parser": "^3.0.11", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/property-provider": "^4.0.1", + "@smithy/types": "^4.1.0", + "@smithy/url-parser": "^4.0.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/eventstream-codec": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-3.1.10.tgz", - "integrity": "sha512-323B8YckSbUH0nMIpXn7HZsAVKHYHFUODa8gG9cHo0ySvA1fr5iWaNT+iIL0UCqUzG6QPHA3BSsBtRQou4mMqQ==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.0.1.tgz", + "integrity": "sha512-Q2bCAAR6zXNVtJgifsU16ZjKGqdw/DyecKNgIgi7dlqw04fqDu0mnq+JmGphqheypVc64CYq3azSuCpAdFk2+A==", "dependencies": { "@aws-crypto/crc32": "5.2.0", - "@smithy/types": "^3.7.2", - "@smithy/util-hex-encoding": "^3.0.0", + "@smithy/types": "^4.1.0", + "@smithy/util-hex-encoding": "^4.0.0", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@smithy/eventstream-serde-browser": { - "version": "3.0.14", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-3.0.14.tgz", - "integrity": "sha512-kbrt0vjOIihW3V7Cqj1SXQvAI5BR8SnyQYsandva0AOR307cXAc+IhPngxIPslxTLfxwDpNu0HzCAq6g42kCPg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.0.1.tgz", + "integrity": "sha512-HbIybmz5rhNg+zxKiyVAnvdM3vkzjE6ccrJ620iPL8IXcJEntd3hnBl+ktMwIy12Te/kyrSbUb8UCdnUT4QEdA==", "dependencies": { - "@smithy/eventstream-serde-universal": "^3.0.13", - "@smithy/types": "^3.7.2", + "@smithy/eventstream-serde-universal": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/eventstream-serde-config-resolver": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.0.11.tgz", - "integrity": "sha512-P2pnEp4n75O+QHjyO7cbw/vsw5l93K/8EWyjNCAAybYwUmj3M+hjSQZ9P5TVdUgEG08ueMAP5R4FkuSkElZ5tQ==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.0.1.tgz", + "integrity": "sha512-lSipaiq3rmHguHa3QFF4YcCM3VJOrY9oq2sow3qlhFY+nBSTF/nrO82MUQRPrxHQXA58J5G1UnU2WuJfi465BA==", "dependencies": { - "@smithy/types": "^3.7.2", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/eventstream-serde-node": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-3.0.13.tgz", - "integrity": "sha512-zqy/9iwbj8Wysmvi7Lq7XFLeDgjRpTbCfwBhJa8WbrylTAHiAu6oQTwdY7iu2lxigbc9YYr9vPv5SzYny5tCXQ==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.0.1.tgz", + "integrity": "sha512-o4CoOI6oYGYJ4zXo34U8X9szDe3oGjmHgsMGiZM0j4vtNoT+h80TLnkUcrLZR3+E6HIxqW+G+9WHAVfl0GXK0Q==", "dependencies": { - "@smithy/eventstream-serde-universal": "^3.0.13", - "@smithy/types": "^3.7.2", + "@smithy/eventstream-serde-universal": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/eventstream-serde-universal": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-3.0.13.tgz", - "integrity": "sha512-L1Ib66+gg9uTnqp/18Gz4MDpJPKRE44geOjOQ2SVc0eiaO5l255ADziATZgjQjqumC7yPtp1XnjHlF1srcwjKw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.0.1.tgz", + "integrity": "sha512-Z94uZp0tGJuxds3iEAZBqGU2QiaBHP4YytLUjwZWx+oUeohCsLyUm33yp4MMBmhkuPqSbQCXq5hDet6JGUgHWA==", "dependencies": { - "@smithy/eventstream-codec": "^3.1.10", - "@smithy/types": "^3.7.2", + "@smithy/eventstream-codec": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/fetch-http-handler": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-4.1.2.tgz", - "integrity": "sha512-R7rU7Ae3ItU4rC0c5mB2sP5mJNbCfoDc8I5XlYjIZnquyUwec7fEo78F6DA3SmgJgkU1qTMcZJuGblxZsl10ZA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.0.1.tgz", + "integrity": "sha512-3aS+fP28urrMW2KTjb6z9iFow6jO8n3MFfineGbndvzGZit3taZhKWtTorf+Gp5RpFDDafeHlhfsGlDCXvUnJA==", "dependencies": { - "@smithy/protocol-http": "^4.1.8", - "@smithy/querystring-builder": "^3.0.11", - "@smithy/types": "^3.7.2", - "@smithy/util-base64": "^3.0.0", + "@smithy/protocol-http": "^5.0.1", + "@smithy/querystring-builder": "^4.0.1", + "@smithy/types": "^4.1.0", + "@smithy/util-base64": "^4.0.0", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@smithy/hash-blob-browser": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-3.1.10.tgz", - "integrity": "sha512-elwslXOoNunmfS0fh55jHggyhccobFkexLYC1ZeZ1xP2BTSrcIBaHV2b4xUQOdctrSNOpMqOZH1r2XzWTEhyfA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.0.1.tgz", + "integrity": "sha512-rkFIrQOKZGS6i1D3gKJ8skJ0RlXqDvb1IyAphksaFOMzkn3v3I1eJ8m7OkLj0jf1McP63rcCEoLlkAn/HjcTRw==", "dependencies": { - "@smithy/chunked-blob-reader": "^4.0.0", - "@smithy/chunked-blob-reader-native": "^3.0.1", - "@smithy/types": "^3.7.2", + "@smithy/chunked-blob-reader": "^5.0.0", + "@smithy/chunked-blob-reader-native": "^4.0.0", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@smithy/hash-node": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-3.0.11.tgz", - "integrity": "sha512-emP23rwYyZhQBvklqTtwetkQlqbNYirDiEEwXl2v0GYWMnCzxst7ZaRAnWuy28njp5kAH54lvkdG37MblZzaHA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.0.1.tgz", + "integrity": "sha512-TJ6oZS+3r2Xu4emVse1YPB3Dq3d8RkZDKcPr71Nj/lJsdAP1c7oFzYqEn1IBc915TsgLl2xIJNuxCz+gLbLE0w==", "dependencies": { - "@smithy/types": "^3.7.2", - "@smithy/util-buffer-from": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", + "@smithy/types": "^4.1.0", + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/hash-stream-node": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-3.1.10.tgz", - "integrity": "sha512-olomK/jZQ93OMayW1zfTHwcbwBdhcZOHsyWyiZ9h9IXvc1mCD/VuvzbLb3Gy/qNJwI4MANPLctTp2BucV2oU/Q==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-4.0.1.tgz", + "integrity": "sha512-U1rAE1fxmReCIr6D2o/4ROqAQX+GffZpyMt3d7njtGDr2pUNmAKRWa49gsNVhCh2vVAuf3wXzWwNr2YN8PAXIw==", "dependencies": { - "@smithy/types": "^3.7.2", - "@smithy/util-utf8": "^3.0.0", + "@smithy/types": "^4.1.0", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/invalid-dependency": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-3.0.11.tgz", - "integrity": "sha512-NuQmVPEJjUX6c+UELyVz8kUx8Q539EDeNwbRyu4IIF8MeV7hUtq1FB3SHVyki2u++5XLMFqngeMKk7ccspnNyQ==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.0.1.tgz", + "integrity": "sha512-gdudFPf4QRQ5pzj7HEnu6FhKRi61BfH/Gk5Yf6O0KiSbr1LlVhgjThcvjdu658VE6Nve8vaIWB8/fodmS1rBPQ==", "dependencies": { - "@smithy/types": "^3.7.2", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@smithy/is-array-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", - "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.0.0.tgz", + "integrity": "sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/md5-js": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-3.0.11.tgz", - "integrity": "sha512-3NM0L3i2Zm4bbgG6Ymi9NBcxXhryi3uE8fIfHJZIOfZVxOkGdjdgjR9A06SFIZCfnEIWKXZdm6Yq5/aPXFFhsQ==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-4.0.1.tgz", + "integrity": "sha512-HLZ647L27APi6zXkZlzSFZIjpo8po45YiyjMGJZM3gyDY8n7dPGdmxIIljLm4gPt/7rRvutLTTkYJpZVfG5r+A==", "dependencies": { - "@smithy/types": "^3.7.2", - "@smithy/util-utf8": "^3.0.0", + "@smithy/types": "^4.1.0", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@smithy/middleware-content-length": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-3.0.13.tgz", - "integrity": "sha512-zfMhzojhFpIX3P5ug7jxTjfUcIPcGjcQYzB9t+rv0g1TX7B0QdwONW+ATouaLoD7h7LOw/ZlXfkq4xJ/g2TrIw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.0.1.tgz", + "integrity": "sha512-OGXo7w5EkB5pPiac7KNzVtfCW2vKBTZNuCctn++TTSOMpe6RZO/n6WEC1AxJINn3+vWLKW49uad3lo/u0WJ9oQ==", "dependencies": { - "@smithy/protocol-http": "^4.1.8", - "@smithy/types": "^3.7.2", + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/middleware-endpoint": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.2.6.tgz", - "integrity": "sha512-WAqzyulvvSKrT5c6VrQelgNVNNO7BlTQW9Z+s9tcG6G5CaBS1YBpPtT3VuhXLQbewSiGi7oXQROwpw26EG9PLQ==", - "dependencies": { - "@smithy/core": "^2.5.5", - "@smithy/middleware-serde": "^3.0.11", - "@smithy/node-config-provider": "^3.1.12", - "@smithy/shared-ini-file-loader": "^3.1.12", - "@smithy/types": "^3.7.2", - "@smithy/url-parser": "^3.0.11", - "@smithy/util-middleware": "^3.0.11", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.0.3.tgz", + "integrity": "sha512-YdbmWhQF5kIxZjWqPIgboVfi8i5XgiYMM7GGKFMTvBei4XjNQfNv8sukT50ITvgnWKKKpOtp0C0h7qixLgb77Q==", + "dependencies": { + "@smithy/core": "^3.1.2", + "@smithy/middleware-serde": "^4.0.2", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/shared-ini-file-loader": "^4.0.1", + "@smithy/types": "^4.1.0", + "@smithy/url-parser": "^4.0.1", + "@smithy/util-middleware": "^4.0.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/middleware-retry": { - "version": "3.0.31", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.31.tgz", - "integrity": "sha512-yq9wawrJLYHAYFpChLujxRN4My+SiKXvZk9Ml/CvTdRSA8ew+hvuR5LT+mjSlSBv3c4XJrkN8CWegkBaeD0Vrg==", - "dependencies": { - "@smithy/node-config-provider": "^3.1.12", - "@smithy/protocol-http": "^4.1.8", - "@smithy/service-error-classification": "^3.0.11", - "@smithy/smithy-client": "^3.5.1", - "@smithy/types": "^3.7.2", - "@smithy/util-middleware": "^3.0.11", - "@smithy/util-retry": "^3.0.11", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.0.4.tgz", + "integrity": "sha512-wmxyUBGHaYUqul0wZiset4M39SMtDBOtUr2KpDuftKNN74Do9Y36Go6Eqzj9tL0mIPpr31ulB5UUtxcsCeGXsQ==", + "dependencies": { + "@smithy/node-config-provider": "^4.0.1", + "@smithy/protocol-http": "^5.0.1", + "@smithy/service-error-classification": "^4.0.1", + "@smithy/smithy-client": "^4.1.3", + "@smithy/types": "^4.1.0", + "@smithy/util-middleware": "^4.0.1", + "@smithy/util-retry": "^4.0.1", "tslib": "^2.6.2", "uuid": "^9.0.1" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/middleware-retry/node_modules/uuid": { @@ -10505,374 +10878,380 @@ } }, "node_modules/@smithy/middleware-serde": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.11.tgz", - "integrity": "sha512-KzPAeySp/fOoQA82TpnwItvX8BBURecpx6ZMu75EZDkAcnPtO6vf7q4aH5QHs/F1s3/snQaSFbbUMcFFZ086Mw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.2.tgz", + "integrity": "sha512-Sdr5lOagCn5tt+zKsaW+U2/iwr6bI9p08wOkCp6/eL6iMbgdtc2R5Ety66rf87PeohR0ExI84Txz9GYv5ou3iQ==", "dependencies": { - "@smithy/types": "^3.7.2", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/middleware-stack": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.11.tgz", - "integrity": "sha512-1HGo9a6/ikgOMrTrWL/WiN9N8GSVYpuRQO5kjstAq4CvV59bjqnh7TbdXGQ4vxLD3xlSjfBjq5t1SOELePsLnA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.1.tgz", + "integrity": "sha512-dHwDmrtR/ln8UTHpaIavRSzeIk5+YZTBtLnKwDW3G2t6nAupCiQUvNzNoHBpik63fwUaJPtlnMzXbQrNFWssIA==", "dependencies": { - "@smithy/types": "^3.7.2", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/node-config-provider": { - "version": "3.1.12", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.12.tgz", - "integrity": "sha512-O9LVEu5J/u/FuNlZs+L7Ikn3lz7VB9hb0GtPT9MQeiBmtK8RSY3ULmsZgXhe6VAlgTw0YO+paQx4p8xdbs43vQ==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.0.1.tgz", + "integrity": "sha512-8mRTjvCtVET8+rxvmzRNRR0hH2JjV0DFOmwXPrISmTIJEfnCBugpYYGAsCj8t41qd+RB5gbheSQ/6aKZCQvFLQ==", "dependencies": { - "@smithy/property-provider": "^3.1.11", - "@smithy/shared-ini-file-loader": "^3.1.12", - "@smithy/types": "^3.7.2", + "@smithy/property-provider": "^4.0.1", + "@smithy/shared-ini-file-loader": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/node-http-handler": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.3.2.tgz", - "integrity": "sha512-t4ng1DAd527vlxvOfKFYEe6/QFBcsj7WpNlWTyjorwXXcKw3XlltBGbyHfSJ24QT84nF+agDha9tNYpzmSRZPA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.0.2.tgz", + "integrity": "sha512-X66H9aah9hisLLSnGuzRYba6vckuFtGE+a5DcHLliI/YlqKrGoxhisD5XbX44KyoeRzoNlGr94eTsMVHFAzPOw==", "dependencies": { - "@smithy/abort-controller": "^3.1.9", - "@smithy/protocol-http": "^4.1.8", - "@smithy/querystring-builder": "^3.0.11", - "@smithy/types": "^3.7.2", + "@smithy/abort-controller": "^4.0.1", + "@smithy/protocol-http": "^5.0.1", + "@smithy/querystring-builder": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/property-provider": { - "version": "3.1.11", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.11.tgz", - "integrity": "sha512-I/+TMc4XTQ3QAjXfOcUWbSS073oOEAxgx4aZy8jHaf8JQnRkq2SZWw8+PfDtBvLUjcGMdxl+YwtzWe6i5uhL/A==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.1.tgz", + "integrity": "sha512-o+VRiwC2cgmk/WFV0jaETGOtX16VNPp2bSQEzu0whbReqE1BMqsP2ami2Vi3cbGVdKu1kq9gQkDAGKbt0WOHAQ==", "dependencies": { - "@smithy/types": "^3.7.2", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/protocol-http": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.8.tgz", - "integrity": "sha512-hmgIAVyxw1LySOwkgMIUN0kjN8TG9Nc85LJeEmEE/cNEe2rkHDUWhnJf2gxcSRFLWsyqWsrZGw40ROjUogg+Iw==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.0.1.tgz", + "integrity": "sha512-TE4cpj49jJNB/oHyh/cRVEgNZaoPaxd4vteJNB0yGidOCVR0jCw/hjPVsT8Q8FRmj8Bd3bFZt8Dh7xGCT+xMBQ==", "dependencies": { - "@smithy/types": "^3.7.2", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/querystring-builder": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.11.tgz", - "integrity": "sha512-u+5HV/9uJaeLj5XTb6+IEF/dokWWkEqJ0XiaRRogyREmKGUgZnNecLucADLdauWFKUNbQfulHFEZEdjwEBjXRg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.1.tgz", + "integrity": "sha512-wU87iWZoCbcqrwszsOewEIuq+SU2mSoBE2CcsLwE0I19m0B2gOJr1MVjxWcDQYOzHbR1xCk7AcOBbGFUYOKvdg==", "dependencies": { - "@smithy/types": "^3.7.2", - "@smithy/util-uri-escape": "^3.0.0", + "@smithy/types": "^4.1.0", + "@smithy/util-uri-escape": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/querystring-parser": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.11.tgz", - "integrity": "sha512-Je3kFvCsFMnso1ilPwA7GtlbPaTixa3WwC+K21kmMZHsBEOZYQaqxcMqeFFoU7/slFjKDIpiiPydvdJm8Q/MCw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.1.tgz", + "integrity": "sha512-Ma2XC7VS9aV77+clSFylVUnPZRindhB7BbmYiNOdr+CHt/kZNJoPP0cd3QxCnCFyPXC4eybmyE98phEHkqZ5Jw==", "dependencies": { - "@smithy/types": "^3.7.2", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/service-error-classification": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-3.0.11.tgz", - "integrity": "sha512-QnYDPkyewrJzCyaeI2Rmp7pDwbUETe+hU8ADkXmgNusO1bgHBH7ovXJiYmba8t0fNfJx75fE8dlM6SEmZxheog==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.0.1.tgz", + "integrity": "sha512-3JNjBfOWpj/mYfjXJHB4Txc/7E4LVq32bwzE7m28GN79+M1f76XHflUaSUkhOriprPDzev9cX/M+dEB80DNDKA==", "dependencies": { - "@smithy/types": "^3.7.2" + "@smithy/types": "^4.1.0" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/shared-ini-file-loader": { - "version": "3.1.12", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.12.tgz", - "integrity": "sha512-1xKSGI+U9KKdbG2qDvIR9dGrw3CNx+baqJfyr0igKEpjbHL5stsqAesYBzHChYHlelWtb87VnLWlhvfCz13H8Q==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.1.tgz", + "integrity": "sha512-hC8F6qTBbuHRI/uqDgqqi6J0R4GtEZcgrZPhFQnMhfJs3MnUTGSnR1NSJCJs5VWlMydu0kJz15M640fJlRsIOw==", "dependencies": { - "@smithy/types": "^3.7.2", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/signature-v4": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-4.2.4.tgz", - "integrity": "sha512-5JWeMQYg81TgU4cG+OexAWdvDTs5JDdbEZx+Qr1iPbvo91QFGzjy0IkXAKaXUHqmKUJgSHK0ZxnCkgZpzkeNTA==", - "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", - "@smithy/protocol-http": "^4.1.8", - "@smithy/types": "^3.7.2", - "@smithy/util-hex-encoding": "^3.0.0", - "@smithy/util-middleware": "^3.0.11", - "@smithy/util-uri-escape": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.0.1.tgz", + "integrity": "sha512-nCe6fQ+ppm1bQuw5iKoeJ0MJfz2os7Ic3GBjOkLOPtavbD1ONoyE3ygjBfz2ythFWm4YnRm6OxW+8p/m9uCoIA==", + "dependencies": { + "@smithy/is-array-buffer": "^4.0.0", + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", + "@smithy/util-hex-encoding": "^4.0.0", + "@smithy/util-middleware": "^4.0.1", + "@smithy/util-uri-escape": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/smithy-client": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.5.1.tgz", - "integrity": "sha512-PmjskH4Os1Eh3rd5vSsa5uVelZ4DRu+N5CBEgb9AT96hQSJGWSEb6pGxKV/PtKQSIp9ft3+KvnT8ViMKaguzgA==", - "dependencies": { - "@smithy/core": "^2.5.5", - "@smithy/middleware-endpoint": "^3.2.6", - "@smithy/middleware-stack": "^3.0.11", - "@smithy/protocol-http": "^4.1.8", - "@smithy/types": "^3.7.2", - "@smithy/util-stream": "^3.3.2", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.1.3.tgz", + "integrity": "sha512-A2Hz85pu8BJJaYFdX8yb1yocqigyqBzn+OVaVgm+Kwi/DkN8vhN2kbDVEfADo6jXf5hPKquMLGA3UINA64UZ7A==", + "dependencies": { + "@smithy/core": "^3.1.2", + "@smithy/middleware-endpoint": "^4.0.3", + "@smithy/middleware-stack": "^4.0.1", + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", + "@smithy/util-stream": "^4.0.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/types": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.7.2.tgz", - "integrity": "sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.1.0.tgz", + "integrity": "sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/url-parser": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.11.tgz", - "integrity": "sha512-TmlqXkSk8ZPhfc+SQutjmFr5FjC0av3GZP4B/10caK1SbRwe/v+Wzu/R6xEKxoNqL+8nY18s1byiy6HqPG37Aw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.1.tgz", + "integrity": "sha512-gPXcIEUtw7VlK8f/QcruNXm7q+T5hhvGu9tl63LsJPZ27exB6dtNwvh2HIi0v7JcXJ5emBxB+CJxwaLEdJfA+g==", "dependencies": { - "@smithy/querystring-parser": "^3.0.11", - "@smithy/types": "^3.7.2", + "@smithy/querystring-parser": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@smithy/util-base64": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-3.0.0.tgz", - "integrity": "sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.0.0.tgz", + "integrity": "sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg==", "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/util-body-length-browser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-3.0.0.tgz", - "integrity": "sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.0.0.tgz", + "integrity": "sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA==", "dependencies": { "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@smithy/util-body-length-node": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-3.0.0.tgz", - "integrity": "sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.0.0.tgz", + "integrity": "sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg==", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", - "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.0.0.tgz", + "integrity": "sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==", "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", + "@smithy/is-array-buffer": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/util-config-provider": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-3.0.0.tgz", - "integrity": "sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.0.0.tgz", + "integrity": "sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/util-defaults-mode-browser": { - "version": "3.0.31", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.31.tgz", - "integrity": "sha512-eO+zkbqrPnmsagqzrmF7IJrCoU2wTQXWVYxMPqA9Oue55kw9WEvhyuw2XQzTVTCRcYsg6KgmV3YYhLlWQJfK1A==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.4.tgz", + "integrity": "sha512-Ej1bV5sbrIfH++KnWxjjzFNq9nyP3RIUq2c9Iqq7SmMO/idUR24sqvKH2LUQFTSPy/K7G4sB2m8n7YYlEAfZaw==", "dependencies": { - "@smithy/property-provider": "^3.1.11", - "@smithy/smithy-client": "^3.5.1", - "@smithy/types": "^3.7.2", + "@smithy/property-provider": "^4.0.1", + "@smithy/smithy-client": "^4.1.3", + "@smithy/types": "^4.1.0", "bowser": "^2.11.0", "tslib": "^2.6.2" }, "engines": { - "node": ">= 10.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "3.0.31", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.31.tgz", - "integrity": "sha512-0/nJfpSpbGZOs6qs42wCe2TdjobbnnD4a3YUUlvTXSQqLy4qa63luDaV04hGvqSHP7wQ7/WGehbvHkDhMZd1MQ==", - "dependencies": { - "@smithy/config-resolver": "^3.0.13", - "@smithy/credential-provider-imds": "^3.2.8", - "@smithy/node-config-provider": "^3.1.12", - "@smithy/property-provider": "^3.1.11", - "@smithy/smithy-client": "^3.5.1", - "@smithy/types": "^3.7.2", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.4.tgz", + "integrity": "sha512-HE1I7gxa6yP7ZgXPCFfZSDmVmMtY7SHqzFF55gM/GPegzZKaQWZZ+nYn9C2Cc3JltCMyWe63VPR3tSFDEvuGjw==", + "dependencies": { + "@smithy/config-resolver": "^4.0.1", + "@smithy/credential-provider-imds": "^4.0.1", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/property-provider": "^4.0.1", + "@smithy/smithy-client": "^4.1.3", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">= 10.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/util-endpoints": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-2.1.7.tgz", - "integrity": "sha512-tSfcqKcN/Oo2STEYCABVuKgJ76nyyr6skGl9t15hs+YaiU06sgMkN7QYjo0BbVw+KT26zok3IzbdSOksQ4YzVw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.0.1.tgz", + "integrity": "sha512-zVdUENQpdtn9jbpD9SCFK4+aSiavRb9BxEtw9ZGUR1TYo6bBHbIoi7VkrFQ0/RwZlzx0wRBaRmPclj8iAoJCLA==", "dependencies": { - "@smithy/node-config-provider": "^3.1.12", - "@smithy/types": "^3.7.2", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/util-hex-encoding": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-3.0.0.tgz", - "integrity": "sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.0.0.tgz", + "integrity": "sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/util-middleware": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.11.tgz", - "integrity": "sha512-dWpyc1e1R6VoXrwLoLDd57U1z6CwNSdkM69Ie4+6uYh2GC7Vg51Qtan7ITzczuVpqezdDTKJGJB95fFvvjU/ow==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.1.tgz", + "integrity": "sha512-HiLAvlcqhbzhuiOa0Lyct5IIlyIz0PQO5dnMlmQ/ubYM46dPInB+3yQGkfxsk6Q24Y0n3/JmcA1v5iEhmOF5mA==", "dependencies": { - "@smithy/types": "^3.7.2", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/util-retry": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-3.0.11.tgz", - "integrity": "sha512-hJUC6W7A3DQgaee3Hp9ZFcOxVDZzmBIRBPlUAk8/fSOEl7pE/aX7Dci0JycNOnm9Mfr0KV2XjIlUOcGWXQUdVQ==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.0.1.tgz", + "integrity": "sha512-WmRHqNVwn3kI3rKk1LsKcVgPBG6iLTBGC1iYOV3GQegwJ3E8yjzHytPt26VNzOWr1qu0xE03nK0Ug8S7T7oufw==", "dependencies": { - "@smithy/service-error-classification": "^3.0.11", - "@smithy/types": "^3.7.2", + "@smithy/service-error-classification": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/util-stream": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.3.2.tgz", - "integrity": "sha512-sInAqdiVeisUGYAv/FrXpmJ0b4WTFmciTRqzhb7wVuem9BHvhIG7tpiYHLDWrl2stOokNZpTTGqz3mzB2qFwXg==", - "dependencies": { - "@smithy/fetch-http-handler": "^4.1.2", - "@smithy/node-http-handler": "^3.3.2", - "@smithy/types": "^3.7.2", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-buffer-from": "^3.0.0", - "@smithy/util-hex-encoding": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.0.2.tgz", + "integrity": "sha512-0eZ4G5fRzIoewtHtwaYyl8g2C+osYOT4KClXgfdNEDAgkbe2TYPqcnw4GAWabqkZCax2ihRGPe9LZnsPdIUIHA==", + "dependencies": { + "@smithy/fetch-http-handler": "^5.0.1", + "@smithy/node-http-handler": "^4.0.2", + "@smithy/types": "^4.1.0", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-hex-encoding": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/util-uri-escape": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-3.0.0.tgz", - "integrity": "sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.0.0.tgz", + "integrity": "sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/util-utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", - "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.0.0.tgz", + "integrity": "sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==", "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-buffer-from": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/util-waiter": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-3.2.0.tgz", - "integrity": "sha512-PpjSboaDUE6yl+1qlg3Si57++e84oXdWGbuFUSAciXsVfEZJJJupR2Nb0QuXHiunt2vGR+1PTizOMvnUPaG2Qg==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.0.2.tgz", + "integrity": "sha512-piUTHyp2Axx3p/kc2CIJkYSv0BAaheBQmbACZgQSSfWUumWNW+R1lL+H9PDBxKJkvOeEX+hKYEFiwO8xagL8AQ==", "dependencies": { - "@smithy/abort-controller": "^3.1.9", - "@smithy/types": "^3.7.2", + "@smithy/abort-controller": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@socket.io/component-emitter": { @@ -10881,9 +11260,9 @@ "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==" }, "node_modules/@sourceloop/audit-log": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/@sourceloop/audit-log/-/audit-log-8.0.4.tgz", - "integrity": "sha512-GNYM1H7fcHkpwE9aX6lltDab+Ja8G//ajz5CSOVJoY2AYesYY/DFi/MOJ6ci7Q19Y7MTX9c3cxGEZM040Yi34A==", + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/@sourceloop/audit-log/-/audit-log-8.0.5.tgz", + "integrity": "sha512-7Gcof4wTLUSIJP7Lp/UPOrjMXgr897mKvp2zUTqeYREUfCu6kl7HpBgZ6TKbfpE8ufWofNGRry9qQ4Z9fW6Wgg==", "dependencies": { "@loopback/boot": "^7.0.9", "@loopback/core": "^6.1.6", @@ -10908,16 +11287,22 @@ } }, "node_modules/@sourceloop/audit-log/node_modules/cssstyle": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.1.0.tgz", - "integrity": "sha512-h66W1URKpBS5YMI/V8PyXvTMFT8SupJ1IzoIV8IeBC/ji8WVmrO8dGlTi+2dh6whmdk6BiKJLD/ZBkhWbcg6nA==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.2.1.tgz", + "integrity": "sha512-9+vem03dMXG7gDmZ62uqmRiMRNtinIZ9ZyuF6BdxzfOD+FdN5hretzynkn0ReS2DO2GSw76RWHs0UmJPI2zUjw==", "dependencies": { - "rrweb-cssom": "^0.7.1" + "@asamuzakjp/css-color": "^2.8.2", + "rrweb-cssom": "^0.8.0" }, "engines": { "node": ">=18" } }, + "node_modules/@sourceloop/audit-log/node_modules/cssstyle/node_modules/rrweb-cssom": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", + "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==" + }, "node_modules/@sourceloop/audit-log/node_modules/data-urls": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", @@ -11099,10 +11484,6 @@ "resolved": "sandbox/auth-mfa-example", "link": true }, - "node_modules/@sourceloop/auth-ms-basic-example": { - "resolved": "sandbox/auth-ms-basic-example", - "link": true - }, "node_modules/@sourceloop/auth-multitenant-example": { "resolved": "sandbox/auth-multitenant-example", "link": true @@ -11553,9 +11934,9 @@ } }, "node_modules/@types/diff": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@types/diff/-/diff-6.0.0.tgz", - "integrity": "sha512-dhVCYGv3ZSbzmQaBSagrv1WJ6rXCdkyTcDyoNu1MD8JohI7pR7k8wdZEm+mvdxRKXyHVwckFzWU1vJc+Z29MlA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@types/diff/-/diff-7.0.0.tgz", + "integrity": "sha512-sVpkpbnTJL9CYoDf4U+tHaQLe5HiTaHWY7m9FuYA7oMCHwC9ie0Vh9eIGapyzYrU3+pILlSY2fAc4elfw5m4dg==", "dev": true }, "node_modules/@types/dotenv": { @@ -11733,10 +12114,14 @@ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" }, "node_modules/@types/json-stable-stringify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@types/json-stable-stringify/-/json-stable-stringify-1.1.0.tgz", - "integrity": "sha512-ESTsHWB72QQq+pjUFIbEz9uSCZppD31YrVkbt2rnUciTYEvcwN6uZIhX5JZeBHqRlFJ41x/7MewCs7E2Qux6Cg==", - "dev": true + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@types/json-stable-stringify/-/json-stable-stringify-1.2.0.tgz", + "integrity": "sha512-PEHY3ohqolHqAzDyB1+31tFaAMnoLN7x/JgdcGmNZ2uvtEJ6rlFCUYNQc0Xe754xxCYLNGZbLUGydSE6tS4S9A==", + "deprecated": "This is a stub types definition. json-stable-stringify provides its own type definitions, so you do not need this installed.", + "dev": true, + "dependencies": { + "json-stable-stringify": "*" + } }, "node_modules/@types/jsonfile": { "version": "6.1.4", @@ -11747,10 +12132,11 @@ } }, "node_modules/@types/jsonwebtoken": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.7.tgz", - "integrity": "sha512-ugo316mmTYBl2g81zDFnZ7cfxlut3o+/EQdaP7J8QN2kY6lJ22hmQYCK5EHcJHbrW+dkCGSCPgbG8JtYj6qSrg==", + "version": "9.0.8", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.8.tgz", + "integrity": "sha512-7fx54m60nLFUVYlxAB1xpe9CBWX2vSrk50Y6ogRJ1v5xxtba7qXTg5BgYDN5dq+yuQQ9HaVlHJyAAt1/mxryFg==", "dependencies": { + "@types/ms": "*", "@types/node": "*" } }, @@ -11794,9 +12180,9 @@ } }, "node_modules/@types/lodash": { - "version": "4.17.13", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.13.tgz", - "integrity": "sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg==" + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-w/P33JFeySuhN6JLkysYUK2gEmy9kHHFN7E8ro0tkfmlDOgxBDzWEZ/J8cWA+fHqFevpswDTFZnDx+R9lbL6xw==" }, "node_modules/@types/long": { "version": "4.0.2", @@ -11896,9 +12282,9 @@ } }, "node_modules/@types/ms": { - "version": "0.7.34", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", - "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==" }, "node_modules/@types/multer": { "version": "1.4.12", @@ -11920,9 +12306,9 @@ } }, "node_modules/@types/node": { - "version": "20.17.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.10.tgz", - "integrity": "sha512-/jrvh5h6NXhEauFFexRin69nA0uHJ5gwk4iDivp/DeoEua3uwCUto6PC86IpRITBOs4+6i2I56K5x5b6WYGXHA==", + "version": "20.17.16", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.16.tgz", + "integrity": "sha512-vOTpLduLkZXePLxHiHsBLp98mHGnl8RptV4YAO3HfKO5UHjDvySGbxKtpYfy8Sx5+WKcgc45qNreJJRVM3L6mw==", "dependencies": { "undici-types": "~6.19.2" } @@ -12108,9 +12494,9 @@ } }, "node_modules/@types/pg": { - "version": "8.11.10", - "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.11.10.tgz", - "integrity": "sha512-LczQUW4dbOQzsH2RQ5qoeJ6qJPdrcM/DcMLoqWQkMLMsq83J5lAX3LXjdkWdpscFy67JSOWDnh7Ny/sPFykmkg==", + "version": "8.11.11", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.11.11.tgz", + "integrity": "sha512-kGT1qKM8wJQ5qlawUrEkXgvMSXoV213KfMGXcwfDwUIfUHXqXYXOfS1nE1LINRJVVVx5wCm70XnFlMHaIcQAfw==", "dependencies": { "@types/node": "*", "pg-protocol": "*", @@ -12144,9 +12530,9 @@ } }, "node_modules/@types/qs": { - "version": "6.9.17", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.17.tgz", - "integrity": "sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ==" + "version": "6.9.18", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.18.tgz", + "integrity": "sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==" }, "node_modules/@types/range-parser": { "version": "1.2.7", @@ -12318,9 +12704,9 @@ "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==" }, "node_modules/@types/type-is": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/@types/type-is/-/type-is-1.6.6.tgz", - "integrity": "sha512-fs1KHv/f9OvmTMsu4sBNaUu32oyda9Y9uK25naJG8gayxNrfqGIjPQsbLIYyfe7xFkppnPlJB+BuTldOaX9bXw==", + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/@types/type-is/-/type-is-1.6.7.tgz", + "integrity": "sha512-gEsh7n8824nusZ2Sidh6POxNsIdTSvIAl5gXbeFj+TUaD1CO2r4i7MQYNMfEQkChU42s2bVWAda6x6BzIhtFbQ==", "dependencies": { "@types/node": "*" } @@ -12694,9 +13080,9 @@ } }, "node_modules/@ungap/structured-clone": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.1.tgz", - "integrity": "sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", "dev": true }, "node_modules/@webassemblyjs/ast": { @@ -13058,9 +13444,9 @@ } }, "node_modules/agentkeepalive": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", - "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz", + "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", "dependencies": { "humanize-ms": "^1.2.1" }, @@ -13527,6 +13913,15 @@ "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==" }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/async-retry": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", @@ -14263,9 +14658,9 @@ } }, "node_modules/boxen/node_modules/type-fest": { - "version": "4.30.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.30.2.tgz", - "integrity": "sha512-UJShLPYi1aWqCdq9HycOL/gwsuqda1OISdBO3t8RlXQC4QvtuIz4b5FCfe2dQIWEpmlRExKmcTBfP1r9bhY7ig==", + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.33.0.tgz", + "integrity": "sha512-s6zVrxuyKbbAsSAD5ZPTB77q4YIdRctkTbJ2/Dqlinwz+8ooH2gd+YA7VA6Pa93KML9GockVvoxjZ2vHP+mu8g==", "engines": { "node": ">=16" }, @@ -14343,9 +14738,9 @@ "dev": true }, "node_modules/browserslist": { - "version": "4.24.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.3.tgz", - "integrity": "sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==", + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", "dev": true, "funding": [ { @@ -14899,9 +15294,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001690", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz", - "integrity": "sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==", + "version": "1.0.30001695", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001695.tgz", + "integrity": "sha512-vHyLade6wTgI2u1ec3WQBxv+2BrTERV28UXQu9LO6lZ9pYeMk34vjXFLOxo1A4UBA8XTL4njRQZdno/yYaSmWw==", "dev": true, "funding": [ { @@ -14941,9 +15336,9 @@ } }, "node_modules/casbin": { - "version": "5.36.0", - "resolved": "https://registry.npmjs.org/casbin/-/casbin-5.36.0.tgz", - "integrity": "sha512-vaH292Ed+Op8WhNFA/VJqMearhnQwFs3TU3qKCOAmUeTtGS9un8+fPvJ4OGQ7luWFAG/EVZAvNWCWTbciU4R+Q==", + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/casbin/-/casbin-5.38.0.tgz", + "integrity": "sha512-0VI0j18XtftaMj3nnv6CM3h0EvtB8IWPdxWD1t1myyUBOUboMSsMrU9PUtYFX9oAAXRpY2DWNTF1mXUG+QcYvw==", "dependencies": { "@casbin/expression-eval": "^5.3.0", "await-lock": "^2.0.1", @@ -15961,9 +16356,9 @@ } }, "node_modules/configstore/node_modules/type-fest": { - "version": "4.30.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.30.2.tgz", - "integrity": "sha512-UJShLPYi1aWqCdq9HycOL/gwsuqda1OISdBO3t8RlXQC4QvtuIz4b5FCfe2dQIWEpmlRExKmcTBfP1r9bhY7ig==", + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.33.0.tgz", + "integrity": "sha512-s6zVrxuyKbbAsSAD5ZPTB77q4YIdRctkTbJ2/Dqlinwz+8ooH2gd+YA7VA6Pa93KML9GockVvoxjZ2vHP+mu8g==", "engines": { "node": ">=16" }, @@ -17068,9 +17463,9 @@ } }, "node_modules/decimal.js": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", - "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==" + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.5.0.tgz", + "integrity": "sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==" }, "node_modules/decompress-response": { "version": "6.0.0", @@ -17670,9 +18065,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.75", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.75.tgz", - "integrity": "sha512-Lf3++DumRE/QmweGjU+ZcKqQ+3bKkU/qjaKYhIJKEOhgIO9Xs6IiAQFkfFoj+RhgDk4LUeNsLo6plExHqSyu6Q==", + "version": "1.5.88", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.88.tgz", + "integrity": "sha512-K3C2qf1o+bGzbilTDCTBhTQcMS9KW60yTAaTeeXsfvQuTDDwlokLam/AdqlqcSy9u4UainDgsHV23ksXAOgamw==", "dev": true }, "node_modules/emittery": { @@ -17735,9 +18130,9 @@ } }, "node_modules/engine.io-client": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.6.2.tgz", - "integrity": "sha512-TAr+NKeoVTjEVW8P3iHguO1LO6RlUz9O5Y8o7EY0fU+gY1NYqas7NN3slpFtbXEsLMHk0h90fJMfKjRkQ0qUIw==", + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.6.3.tgz", + "integrity": "sha512-T0iLjnyNWahNyv/lcjS2y4oE358tVS/SYQNxYXGAJ9/GLgH4VCvOQ/mhTjqU88mLZCQgiG8RIegFHYCdVC+j5w==", "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.1", @@ -17869,9 +18264,9 @@ } }, "node_modules/es-abstract": { - "version": "1.23.7", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.7.tgz", - "integrity": "sha512-OygGC8kIcDhXX+6yAZRGLqwi2CmEXCbLQixeGUgYeR+Qwlppqmo7DIDr8XibtEBZp+fJcoYpoatp5qwLMEdcqQ==", + "version": "1.23.9", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz", + "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==", "dev": true, "dependencies": { "array-buffer-byte-length": "^1.0.2", @@ -17885,10 +18280,11 @@ "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.0.3", + "es-set-tostringtag": "^2.1.0", "es-to-primitive": "^1.3.0", "function.prototype.name": "^1.1.8", - "get-intrinsic": "^1.2.6", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.0", "get-symbol-description": "^1.1.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", @@ -17909,9 +18305,12 @@ "object-inspect": "^1.13.3", "object-keys": "^1.1.1", "object.assign": "^4.1.7", + "own-keys": "^1.0.1", "regexp.prototype.flags": "^1.5.3", "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", "string.prototype.trim": "^1.2.10", "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", @@ -17946,15 +18345,15 @@ } }, "node_modules/es-module-lexer": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", - "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", + "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", "dev": true }, "node_modules/es-object-atoms": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "dependencies": { "es-errors": "^1.3.0" }, @@ -17963,14 +18362,15 @@ } }, "node_modules/es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.4", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" + "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -18175,9 +18575,9 @@ } }, "node_modules/eslint-plugin-prettier": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz", - "integrity": "sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==", + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.3.tgz", + "integrity": "sha512-qJ+y0FfCp/mQYQ/vWQ3s7eUlFEL4PyKfAJxsnYTJ4YT73nsJBWqmEpFryxV9OeUiqmsTsYJ5Y+KDNaeP31wrRw==", "dev": true, "dependencies": { "prettier-linter-helpers": "^1.0.0", @@ -18726,15 +19126,15 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" }, "engines": { "node": ">=8.6.0" @@ -18812,9 +19212,19 @@ "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" }, "node_modules/fast-uri": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz", - "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==" + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ] }, "node_modules/fast-xml-parser": { "version": "4.4.1", @@ -19151,9 +19561,9 @@ } }, "node_modules/firebase-admin/node_modules/@types/node": { - "version": "22.10.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.2.tgz", - "integrity": "sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==", + "version": "22.12.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.12.0.tgz", + "integrity": "sha512-Fll2FZ1riMjNmlmJOdAyY5pUbkftXslB5DgEzlIuNaiWhXd00FhWxVC/r4yV/4wBb9JfImTu+jiSvXTkJ7F/gA==", "dependencies": { "undici-types": "~6.20.0" } @@ -19164,9 +19574,9 @@ "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==" }, "node_modules/firebase-admin/node_modules/uuid": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.0.3.tgz", - "integrity": "sha512-d0z310fCWv5dJwnX1Y/MncBAqGMKEzlBb1AOf7z9K8ALnd0utBX/msg/fA0+sbyN1ihbMsLhrBlnl1ak7Wa0rg==", + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.0.5.tgz", + "integrity": "sha512-508e6IcKLrhxKdBbcA2b4KQZlLVp2+J5UwQ6F7Drckkc5N9ZJwFa4TgWtsww9UG8fGHbm6gbV19TdM5pQ4GaIA==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" @@ -19332,11 +19742,17 @@ } }, "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.4.tgz", + "integrity": "sha512-kKaIINnFpzW6ffJNDjjyjrk21BkDx38c0xa/klsT8VzLCaMEefv4ZTacrcVR4DmgTeBra++jMDAfS/tS799YDw==", "dependencies": { - "is-callable": "^1.1.3" + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/foreach": { @@ -19899,20 +20315,20 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.6.tgz", - "integrity": "sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", + "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", "dependencies": { "call-bind-apply-helpers": "^1.0.1", - "dunder-proto": "^1.0.0", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "function-bind": "^1.1.2", + "get-proto": "^1.0.0", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", - "math-intrinsics": "^1.0.0" + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -20066,6 +20482,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-stdin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", @@ -20363,20 +20791,23 @@ } }, "node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.1.tgz", + "integrity": "sha512-zrQDm8XPnYEKawJScsnM0QzobJxlT/kHOOlRTio8IH/GrmxRE5fjllkzdaHclIuNjUQTJYH2xHNIGfdpJkDJUw==", "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", + "jackspeak": "^4.0.1", + "minimatch": "^10.0.0", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" + "path-scurry": "^2.0.0" }, "bin": { "glob": "dist/esm/bin.mjs" }, + "engines": { + "node": "20 || >=22" + }, "funding": { "url": "https://github.com/sponsors/isaacs" } @@ -20398,6 +20829,20 @@ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "dev": true }, + "node_modules/glob/node_modules/minimatch": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", + "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/glob/node_modules/minipass": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", @@ -20581,9 +21026,9 @@ "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==" }, "node_modules/google-auth-library": { - "version": "9.15.0", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.15.0.tgz", - "integrity": "sha512-7ccSEJFDFO7exFbO6NRyC+xH8/mZ1GZGG2xxx9iHxZWcjUjJpjWxIMw3cofAKcueZ6DATiukmmprD7yavQHOyQ==", + "version": "9.15.1", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.15.1.tgz", + "integrity": "sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng==", "dependencies": { "base64-js": "^1.3.0", "ecdsa-sig-formatter": "^1.0.11", @@ -21150,9 +21595,9 @@ } }, "node_modules/http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.9.tgz", + "integrity": "sha512-n1XsPy3rXVxlqxVioEWdC+0+M+SQw0DpJynwtOPo1X+ZlvdzTLtDBIJJlDQTnwZIFJrZSzSGmIOUdP8tu+SgLw==" }, "node_modules/http-proxy-agent": { "version": "5.0.0", @@ -21868,12 +22313,16 @@ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, "node_modules/is-async-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", - "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", "dev": true, "dependencies": { - "has-tostringtag": "^1.0.0" + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -22084,11 +22533,14 @@ } }, "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -22264,7 +22716,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", - "dev": true, "dependencies": { "call-bound": "^1.0.2", "gopd": "^1.2.0", @@ -22763,17 +23214,17 @@ } }, "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.2.tgz", + "integrity": "sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==", "dependencies": { "@isaacs/cliui": "^8.0.2" }, + "engines": { + "node": "20 || >=22" + }, "funding": { "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" } }, "node_modules/jaeger-client": { @@ -25353,9 +25804,9 @@ } }, "node_modules/lerna/node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", + "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", "dev": true, "dependencies": { "graceful-fs": "^4.2.0", @@ -25398,6 +25849,59 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lerna/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/lerna/node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/lerna/node_modules/glob/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/lerna/node_modules/glob/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/lerna/node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -25506,6 +26010,21 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, + "node_modules/lerna/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/lerna/node_modules/lru-cache": { "version": "7.18.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", @@ -25724,6 +26243,28 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/lerna/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/lerna/node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true + }, "node_modules/lerna/node_modules/proc-log": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", @@ -26349,7 +26890,8 @@ "node_modules/lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==" + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "deprecated": "This package is deprecated. Use the optional chaining (?.) operator instead." }, "node_modules/lodash.groupby": { "version": "4.6.0", @@ -26381,7 +26923,8 @@ "node_modules/lodash.isequal": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "deprecated": "This package is deprecated. Use require('node:util').isDeepStrictEqual instead." }, "node_modules/lodash.isfunction": { "version": "3.0.9", @@ -26508,9 +27051,9 @@ } }, "node_modules/long": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", - "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.4.tgz", + "integrity": "sha512-qtzLbJE8hq7VabR3mISmVGtoXP8KGc2Z/AT8OuqlYD7JTR3oqrgwdjnk07wpj1twXxYmgDXgoKVWUG/fReSzHg==" }, "node_modules/longest": { "version": "2.0.1", @@ -26552,9 +27095,9 @@ } }, "node_modules/loopback-connector-mysql": { - "version": "7.0.17", - "resolved": "https://registry.npmjs.org/loopback-connector-mysql/-/loopback-connector-mysql-7.0.17.tgz", - "integrity": "sha512-Oxs0hPuPHUZQXlKjymHAoHhtivaZ9TL/Eq1azQK8duvIKbDOZulpmQ5jriVw5HtpSd37BeT2PlvewxGmREEVow==", + "version": "7.0.18", + "resolved": "https://registry.npmjs.org/loopback-connector-mysql/-/loopback-connector-mysql-7.0.18.tgz", + "integrity": "sha512-dW3LdGqwV0CZ+EL5akLKF9IgLu/2qyU8zEF5HVnXAesGwrLv2ntV2MirqLDQN2G7smI58t/3a4hNvZONNTDizA==", "hasInstallScript": true, "dependencies": { "async": "^3.2.6", @@ -26570,25 +27113,25 @@ } }, "node_modules/loopback-connector-mysql/node_modules/loopback-connector": { - "version": "6.1.12", - "resolved": "https://registry.npmjs.org/loopback-connector/-/loopback-connector-6.1.12.tgz", - "integrity": "sha512-WO3FVwpbabPfe1h7SmSyB6rBySgScN9mQ0M0GwN8TWbA+0HcCP9DWFiXYPHvS4v7QXOkey62sYVW+7M1l9zkNQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/loopback-connector/-/loopback-connector-6.2.0.tgz", + "integrity": "sha512-mCYZJCdp0K4tQA5U2XJW1HgWZLCnQ8n/ss+hrLLsqKxBLCal9T3LarBFyFlLUwx4IidKJdQkndE1NUwk948VIA==", "dependencies": { "async": "^3.2.6", "bluebird": "^3.7.2", - "debug": "^4.3.7", + "debug": "^4.4.0", "msgpack5": "^4.5.1", "strong-globalize": "^6.0.6", - "uuid": "^11.0.3" + "uuid": "^11.0.5" }, "engines": { "node": ">=18" } }, "node_modules/loopback-connector-mysql/node_modules/uuid": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.0.3.tgz", - "integrity": "sha512-d0z310fCWv5dJwnX1Y/MncBAqGMKEzlBb1AOf7z9K8ALnd0utBX/msg/fA0+sbyN1ihbMsLhrBlnl1ak7Wa0rg==", + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.0.5.tgz", + "integrity": "sha512-508e6IcKLrhxKdBbcA2b4KQZlLVp2+J5UwQ6F7Drckkc5N9ZJwFa4TgWtsww9UG8fGHbm6gbV19TdM5pQ4GaIA==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" @@ -26598,9 +27141,9 @@ } }, "node_modules/loopback-connector-postgresql": { - "version": "7.1.8", - "resolved": "https://registry.npmjs.org/loopback-connector-postgresql/-/loopback-connector-postgresql-7.1.8.tgz", - "integrity": "sha512-fhEVQ+E8otQ4uwMCdiIcQC/WtxuQDgHzWLCtGB2DGuNyAVU5+eY7yGpsUJKmlpTdSVMAZp8TC6KWyYJMKev4+Q==", + "version": "7.1.9", + "resolved": "https://registry.npmjs.org/loopback-connector-postgresql/-/loopback-connector-postgresql-7.1.9.tgz", + "integrity": "sha512-3gOcH4TEeHpLpCjWg93fahGqvjyT3adFLS/2J2uTeWIqmpDXHYLix9qE8pKjbHQcCGf9skilBVIwiLA2yn8RFg==", "dependencies": { "async": "^3.2.0", "bluebird": "^3.4.6", @@ -26616,25 +27159,25 @@ } }, "node_modules/loopback-connector-postgresql/node_modules/loopback-connector": { - "version": "6.1.12", - "resolved": "https://registry.npmjs.org/loopback-connector/-/loopback-connector-6.1.12.tgz", - "integrity": "sha512-WO3FVwpbabPfe1h7SmSyB6rBySgScN9mQ0M0GwN8TWbA+0HcCP9DWFiXYPHvS4v7QXOkey62sYVW+7M1l9zkNQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/loopback-connector/-/loopback-connector-6.2.0.tgz", + "integrity": "sha512-mCYZJCdp0K4tQA5U2XJW1HgWZLCnQ8n/ss+hrLLsqKxBLCal9T3LarBFyFlLUwx4IidKJdQkndE1NUwk948VIA==", "dependencies": { "async": "^3.2.6", "bluebird": "^3.7.2", - "debug": "^4.3.7", + "debug": "^4.4.0", "msgpack5": "^4.5.1", "strong-globalize": "^6.0.6", - "uuid": "^11.0.3" + "uuid": "^11.0.5" }, "engines": { "node": ">=18" } }, "node_modules/loopback-connector-postgresql/node_modules/uuid": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.0.3.tgz", - "integrity": "sha512-d0z310fCWv5dJwnX1Y/MncBAqGMKEzlBb1AOf7z9K8ALnd0utBX/msg/fA0+sbyN1ihbMsLhrBlnl1ak7Wa0rg==", + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.0.5.tgz", + "integrity": "sha512-508e6IcKLrhxKdBbcA2b4KQZlLVp2+J5UwQ6F7Drckkc5N9ZJwFa4TgWtsww9UG8fGHbm6gbV19TdM5pQ4GaIA==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" @@ -26713,47 +27256,47 @@ } }, "node_modules/loopback-datasource-juggler": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/loopback-datasource-juggler/-/loopback-datasource-juggler-5.1.3.tgz", - "integrity": "sha512-r+fVHyziu1LhiuVDUOMF2C8vqBuHSTJvRlvGHGLMFZI/4XsjUciAFil7r1xSFepGAfBDWZEZUya67m0lb05wXQ==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/loopback-datasource-juggler/-/loopback-datasource-juggler-5.1.4.tgz", + "integrity": "sha512-DI22buY0aorxC2lgXuMaWwBlN4OSJbd7X0jAtIk1Sv8AUBYBd1izlT/po5B4vkbqGo5btkEjHRFG/Rc0F0swzg==", "dependencies": { "async": "^3.2.6", "change-case": "^4.1.2", - "debug": "^4.3.7", + "debug": "^4.4.0", "depd": "^2.0.0", - "inflection": "^3.0.0", + "inflection": "^3.0.2", "lodash": "^4.17.21", - "loopback-connector": "^6.1.12", + "loopback-connector": "^6.2.0", "minimatch": "^10.0.1", "nanoid": "^3.3.8", "neotraverse": "^0.6.18", "qs": "^6.13.1", "strong-globalize": "^6.0.6", - "uuid": "^11.0.3" + "uuid": "^11.0.5" }, "engines": { "node": ">=18" } }, "node_modules/loopback-datasource-juggler/node_modules/inflection": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/inflection/-/inflection-3.0.0.tgz", - "integrity": "sha512-1zEJU1l19SgJlmwqsEyFTbScw/tkMHFenUo//Y0i+XEP83gDFdMvPizAD/WGcE+l1ku12PcTVHQhO6g5E0UCMw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/inflection/-/inflection-3.0.2.tgz", + "integrity": "sha512-+Bg3+kg+J6JUWn8J6bzFmOWkTQ6L/NHfDRSYU+EVvuKHDxUDHAXgqixHfVlzuBQaPOTac8hn43aPhMNk6rMe3g==", "engines": { "node": ">=18.0.0" } }, "node_modules/loopback-datasource-juggler/node_modules/loopback-connector": { - "version": "6.1.12", - "resolved": "https://registry.npmjs.org/loopback-connector/-/loopback-connector-6.1.12.tgz", - "integrity": "sha512-WO3FVwpbabPfe1h7SmSyB6rBySgScN9mQ0M0GwN8TWbA+0HcCP9DWFiXYPHvS4v7QXOkey62sYVW+7M1l9zkNQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/loopback-connector/-/loopback-connector-6.2.0.tgz", + "integrity": "sha512-mCYZJCdp0K4tQA5U2XJW1HgWZLCnQ8n/ss+hrLLsqKxBLCal9T3LarBFyFlLUwx4IidKJdQkndE1NUwk948VIA==", "dependencies": { "async": "^3.2.6", "bluebird": "^3.7.2", - "debug": "^4.3.7", + "debug": "^4.4.0", "msgpack5": "^4.5.1", "strong-globalize": "^6.0.6", - "uuid": "^11.0.3" + "uuid": "^11.0.5" }, "engines": { "node": ">=18" @@ -26774,9 +27317,9 @@ } }, "node_modules/loopback-datasource-juggler/node_modules/uuid": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.0.3.tgz", - "integrity": "sha512-d0z310fCWv5dJwnX1Y/MncBAqGMKEzlBb1AOf7z9K8ALnd0utBX/msg/fA0+sbyN1ihbMsLhrBlnl1ak7Wa0rg==", + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.0.5.tgz", + "integrity": "sha512-508e6IcKLrhxKdBbcA2b4KQZlLVp2+J5UwQ6F7Drckkc5N9ZJwFa4TgWtsww9UG8fGHbm6gbV19TdM5pQ4GaIA==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" @@ -26786,9 +27329,9 @@ } }, "node_modules/loopback4-authentication": { - "version": "12.1.1", - "resolved": "https://registry.npmjs.org/loopback4-authentication/-/loopback4-authentication-12.1.1.tgz", - "integrity": "sha512-30GQ6TEeoN4nSJYGAMuYd4XEEfOPug77J3Q+yRKCBZyDghRq2Hu4sU78bXjNe39sG7Jf1kzLKL+xF9kYJsarYQ==", + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/loopback4-authentication/-/loopback4-authentication-12.2.0.tgz", + "integrity": "sha512-LfVqSDE+g25Nl5j8kSahKzzmXsO2sBesyC7pnPIvcrNyyV5CUpUSdPmaSooz+N8quNDKLn0b72XZyB9+sKQ5xQ==", "dependencies": { "@loopback/context": "^7.0.9", "@loopback/core": "^6.1.6", @@ -26922,6 +27465,326 @@ "node": ">=18" } }, + "node_modules/loopback4-s3/node_modules/@smithy/abort-controller": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.9.tgz", + "integrity": "sha512-yiW0WI30zj8ZKoSYNx90no7ugVn3khlyH/z5W8qtKBtVE6awRALbhSG+2SAHA1r6bO/6M9utxYKVZ3PCJ1rWxw==", + "dependencies": { + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/loopback4-s3/node_modules/@smithy/core": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-2.5.7.tgz", + "integrity": "sha512-8olpW6mKCa0v+ibCjoCzgZHQx1SQmZuW/WkrdZo73wiTprTH6qhmskT60QLFdT9DRa5mXxjz89kQPZ7ZSsoqqg==", + "dependencies": { + "@smithy/middleware-serde": "^3.0.11", + "@smithy/protocol-http": "^4.1.8", + "@smithy/types": "^3.7.2", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-middleware": "^3.0.11", + "@smithy/util-stream": "^3.3.4", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/loopback4-s3/node_modules/@smithy/fetch-http-handler": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-4.1.3.tgz", + "integrity": "sha512-6SxNltSncI8s689nvnzZQc/dPXcpHQ34KUj6gR/HBroytKOd/isMG3gJF/zBE1TBmTT18TXyzhg3O3SOOqGEhA==", + "dependencies": { + "@smithy/protocol-http": "^4.1.8", + "@smithy/querystring-builder": "^3.0.11", + "@smithy/types": "^3.7.2", + "@smithy/util-base64": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/loopback4-s3/node_modules/@smithy/is-array-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", + "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/loopback4-s3/node_modules/@smithy/middleware-endpoint": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.2.8.tgz", + "integrity": "sha512-OEJZKVUEhMOqMs3ktrTWp7UvvluMJEvD5XgQwRePSbDg1VvBaL8pX8mwPltFn6wk1GySbcVwwyldL8S+iqnrEQ==", + "dependencies": { + "@smithy/core": "^2.5.7", + "@smithy/middleware-serde": "^3.0.11", + "@smithy/node-config-provider": "^3.1.12", + "@smithy/shared-ini-file-loader": "^3.1.12", + "@smithy/types": "^3.7.2", + "@smithy/url-parser": "^3.0.11", + "@smithy/util-middleware": "^3.0.11", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/loopback4-s3/node_modules/@smithy/middleware-serde": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.11.tgz", + "integrity": "sha512-KzPAeySp/fOoQA82TpnwItvX8BBURecpx6ZMu75EZDkAcnPtO6vf7q4aH5QHs/F1s3/snQaSFbbUMcFFZ086Mw==", + "dependencies": { + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/loopback4-s3/node_modules/@smithy/middleware-stack": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.11.tgz", + "integrity": "sha512-1HGo9a6/ikgOMrTrWL/WiN9N8GSVYpuRQO5kjstAq4CvV59bjqnh7TbdXGQ4vxLD3xlSjfBjq5t1SOELePsLnA==", + "dependencies": { + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/loopback4-s3/node_modules/@smithy/node-config-provider": { + "version": "3.1.12", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.12.tgz", + "integrity": "sha512-O9LVEu5J/u/FuNlZs+L7Ikn3lz7VB9hb0GtPT9MQeiBmtK8RSY3ULmsZgXhe6VAlgTw0YO+paQx4p8xdbs43vQ==", + "dependencies": { + "@smithy/property-provider": "^3.1.11", + "@smithy/shared-ini-file-loader": "^3.1.12", + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/loopback4-s3/node_modules/@smithy/node-http-handler": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.3.3.tgz", + "integrity": "sha512-BrpZOaZ4RCbcJ2igiSNG16S+kgAc65l/2hmxWdmhyoGWHTLlzQzr06PXavJp9OBlPEG/sHlqdxjWmjzV66+BSQ==", + "dependencies": { + "@smithy/abort-controller": "^3.1.9", + "@smithy/protocol-http": "^4.1.8", + "@smithy/querystring-builder": "^3.0.11", + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/loopback4-s3/node_modules/@smithy/property-provider": { + "version": "3.1.11", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.11.tgz", + "integrity": "sha512-I/+TMc4XTQ3QAjXfOcUWbSS073oOEAxgx4aZy8jHaf8JQnRkq2SZWw8+PfDtBvLUjcGMdxl+YwtzWe6i5uhL/A==", + "dependencies": { + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/loopback4-s3/node_modules/@smithy/protocol-http": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.8.tgz", + "integrity": "sha512-hmgIAVyxw1LySOwkgMIUN0kjN8TG9Nc85LJeEmEE/cNEe2rkHDUWhnJf2gxcSRFLWsyqWsrZGw40ROjUogg+Iw==", + "dependencies": { + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/loopback4-s3/node_modules/@smithy/querystring-builder": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.11.tgz", + "integrity": "sha512-u+5HV/9uJaeLj5XTb6+IEF/dokWWkEqJ0XiaRRogyREmKGUgZnNecLucADLdauWFKUNbQfulHFEZEdjwEBjXRg==", + "dependencies": { + "@smithy/types": "^3.7.2", + "@smithy/util-uri-escape": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/loopback4-s3/node_modules/@smithy/querystring-parser": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.11.tgz", + "integrity": "sha512-Je3kFvCsFMnso1ilPwA7GtlbPaTixa3WwC+K21kmMZHsBEOZYQaqxcMqeFFoU7/slFjKDIpiiPydvdJm8Q/MCw==", + "dependencies": { + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/loopback4-s3/node_modules/@smithy/shared-ini-file-loader": { + "version": "3.1.12", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.12.tgz", + "integrity": "sha512-1xKSGI+U9KKdbG2qDvIR9dGrw3CNx+baqJfyr0igKEpjbHL5stsqAesYBzHChYHlelWtb87VnLWlhvfCz13H8Q==", + "dependencies": { + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/loopback4-s3/node_modules/@smithy/smithy-client": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.7.0.tgz", + "integrity": "sha512-9wYrjAZFlqWhgVo3C4y/9kpc68jgiSsKUnsFPzr/MSiRL93+QRDafGTfhhKAb2wsr69Ru87WTiqSfQusSmWipA==", + "dependencies": { + "@smithy/core": "^2.5.7", + "@smithy/middleware-endpoint": "^3.2.8", + "@smithy/middleware-stack": "^3.0.11", + "@smithy/protocol-http": "^4.1.8", + "@smithy/types": "^3.7.2", + "@smithy/util-stream": "^3.3.4", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/loopback4-s3/node_modules/@smithy/types": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.7.2.tgz", + "integrity": "sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/loopback4-s3/node_modules/@smithy/url-parser": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.11.tgz", + "integrity": "sha512-TmlqXkSk8ZPhfc+SQutjmFr5FjC0av3GZP4B/10caK1SbRwe/v+Wzu/R6xEKxoNqL+8nY18s1byiy6HqPG37Aw==", + "dependencies": { + "@smithy/querystring-parser": "^3.0.11", + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + } + }, + "node_modules/loopback4-s3/node_modules/@smithy/util-base64": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-3.0.0.tgz", + "integrity": "sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==", + "dependencies": { + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/loopback4-s3/node_modules/@smithy/util-body-length-browser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-3.0.0.tgz", + "integrity": "sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ==", + "dependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/loopback4-s3/node_modules/@smithy/util-buffer-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", + "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", + "dependencies": { + "@smithy/is-array-buffer": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/loopback4-s3/node_modules/@smithy/util-hex-encoding": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-3.0.0.tgz", + "integrity": "sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/loopback4-s3/node_modules/@smithy/util-middleware": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.11.tgz", + "integrity": "sha512-dWpyc1e1R6VoXrwLoLDd57U1z6CwNSdkM69Ie4+6uYh2GC7Vg51Qtan7ITzczuVpqezdDTKJGJB95fFvvjU/ow==", + "dependencies": { + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/loopback4-s3/node_modules/@smithy/util-stream": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.3.4.tgz", + "integrity": "sha512-SGhGBG/KupieJvJSZp/rfHHka8BFgj56eek9px4pp7lZbOF+fRiVr4U7A3y3zJD8uGhxq32C5D96HxsTC9BckQ==", + "dependencies": { + "@smithy/fetch-http-handler": "^4.1.3", + "@smithy/node-http-handler": "^3.3.3", + "@smithy/types": "^3.7.2", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-hex-encoding": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/loopback4-s3/node_modules/@smithy/util-uri-escape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-3.0.0.tgz", + "integrity": "sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/loopback4-s3/node_modules/@smithy/util-utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", + "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", + "dependencies": { + "@smithy/util-buffer-from": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/loopback4-soft-delete": { "version": "10.0.3", "resolved": "https://registry.npmjs.org/loopback4-soft-delete/-/loopback4-soft-delete-10.0.3.tgz", @@ -27997,11 +28860,10 @@ } }, "node_modules/mocha": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.0.1.tgz", - "integrity": "sha512-+3GkODfsDG71KSCQhc4IekSW+ItCK/kiez1Z28ksWvYhKXV/syxMlerR/sC7whDp7IyreZ4YxceMLdTs5hQE8A==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.1.0.tgz", + "integrity": "sha512-8uJR5RTC2NgpY3GrYcgpZrsEd9zKbPDpob1RezyR2upGHRQtHWofmzTMzTMSV6dru3tj5Ukt0+Vnq1qhFEEwAg==", "dev": true, - "peer": true, "dependencies": { "ansi-colors": "^4.1.3", "browser-stdout": "^1.3.1", @@ -28020,8 +28882,8 @@ "strip-json-comments": "^3.1.1", "supports-color": "^8.1.1", "workerpool": "^6.5.1", - "yargs": "^16.2.0", - "yargs-parser": "^20.2.9", + "yargs": "^17.7.2", + "yargs-parser": "^21.1.1", "yargs-unparser": "^2.0.0" }, "bin": { @@ -28032,16 +28894,54 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/mocha/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "node_modules/mocha/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, - "peer": true, "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mocha/node_modules/glob/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mocha/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" } }, "node_modules/mocha/node_modules/minimatch": { @@ -28049,7 +28949,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, - "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -28057,33 +28956,29 @@ "node": ">=10" } }, - "node_modules/mocha/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "node_modules/mocha/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, - "peer": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, "engines": { - "node": ">=10" + "node": ">=16 || 14 >=14.17" } }, - "node_modules/mocha/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "node_modules/mocha/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, - "peer": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, "engines": { - "node": ">=10" + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/mochawesome": { @@ -28168,9 +29063,9 @@ } }, "node_modules/moment-timezone": { - "version": "0.5.46", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.46.tgz", - "integrity": "sha512-ZXm9b36esbe7OmdABqIWJuBBiLLwAjrN7CE+7sYdCCx82Nabt1wHDj8TVseS59QIlfFPbOoiBPm6ca9BioG4hw==", + "version": "0.5.47", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.47.tgz", + "integrity": "sha512-UbNt/JAWS0m/NJOebR0QMRHBk0hu03r5dx9GK8Cs0AS3I81yDcOc9k+DytPItgVvBP7J6Mf6U2n3BPAacAV9oA==", "dependencies": { "moment": "^2.29.4" }, @@ -28581,9 +29476,9 @@ } }, "node_modules/napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", + "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", "dev": true }, "node_modules/natural-compare": { @@ -28703,9 +29598,9 @@ } }, "node_modules/node-abi": { - "version": "3.71.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.71.0.tgz", - "integrity": "sha512-SZ40vRiy/+wRTf21hxkkEjPJZpARzUMVcJoQse2EF8qkUWbbO2z7vd5oA/H6bVH6SZQ5STGcu0KRDS7biNRfxw==", + "version": "3.73.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.73.0.tgz", + "integrity": "sha512-z8iYzQGBu35ZkTQ9mtR8RqugJZ9RCLn8fv3d7LsgDBzOijGQP3RdKTX4LA7LXw03ZhU5z0l4xfhIMgSES31+cg==", "dev": true, "dependencies": { "semver": "^7.3.5" @@ -29172,9 +30067,9 @@ "dev": true }, "node_modules/nodemailer": { - "version": "6.9.16", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.16.tgz", - "integrity": "sha512-psAuZdTIRN08HKVd/E8ObdV6NO7NTBY3KsC30F7M4H1OnmLCUNaS56FpYxyb26zWLSyYF9Ozch9KYHhHegsiOQ==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.10.0.tgz", + "integrity": "sha512-SQ3wZCExjeSatLE/HBaXS5vqUOQk6GtBdIIKxiFdmm01mOQZX/POJkO3SUX1wDiYcwUOJwT23scFSC9fY2H8IA==", "engines": { "node": ">=6.0.0" } @@ -29586,6 +30481,33 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/npm-registry-fetch/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm-registry-fetch/node_modules/glob/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/npm-registry-fetch/node_modules/hosted-git-info": { "version": "6.1.3", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.3.tgz", @@ -29597,6 +30519,20 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/npm-registry-fetch/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/npm-registry-fetch/node_modules/lru-cache": { "version": "7.18.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", @@ -29676,6 +30612,26 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/npm-registry-fetch/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm-registry-fetch/node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, "node_modules/npm-registry-fetch/node_modules/proc-log": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", @@ -29856,9 +30812,9 @@ } }, "node_modules/nx/node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", + "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", "dev": true, "dependencies": { "graceful-fs": "^4.2.0", @@ -30507,9 +31463,9 @@ } }, "node_modules/opentok": { - "version": "2.18.1", - "resolved": "https://registry.npmjs.org/opentok/-/opentok-2.18.1.tgz", - "integrity": "sha512-0dbqGAKKGikEuRUwhbHuhF/nyUH+r4gv3MYy1QpZInD78JpvcKeaX1FgUJjhUYERiVGf4rGay1njAvM6v9hg8g==", + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/opentok/-/opentok-2.20.0.tgz", + "integrity": "sha512-ydmI0mWvMnJF85KjJBT9lylOhCBY6H5MJ00rMhpeLY72pwo0SrfZqKkhfBJNsvR+GB5dnO498EqylIev0jaaQw==", "dependencies": { "jsonwebtoken": "9.0.2", "lodash": "4.17.21", @@ -30699,6 +31655,23 @@ "@otplib/preset-v11": "^12.0.1" } }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/p-cancelable": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", @@ -31056,11 +32029,11 @@ } }, "node_modules/pacote/node_modules/@sigstore/protobuf-specs": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.2.tgz", - "integrity": "sha512-c6B0ehIWxMI8wiS/bj6rHMPqeFvngFV7cDU/MY+B16P9Z3Mp9k8L93eYZ7BYzSickzuqAQqAq0V956b3Ju6mLw==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.3.tgz", + "integrity": "sha512-RpacQhBlwpBWd7KEJsRKcBQalbV28fvkxwTOJIqhIuDysMMaJW47V4OqW30iJB9uRpqOSxxEAQFdr8tTattReQ==", "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/pacote/node_modules/@sigstore/sign": { @@ -31152,6 +32125,25 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/pacote/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/pacote/node_modules/ignore-walk": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.5.tgz", @@ -31163,6 +32155,20 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/pacote/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/pacote/node_modules/make-fetch-happen": { "version": "13.0.1", "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.1.tgz", @@ -31308,6 +32314,21 @@ "node": "^16.14.0 || >=18.0.0" } }, + "node_modules/pacote/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/pacote/node_modules/read-package-json": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-7.0.1.tgz", @@ -31895,9 +32916,9 @@ } }, "node_modules/patch-package/node_modules/yaml": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.1.tgz", - "integrity": "sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", + "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", "bin": { "yaml": "bin.mjs" }, @@ -31949,20 +32970,28 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", + "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" }, "engines": { - "node": ">=16 || 14 >=14.18" + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.2.tgz", + "integrity": "sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==", + "engines": { + "node": "20 || >=22" + } + }, "node_modules/path-scurry/node_modules/minipass": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", @@ -32422,9 +33451,9 @@ } }, "node_modules/prebuild-install": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", - "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", + "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", "dev": true, "dependencies": { "detect-libc": "^2.0.0", @@ -32432,7 +33461,7 @@ "github-from-package": "0.0.0", "minimist": "^1.2.3", "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", + "napi-build-utils": "^2.0.0", "node-abi": "^3.3.0", "pump": "^3.0.0", "rc": "^1.2.7", @@ -33462,11 +34491,11 @@ } }, "node_modules/qs": { - "version": "6.13.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.1.tgz", - "integrity": "sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", "dependencies": { - "side-channel": "^1.0.6" + "side-channel": "^1.1.0" }, "engines": { "node": ">=0.6" @@ -33695,6 +34724,25 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/read-package-json/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/read-package-json/node_modules/hosted-git-info": { "version": "6.1.3", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.3.tgz", @@ -33706,7 +34754,7 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/read-package-json/node_modules/lru-cache": { + "node_modules/read-package-json/node_modules/hosted-git-info/node_modules/lru-cache": { "version": "7.18.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", @@ -33714,6 +34762,28 @@ "node": ">=12" } }, + "node_modules/read-package-json/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/read-package-json/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/read-package-json/node_modules/normalize-package-data": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", @@ -33736,6 +34806,21 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/read-package-json/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/read-pkg": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", @@ -34068,18 +35153,18 @@ "integrity": "sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A==" }, "node_modules/reflect.getprototypeof": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.9.tgz", - "integrity": "sha512-r0Ay04Snci87djAsI4U+WNRcSw5S4pOH7qFjd/veA5gC7TbqESR3tcj28ia95L/fYUDw11JKP7uqUKUAfVvV5Q==", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", "dev": true, "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", - "dunder-proto": "^1.0.1", - "es-abstract": "^1.23.6", + "es-abstract": "^1.23.9", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "gopd": "^1.2.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", "which-builtin-type": "^1.2.1" }, "engines": { @@ -34103,14 +35188,16 @@ "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" }, "node_modules/regexp.prototype.flags": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz", - "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", "dev": true, "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", "set-function-name": "^2.0.2" }, "engines": { @@ -34384,6 +35471,66 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rimraf/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/rimraf/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/rimraf/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/rrweb-cssom": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz", @@ -34482,11 +35629,32 @@ "integrity": "sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==", "optional": true }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-push-apply/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, "node_modules/safe-regex-test": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", - "dev": true, "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -34838,6 +36006,20 @@ "node": ">= 0.4" } }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", @@ -35151,6 +36333,47 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/sigstore/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sigstore/node_modules/glob/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/sigstore/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/sigstore/node_modules/lru-cache": { "version": "7.18.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", @@ -35216,6 +36439,26 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/sigstore/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sigstore/node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, "node_modules/sigstore/node_modules/ssri": { "version": "10.0.6", "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz", @@ -35733,9 +36976,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.20", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz", - "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==" + "version": "3.0.21", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", + "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==" }, "node_modules/spdx-license-list": { "version": "6.9.0", @@ -36638,12 +37881,12 @@ "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" }, "node_modules/strong-error-handler": { - "version": "5.0.14", - "resolved": "https://registry.npmjs.org/strong-error-handler/-/strong-error-handler-5.0.14.tgz", - "integrity": "sha512-z9zuPyymIeoU0mTsaMvtIGyeiTNSBigSmLCFfbVIcS3FZA9d4g/t0k+jKhlR8rzVj4ppdz9kWCcchUkRrcP0vw==", + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/strong-error-handler/-/strong-error-handler-5.0.15.tgz", + "integrity": "sha512-AIUC4SR/uRZ0i1ol53S6J6Rir/p8NpYAnRaH/nEeZbVO+X9Y2B3TXgIiYwwSGJcr080lCTtfkjX+Ev7zYyCuEg==", "dependencies": { "accepts": "^1.3.8", - "debug": "^4.3.7", + "debug": "^4.4.0", "fast-safe-stringify": "^2.1.1", "handlebars": "^4.7.8", "http-status": "^1.8.1", @@ -37312,9 +38555,9 @@ } }, "node_modules/tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.2.tgz", + "integrity": "sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==", "dev": true, "dependencies": { "chownr": "^1.1.1", @@ -37863,14 +39106,14 @@ } }, "node_modules/traverse": { - "version": "0.6.10", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.10.tgz", - "integrity": "sha512-hN4uFRxbK+PX56DxYiGHsTn2dME3TVr9vbNqlQGcGcPhJAn+tdP126iA+TArMpI4YSgnTkMWyoLl5bf81Hi5TA==", + "version": "0.6.11", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.11.tgz", + "integrity": "sha512-vxXDZg8/+p3gblxB6BhhG5yWVn1kGRlaL8O78UDXc3wRnPizB5g83dcvWV1jpDMIPnjZjOFuxlMmE82XJ4407w==", "dev": true, "dependencies": { - "gopd": "^1.0.1", - "typedarray.prototype.slice": "^1.0.3", - "which-typed-array": "^1.1.15" + "gopd": "^1.2.0", + "typedarray.prototype.slice": "^1.0.5", + "which-typed-array": "^1.1.18" }, "engines": { "node": ">= 0.4" @@ -37995,9 +39238,9 @@ } }, "node_modules/ts-loader": { - "version": "9.5.1", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.1.tgz", - "integrity": "sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==", + "version": "9.5.2", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.2.tgz", + "integrity": "sha512-Qo4piXvOTWcMGIgRiuFa6nHNm+54HbYaZCKqc9eeZCLRy3XqafQgwX2F7mofrbJG3g7EEb+lkiR+z2Lic2s3Zw==", "dev": true, "dependencies": { "chalk": "^4.1.0", @@ -38592,6 +39835,47 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/tuf-js/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/tuf-js/node_modules/glob/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/tuf-js/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/tuf-js/node_modules/lru-cache": { "version": "7.18.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", @@ -38657,6 +39941,26 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/tuf-js/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/tuf-js/node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, "node_modules/tuf-js/node_modules/ssri": { "version": "10.0.6", "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz", @@ -38901,17 +40205,19 @@ } }, "node_modules/typedarray.prototype.slice": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typedarray.prototype.slice/-/typedarray.prototype.slice-1.0.3.tgz", - "integrity": "sha512-8WbVAQAUlENo1q3c3zZYuy5k9VzBQvp8AX9WOtbvyWlLM1v5JaSRmjubLjzHF4JFtptjH/5c/i95yaElvcjC0A==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/typedarray.prototype.slice/-/typedarray.prototype.slice-1.0.5.tgz", + "integrity": "sha512-q7QNVDGTdl702bVFiI5eY4l/HkgCM6at9KhcFbgUAzezHFbOVy4+0O/lCjsABEQwbZPravVfBIiBVGo89yzHFg==", "dev": true, "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", + "es-abstract": "^1.23.9", "es-errors": "^1.3.0", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-offset": "^1.0.2" + "get-proto": "^1.0.1", + "math-intrinsics": "^1.1.0", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-offset": "^1.0.4" }, "engines": { "node": ">= 0.4" @@ -39048,9 +40354,9 @@ "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==" }, "node_modules/undici": { - "version": "5.28.4", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz", - "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==", + "version": "5.28.5", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.5.tgz", + "integrity": "sha512-zICwjrDrcrUE0pyyJc1I2QzBkLM8FINsgOrt6WjA+BgajVq9Nxu2PbFFXUrAggLfDXlZGZBVZYw7WNV5KiBiBA==", "dependencies": { "@fastify/busboy": "^2.0.0" }, @@ -39198,9 +40504,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", - "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz", + "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==", "dev": true, "funding": [ { @@ -39218,7 +40524,7 @@ ], "dependencies": { "escalade": "^3.2.0", - "picocolors": "^1.1.0" + "picocolors": "^1.1.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -39798,9 +41104,9 @@ "integrity": "sha512-h0l57vFJ4YQe1/U+C+oqBfAoopxXABUm6VqWM0x2gg4pARru4IUWo/PAxyawWgbGtndXrZbA41EzsfxacZVEXQ==" }, "node_modules/when-exit": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/when-exit/-/when-exit-2.1.3.tgz", - "integrity": "sha512-uVieSTccFIr/SFQdFWN/fFaQYmV37OKtuaGphMAzi4DmmUlrvRBJW5WSLkHyjNQY/ePJMz3LoiX9R3yy1Su6Hw==" + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/when-exit/-/when-exit-2.1.4.tgz", + "integrity": "sha512-4rnvd3A1t16PWzrBUcSDZqcAmsUIy4minDXT/CZ8F2mVDgd65i4Aalimgz1aQkRGU0iH5eT5+6Rx2TK8o443Pg==" }, "node_modules/which": { "version": "4.0.0", @@ -40287,16 +41593,13 @@ } }, "node_modules/xml-encryption": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/xml-encryption/-/xml-encryption-3.0.2.tgz", - "integrity": "sha512-VxYXPvsWB01/aqVLd6ZMPWZ+qaj0aIdF+cStrVJMcFj3iymwZeI0ABzB3VqMYv48DkSpRhnrXqTUkR34j+UDyg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/xml-encryption/-/xml-encryption-3.1.0.tgz", + "integrity": "sha512-PV7qnYpoAMXbf1kvQkqMScLeQpjCMixddAKq9PtqVrho8HnYbBOWNfG0kA4R7zxQDo7w9kiYAyzS/ullAyO55Q==", "dependencies": { "@xmldom/xmldom": "^0.8.5", "escape-html": "^1.0.3", "xpath": "0.0.32" - }, - "engines": { - "node": ">=12" } }, "node_modules/xml-encryption/node_modules/xpath": { @@ -41124,9 +42427,9 @@ } }, "node_modules/yeoman-environment/node_modules/readable-stream": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.6.0.tgz", - "integrity": "sha512-cbAdYt0VcnpN2Bekq7PU+k363ZRsPwJoEEJOEtSJQlJXzwaxt3FIo/uL+KeDSGIjJqtkwyge4KQgD2S2kd+CQw==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", @@ -41352,6 +42655,33 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/yeoman-generator/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/yeoman-generator/node_modules/glob/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/yeoman-generator/node_modules/hosted-git-info": { "version": "6.1.3", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.3.tgz", @@ -41379,6 +42709,20 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, + "node_modules/yeoman-generator/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/yeoman-generator/node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -41525,6 +42869,26 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/yeoman-generator/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/yeoman-generator/node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, "node_modules/yeoman-generator/node_modules/proc-log": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", @@ -41989,9 +43353,9 @@ } }, "packages/cache/node_modules/typescript": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -42774,9 +44138,9 @@ } }, "packages/core/node_modules/typescript": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -42890,9 +44254,9 @@ } }, "packages/feature-toggle/node_modules/typescript": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -42945,9 +44309,9 @@ } }, "packages/file-utils/node_modules/typescript": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -42999,9 +44363,9 @@ } }, "sandbox/audit-ms-example/node_modules/typescript": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -43272,9 +44636,9 @@ } }, "sandbox/auth-mfa-example/node_modules/typescript": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -43340,53 +44704,272 @@ } }, "sandbox/auth-ms-basic-example": { - "name": "@sourceloop/auth-ms-basic-example", - "version": "0.14.7", + "name": "-auth-basic-login-signup-example", + "version": "0.0.1", "license": "MIT", "dependencies": { "@loopback/boot": "^7.0.9", "@loopback/context": "^7.0.9", "@loopback/core": "^6.1.6", + "@loopback/openapi-v3": "^10.0.9", "@loopback/repository": "^7.0.9", - "@loopback/repository-json-schema": "^8.0.9", "@loopback/rest": "^14.0.9", "@loopback/rest-explorer": "^7.0.9", "@loopback/service-proxy": "^7.0.9", + "@opentelemetry/exporter-jaeger": "^1.15.0", + "@opentelemetry/plugin-dns": "^0.15.0", + "@opentelemetry/plugin-http": "^0.18.2", + "@opentelemetry/plugin-https": "^0.18.2", + "@opentelemetry/plugin-pg": "^0.15.0", + "@opentelemetry/plugin-pg-pool": "^0.15.0", + "@opentelemetry/sdk-trace-base": "^1.15.0", + "@opentelemetry/sdk-trace-node": "^1.15.0", "@sourceloop/authentication-service": "^20.0.2", "@sourceloop/core": "^15.0.2", - "ajv": "^8.11.0", - "ajv-errors": "^3.0.0", - "bcrypt": "^5.0.1", - "db-migrate": "^1.0.0-beta.21", - "db-migrate-pg": "^1.3.0", + "bcrypt": "^5.1.1", "dotenv": "^16.4.5", "dotenv-extended": "^2.9.0", "loopback-connector-kv-redis": "^4.0.0", "loopback-connector-postgresql": "^7.1.8", "loopback4-authentication": "^12.1.1", "loopback4-authorization": "^7.0.3", - "loopback4-soft-delete": "^10.0.3", - "prom-client": "^14.0.1", + "swagger-stats": "^0.99.5", + "symlink-resolver": "0.2.1", "tslib": "^2.6.2" }, "devDependencies": { + "@istanbuljs/nyc-config-typescript": "^1.0.2", "@loopback/build": "^11.0.8", "@loopback/eslint-config": "^15.0.4", "@loopback/testlab": "^7.0.8", - "@types/bcrypt": "^5.0.0", + "@types/bcrypt": "^5.0.2", "@types/node": "^20.12.7", "eslint": "^8.57.0", + "nodemon": "^2.0.21", + "nyc": "^15.1.0", "source-map-support": "^0.5.21", "typescript": "^5.4.5" }, "engines": { - "node": "18 || 20" + "node": ">=18" + } + }, + "sandbox/auth-ms-basic-example/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "sandbox/auth-ms-basic-example/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "sandbox/auth-ms-basic-example/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "sandbox/auth-ms-basic-example/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "sandbox/auth-ms-basic-example/node_modules/foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "sandbox/auth-ms-basic-example/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "sandbox/auth-ms-basic-example/node_modules/istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "sandbox/auth-ms-basic-example/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "sandbox/auth-ms-basic-example/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "sandbox/auth-ms-basic-example/node_modules/nyc": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", + "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", + "dev": true, + "dependencies": { + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "caching-transform": "^4.0.0", + "convert-source-map": "^1.7.0", + "decamelize": "^1.2.0", + "find-cache-dir": "^3.2.0", + "find-up": "^4.1.0", + "foreground-child": "^2.0.0", + "get-package-type": "^0.1.0", + "glob": "^7.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-processinfo": "^2.0.2", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "make-dir": "^3.0.0", + "node-preload": "^0.2.1", + "p-map": "^3.0.0", + "process-on-spawn": "^1.0.0", + "resolve-from": "^5.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "spawn-wrap": "^2.0.0", + "test-exclude": "^6.0.0", + "yargs": "^15.0.2" + }, + "bin": { + "nyc": "bin/nyc.js" + }, + "engines": { + "node": ">=8.9" + } + }, + "sandbox/auth-ms-basic-example/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "sandbox/auth-ms-basic-example/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "sandbox/auth-ms-basic-example/node_modules/p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "sandbox/auth-ms-basic-example/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "sandbox/auth-ms-basic-example/node_modules/typescript": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -43396,6 +44979,61 @@ "node": ">=14.17" } }, + "sandbox/auth-ms-basic-example/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "sandbox/auth-ms-basic-example/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "sandbox/auth-ms-basic-example/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "sandbox/auth-ms-basic-example/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, "sandbox/auth-multitenant-example": { "name": "@sourceloop/auth-multitenant-example", "version": "7.2.7", @@ -43444,9 +45082,9 @@ } }, "sandbox/auth-multitenant-example/node_modules/typescript": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -43718,9 +45356,9 @@ } }, "sandbox/auth-public-private-client/node_modules/typescript": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -43820,9 +45458,9 @@ } }, "sandbox/cache-example/node_modules/typescript": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -43869,9 +45507,9 @@ } }, "sandbox/feature-toggle-example/node_modules/typescript": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -43918,9 +45556,9 @@ } }, "sandbox/in-mail-example/node_modules/typescript": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -44341,9 +45979,9 @@ } }, "sandbox/nestjs-auth-ms-example/node_modules/typescript": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -44392,9 +46030,9 @@ } }, "sandbox/notification-socket-example/node_modules/typescript": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -44439,9 +46077,9 @@ } }, "sandbox/oauth-example/node_modules/typescript": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -44480,9 +46118,9 @@ } }, "sandbox/oidc-basic-example/node_modules/typescript": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -44528,9 +46166,9 @@ } }, "sandbox/payment-example/node_modules/typescript": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -44584,9 +46222,9 @@ } }, "sandbox/pubnub-example/node_modules/typescript": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -44634,9 +46272,9 @@ } }, "sandbox/scheduler-example/node_modules/typescript": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -44686,9 +46324,9 @@ } }, "sandbox/search-ms-example/node_modules/typescript": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -44737,9 +46375,9 @@ } }, "sandbox/task-example/node_modules/typescript": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -45010,9 +46648,9 @@ } }, "sandbox/user-tenant-example/node_modules/typescript": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -45117,9 +46755,9 @@ } }, "sandbox/video-conferencing-ms-example/node_modules/typescript": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -45171,9 +46809,9 @@ } }, "sandbox/workflow-ms-example/node_modules/typescript": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -45231,9 +46869,9 @@ } }, "services/audit-service/node_modules/typescript": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -45586,9 +47224,9 @@ } }, "services/authentication-service/node_modules/typescript": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -45705,9 +47343,9 @@ } }, "services/bpmn-service/node_modules/typescript": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -45979,9 +47617,9 @@ } }, "services/chat-service/node_modules/typescript": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -46106,9 +47744,9 @@ } }, "services/feature-toggle-service/node_modules/typescript": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -46375,9 +48013,9 @@ } }, "services/in-mail-service/node_modules/typescript": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -46942,9 +48580,9 @@ } }, "services/notification-service/node_modules/typescript": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -47327,9 +48965,9 @@ } }, "services/oidc-service/node_modules/typescript": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -47448,9 +49086,9 @@ } }, "services/payment-service/node_modules/typescript": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -47508,9 +49146,9 @@ "dev": true }, "services/reporting-service/node_modules/typescript": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -48002,9 +49640,9 @@ } }, "services/scheduler-service/node_modules/typescript": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -48522,9 +50160,9 @@ } }, "services/search-service/node_modules/typescript": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -48827,9 +50465,9 @@ } }, "services/survey-service/node_modules/typescript": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -49175,9 +50813,9 @@ } }, "services/task-service/node_modules/typescript": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -49386,9 +51024,9 @@ } }, "services/user-tenant-service/node_modules/typescript": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -49950,9 +51588,9 @@ } }, "services/video-conferencing-service/node_modules/typescript": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "dev": true, "bin": { "tsc": "bin/tsc", diff --git a/sandbox/auth-ms-basic-example/src/services/user-ops.service.ts b/sandbox/auth-ms-basic-example/src/services/user-ops.service.ts index 88409a0228..5f013d1de8 100755 --- a/sandbox/auth-ms-basic-example/src/services/user-ops.service.ts +++ b/sandbox/auth-ms-basic-example/src/services/user-ops.service.ts @@ -37,7 +37,7 @@ export class UserOpsService { ) {} createUserToken(dto: DataObject<SignupRequestResponseDto>) { - console.log(dto); + console.log(dto); //NOSONAR } async createUser(user: LocalUserProfileDto, options: AnyObject) {