diff --git a/.circleci/config.yml b/.circleci/config.yml index fe3505ae4..81bb97152 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -6,7 +6,7 @@ orbs: jobs: e2e_test_as_node_module: docker: - - image: cimg/node:22.4.1 + - image: cimg/node:22.12.0 working_directory: ~/repo steps: - checkout @@ -15,7 +15,7 @@ jobs: e2e_test_as_cli: docker: - - image: cimg/node:22.4.1 + - image: cimg/node:22.12.0 working_directory: ~/repo steps: - checkout @@ -66,15 +66,42 @@ jobs: name: Publish package command: npm publish + deploy_beta: + parameters: + v: + type: string + default: "lts" + docker: + - image: cimg/node:<< parameters.v >> + working_directory: ~/repo + steps: + - attach_workspace: + at: ~/repo + - run: + name: Authenticate with registry + command: echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" > ~/repo/.npmrc + - run: + name: Publish beta package + command: npm publish --tag beta + does_typescript_compile: docker: - - image: cimg/node:22.4.1 + - image: cimg/node:22.12.0 working_directory: ~/repo steps: - checkout - run: npm ci - run: npx tsc --noEmit + does_lint_pass: + docker: + - image: cimg/node:22.12.0 + working_directory: ~/repo + steps: + - checkout + - run: npm ci + - run: npm run lint + workflows: version: 2 @@ -92,12 +119,14 @@ workflows: jobs: - does_typescript_compile: name: Does Typescript compile? + - does_lint_pass: + name: Does lint pass? - unit_test: name: Unit tests with Node LTS v: "lts" - unit_test: name: Unit tests with Node current - v: "22.4.1" + v: "22.12.0" test_and_deploy: jobs: @@ -118,6 +147,29 @@ workflows: branches: ignore: /.*/ tags: - only: /^v.*/ + only: /^v[0-9]+\.[0-9]+\.[0-9]+$/ + context: + - publish-npm + + test_and_deploy_beta: + jobs: + - unit_test: + name: Unit tests with Node LTS (Beta) + v: "lts" + filters: + branches: + only: beta + tags: + only: /^v[0-9]+\.[0-9]+\.[0-9]+-beta\.[0-9]+$/ + - deploy_beta: + name: Publish Beta to NPM + v: "lts" + requires: + - Unit tests with Node LTS (Beta) + filters: + branches: + ignore: /.*/ + tags: + only: /^v[0-9]+\.[0-9]+\.[0-9]+-beta\.[0-9]+$/ context: - publish-npm diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index 5647f6cec..000000000 --- a/.eslintignore +++ /dev/null @@ -1,5 +0,0 @@ -examples/ -test/e2e/testdata/**/** -local/ -node_modules/ -lib/ diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index 20b5beebd..000000000 --- a/.eslintrc +++ /dev/null @@ -1,69 +0,0 @@ -{ - "parser": "@typescript-eslint/parser", - "parserOptions": { - "ecmaVersion": 2020 - }, - "extends": ["airbnb-base", "plugin:import/errors", "plugin:import/warnings", "prettier"], - "env": { - "es2020": true, - "node": true, - "mocha": true - }, - "settings": { - "import/resolver": { - "node": { - "extensions": [".js", ".ts"] - } - } - }, - "rules": { - "max-len": 0, - "react/display-name": 0, - "class-methods-use-this": 0, - "comma-dangle": 0, - "eol-last": 2, - "indent": [ - 2, - 2, - { - "SwitchCase": 1 - } - ], - "import/no-extraneous-dependencies": [ - "error", - { - "devDependencies": true - } - ], - "import/no-dynamic-require": 0, - "prefer-arrow-callback": 0, - "object-shorthand": 0, - "prefer-template": 0, - "func-names": 0, - "new-cap": 0, - "no-await-in-loop": 0, - "no-param-reassign": 0, - "no-multiple-empty-lines": 2, - "no-plusplus": [ - "error", - { - "allowForLoopAfterthoughts": true - } - ], - "no-unused-vars": 2, - "no-var": 0, - "object-curly-spacing": [2, "always"], - "quotes": [2, "single", "avoid-escape"], - "semi": [2, "always"], - "strict": 0, - "space-before-blocks": [2, "always"], - "import/extensions": [ - "error", - "ignorePackages", - { - "js": "never", - "ts": "never" - } - ] - } -} diff --git a/.gitignore b/.gitignore index d356d40de..7d63fdc93 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,4 @@ Makefile .github/copilot-instructions.md .github/chatmodes/* .github/prompts/* +.github/agents/* diff --git a/CHANGELOG.md b/CHANGELOG.md index b110dac37..ae77d99f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,28 +7,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] -## [8.22.0] - 2025-12-10 +## [8.20.4-beta.0] - 2025-12-02 -### Added - -- Add `AUTH0_EXCLUDE_THIRD_PARTY_CLIENTS` config property to exclude third-party `clients`. [#1212] - -### Fixed - -- Fix managing `Auth0 My Account API` in `resourceServers`. [#1229] -- Fix `cross_origin_auth` is deprecated and migrated to `cross_origin_authentication` in `clients`. [#1223] - -## [8.21.0] - 2025-11-21 - -### Added - -- Add support for Connection Profiles and Express Configuration on Clients. [#1204] -- Add support for ACUL GA. [#1209] -- Add support for `session_transfer` schema in `clients`. [#1211] - -### Fixed +### Changed -- Fix handle responses when paginating custom domains. [#1214] +- Upgrading node-auth0 from v4 to v5 [beta]. [#1207] ## [8.20.3] - 2025-11-14 @@ -1534,16 +1517,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 [#1196]: https://github.com/auth0/auth0-deploy-cli/issues/1196 [#1200]: https://github.com/auth0/auth0-deploy-cli/issues/1200 [#1203]: https://github.com/auth0/auth0-deploy-cli/issues/1203 -[#1204]: https://github.com/auth0/auth0-deploy-cli/issues/1204 -[#1209]: https://github.com/auth0/auth0-deploy-cli/issues/1209 -[#1211]: https://github.com/auth0/auth0-deploy-cli/issues/1211 -[#1212]: https://github.com/auth0/auth0-deploy-cli/issues/1212 -[#1214]: https://github.com/auth0/auth0-deploy-cli/issues/1214 -[#1223]: https://github.com/auth0/auth0-deploy-cli/issues/1223 -[#1229]: https://github.com/auth0/auth0-deploy-cli/issues/1229 -[Unreleased]: https://github.com/auth0/auth0-deploy-cli/compare/v8.22.0...HEAD -[8.22.0]: https://github.com/auth0/auth0-deploy-cli/compare/v8.21.0...v8.22.0 -[8.21.0]: https://github.com/auth0/auth0-deploy-cli/compare/v8.20.3...v8.21.0 +[#1207]: https://github.com/auth0/auth0-deploy-cli/issues/1207 +[Unreleased]: https://github.com/auth0/auth0-deploy-cli/compare/v8.20.4-beta.0...HEAD +[8.20.4-beta.0]: https://github.com/auth0/auth0-deploy-cli/compare/v8.20.3...v8.20.4-beta.0 [8.20.3]: https://github.com/auth0/auth0-deploy-cli/compare/v8.20.2...v8.20.3 [8.20.2]: https://github.com/auth0/auth0-deploy-cli/compare/v8.20.1...v8.20.2 [8.20.1]: https://github.com/auth0/auth0-deploy-cli/compare/v8.20.0...v8.20.1 diff --git a/README.md b/README.md index 8e3269d67..d985ac81f 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,7 @@ This guide will help you to a working implementation of the Deploy CLI tool used ### Prerequisites -- [Node](https://nodejs.dev/) version 20(v20.18.1) or greater +- [Node](https://nodejs.dev/) version 20(v20.19.0) or greater - [Auth0 Tenant](https://auth0.com/) ### Install the Deploy CLI diff --git a/docs/resource-specific-documentation.md b/docs/resource-specific-documentation.md index 8abfdb3ca..b99cda260 100644 --- a/docs/resource-specific-documentation.md +++ b/docs/resource-specific-documentation.md @@ -576,6 +576,59 @@ phoneProviders: ] ``` +## PhoneTemplates + +Phone templates allow you to customize the SMS and voice messages sent to users for phone-based authentication. +Refer to the [Management API](https://auth0.com/docs/api/management/v2/branding/get-phone-templates) for more details. + +### YAML Example + +```yaml +# Contents of ./tenant.yaml +phoneTemplates: + - type: otp_verify + disabled: false + content: + from: '+12341234567' + body: + text: 'Your verification code is {{ code }}' + voice: 'Your verification code is {{ code }}' + - type: otp_enroll + disabled: false + content: + from: '+12341234567' + body: + text: 'Your enrollment code is {{ code }}' +``` + +### Directory Example + +Create individual JSON files for each template in the `phone-templates` directory: + +```text +phone-templates/ +├── otp_verify.json +├── otp_enroll.json +├── change_password.json +└── ... +``` + +Example `phone-templates/otp_verify.json`: + +```json +{ + "type": "otp_verify", + "disabled": false, + "content": { + "from": "+12341234567", + "body": { + "text": "Your verification code is {{ code }}", + "voice": "Your verification code is {{ code }}" + } + } +} +``` + ## Connection Profiles Application specific configuration for use with the OIN Express Configuration feature diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 000000000..e78ee8be1 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,131 @@ +const js = require('@eslint/js'); +const tsParser = require('@typescript-eslint/parser'); +const tsEslint = require('@typescript-eslint/eslint-plugin'); +const importPlugin = require('eslint-plugin-import'); +const globals = require('globals'); +const eslintConfigPrettier = require('eslint-config-prettier'); + +const baseRecommended = js.configs.recommended; + +module.exports = [ + { + ignores: [ + 'coverage/**', + 'examples/**', + 'local/**', + 'node_modules/**', + 'lib/**', + 'test/e2e/testdata/**', + 'webpack/**', + ], + }, + { + ...baseRecommended, + files: ['**/*.{js,ts,cjs,mjs}'], + linterOptions: { + reportUnusedDisableDirectives: 'off', + }, + languageOptions: { + ...(baseRecommended.languageOptions ?? {}), + parser: tsParser, + parserOptions: { + ...(baseRecommended.languageOptions?.parserOptions ?? {}), + ecmaVersion: 2020, + sourceType: 'module', + }, + globals: { + ...(baseRecommended.languageOptions?.globals ?? {}), + ...globals.es2020, + ...globals.node, + ...globals.mocha, + }, + }, + plugins: { + ...(baseRecommended.plugins ?? {}), + import: importPlugin, + '@typescript-eslint': tsEslint, + }, + settings: { + 'import/resolver': { + node: { + extensions: ['.js', '.ts', '.mjs', '.cjs'], + }, + }, + }, + rules: { + ...(baseRecommended.rules ?? {}), + 'max-len': 'off', + 'class-methods-use-this': 'off', + 'comma-dangle': 'off', + 'eol-last': ['error', 'always'], + indent: [ + 'error', + 2, + { + SwitchCase: 1, + }, + ], + 'import/no-extraneous-dependencies': [ + 'error', + { + devDependencies: true, + }, + ], + 'import/no-dynamic-require': 'off', + 'prefer-arrow-callback': 'off', + 'object-shorthand': 'off', + 'prefer-template': 'off', + 'func-names': 'off', + 'new-cap': 'off', + 'no-await-in-loop': 'off', + 'no-param-reassign': 'off', + 'no-multiple-empty-lines': [ + 'error', + { + max: 1, + maxEOF: 0, + }, + ], + 'no-plusplus': 'off', + 'no-extra-boolean-cast': 'off', + 'no-useless-escape': 'off', + 'no-redeclare': 'off', + 'no-unused-vars': 'off', + 'no-console': 'warn', + '@typescript-eslint/no-unused-vars': [ + 'error', + { + argsIgnorePattern: '^_', + varsIgnorePattern: '^_', + caughtErrors: 'none', + ignoreRestSiblings: true, + }, + ], + '@typescript-eslint/no-redeclare': 'off', + '@typescript-eslint/no-explicit-any': 'off', + 'no-var': 'off', + 'object-curly-spacing': ['error', 'always'], + quotes: [ + 'error', + 'single', + { + avoidEscape: true, + }, + ], + semi: ['error', 'always'], + strict: 'off', + 'space-before-blocks': ['error', 'always'], + 'import/extensions': [ + 'error', + 'ignorePackages', + { + js: 'never', + ts: 'never', + mjs: 'never', + cjs: 'never', + }, + ], + }, + }, + eslintConfigPrettier, +]; diff --git a/examples/directory/README.md b/examples/directory/README.md index 9f8149bc7..ac239a5fc 100644 --- a/examples/directory/README.md +++ b/examples/directory/README.md @@ -40,6 +40,9 @@ repository => resource-servers resource_server1.json resource_server2.json + token-exchange-profiles + profile1.json + profile2.json guardian factors sms.json diff --git a/examples/directory/clients/My SPA.json b/examples/directory/clients/My SPA.json index cb4b1474a..2fe8d68ad 100644 --- a/examples/directory/clients/My SPA.json +++ b/examples/directory/clients/My SPA.json @@ -36,5 +36,10 @@ "token_endpoint_auth_method": "none", "web_origins": [ "https://##ENV##.myapp.com" - ] + ], + "token_exchange": { + "allow_any_profile_of_type": [ + "custom_authentication" + ] + } } diff --git a/examples/directory/phone-templates/otp_enroll.json b/examples/directory/phone-templates/otp_enroll.json new file mode 100644 index 000000000..bfda25c4e --- /dev/null +++ b/examples/directory/phone-templates/otp_enroll.json @@ -0,0 +1,12 @@ +{ + "type": "otp_enroll", + "disabled": false, + "content": { + "syntax": "liquid", + "from": "+12341234567", + "body": { + "text": "Your enrollment code is {{ code }}", + "voice": "Your enrollment code is {{ code }}" + } + } +} diff --git a/examples/directory/phone-templates/otp_verify.json b/examples/directory/phone-templates/otp_verify.json new file mode 100644 index 000000000..14eed7aef --- /dev/null +++ b/examples/directory/phone-templates/otp_verify.json @@ -0,0 +1,12 @@ +{ + "type": "otp_verify", + "disabled": false, + "content": { + "syntax": "liquid", + "from": "+12341234567", + "body": { + "text": "Your verification code is {{ code }}", + "voice": "Your verification code is {{ code }}" + } + } +} diff --git a/examples/directory/token-exchange-profiles/Custom Authentication Profile.json b/examples/directory/token-exchange-profiles/Custom Authentication Profile.json new file mode 100644 index 000000000..2daea0acb --- /dev/null +++ b/examples/directory/token-exchange-profiles/Custom Authentication Profile.json @@ -0,0 +1,6 @@ +{ + "name": "Custom Authentication Profile", + "type": "custom_authentication", + "subject_token_type": "urn:ietf:params:oauth:token-type:custom", + "action": "custom-token-exchange-action" +} diff --git a/examples/yaml/tenant.yaml b/examples/yaml/tenant.yaml index 9c68d7df6..71ace6219 100644 --- a/examples/yaml/tenant.yaml +++ b/examples/yaml/tenant.yaml @@ -56,6 +56,17 @@ clients: enable_organization: true okta_oin_client_id: "My Okta OIN Client" admin_login_domain: "login.myapp.com" + - + name: "My Token Exchange App" + app_type: "regular_web" + grant_types: + - "authorization_code" + - "refresh_token" + - "client_credentials" + - "urn:auth0:params:oauth:grant-type:token-exchange:federated-connection-access-token" + token_exchange: + allow_any_profile_of_type: + - "custom_authentication" databases: - name: "users" @@ -113,6 +124,12 @@ resourceServers: # client_id: "if linked to a resource server client (readonly)" # Add other resource server settings (https://auth0.com/docs/api/management/v2#!/Resource_Servers/post_resource_servers) +tokenExchangeProfiles: + - name: "Custom Authentication Profile" + type: "custom_authentication" + subject_token_type: "urn:ietf:params:oauth:token-type:custom" + action: "custom-token-exchange-action" + phoneProviders: - name: twilio configuration: @@ -125,6 +142,21 @@ phoneProviders: credentials: auth_token: "some_auth_token" +phoneTemplates: + - type: otp_verify + disabled: false + content: + from: "+12341234567" + body: + text: "Your verification code is {{ code }}" + voice: "Your verification code is {{ code }}" + - type: otp_enroll + disabled: false + content: + from: "+12341234567" + body: + text: "Your enrollment code is {{ code }}" + emailProvider: name: "smtp" enabled: true diff --git a/package-lock.json b/package-lock.json index fe3248fef..f1b6b22fd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,16 +1,16 @@ { "name": "auth0-deploy-cli", - "version": "8.22.0", - "lockfileVersion": 2, + "version": "8.20.4-beta.0", + "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "auth0-deploy-cli", - "version": "8.22.0", + "version": "8.20.4-beta.0", "license": "MIT", "dependencies": { "ajv": "^6.12.6", - "auth0": "^4.37.0", + "auth0": "^5.2.0", "dot-prop": "^5.3.0", "fs-extra": "^10.1.0", "js-yaml": "^4.1.1", @@ -27,17 +27,19 @@ "a0deploy": "lib/index.js" }, "devDependencies": { + "@eslint/js": "^9.39.2", "@types/fs-extra": "^9.0.13", "@types/lodash": "^4.17.21", "@types/mocha": "^10.0.10", "@types/nconf": "^0.10.7", - "@typescript-eslint/parser": "^5.62.0", + "@typescript-eslint/eslint-plugin": "^8.50.0", + "@typescript-eslint/parser": "^8.50.0", "chai": "^4.5.0", "chai-as-promised": "^7.1.2", - "eslint": "^7.32.0", - "eslint-config-airbnb-base": "^15.0.0", + "eslint": "^9.39.2", "eslint-config-prettier": "^10.1.8", "eslint-plugin-import": "^2.32.0", + "globals": "^15.12.0", "husky": "^9.1.7", "kacl": "^1.1.1", "mocha": "^10.8.2", @@ -51,65 +53,59 @@ "sinon": "^13.0.2", "sinon-chai": "^3.7.0", "ts-mocha": "^10.1.0", - "typescript": "^5.9.3", - "zlib": "^1.0.5" + "typescript": "^5.9.3" }, "engines": { - "node": ">=20.18.1" + "node": ">=20.19.0" } }, - "node_modules/@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" }, "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.10.4" + "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.8.tgz", - "integrity": "sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", + "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.10.tgz", - "integrity": "sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.10", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-module-transforms": "^7.18.9", - "@babel/helpers": "^7.18.9", - "@babel/parser": "^7.18.10", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.18.10", - "@babel/types": "^7.18.10", - "convert-source-map": "^1.7.0", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", + "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" + "json5": "^2.2.3", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -119,72 +115,55 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/core/node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true, - "dependencies": { - "@babel/highlight": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } + "license": "MIT" }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.23.0", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz", - "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.18.8", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.20.2", - "semver": "^6.3.0" + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { @@ -192,97 +171,51 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz", - "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.18.6", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", - "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" }, "engines": { "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" }, - "engines": { - "node": ">=6.9.0" + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-string-parser": { @@ -296,9 +229,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "dev": true, "license": "MIT", "engines": { @@ -306,380 +239,373 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.1.tgz", - "integrity": "sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.27.1", - "@babel/types": "^7.27.1" + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "node_modules/@babel/parser": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "@babel/types": "^7.28.5" + }, + "bin": { + "parser": "bin/babel-parser.js" }, "engines": { - "node": ">=6.9.0" + "node": ">=6.0.0" } }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", "dev": true, + "license": "MIT", "dependencies": { - "color-convert": "^1.9.0" + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" } }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/@babel/traverse": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", + "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.5", + "debug": "^4.3.1" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" } }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/@babel/types": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", "dev": true, + "license": "MIT", "dependencies": { - "color-name": "1.1.3" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, + "node_modules/@colors/colors": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", + "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", + "license": "MIT", "engines": { - "node": ">=0.8.0" + "node": ">=0.1.90" } }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" + "node_modules/@dabh/diagnostics": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.8.tgz", + "integrity": "sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==", + "license": "MIT", + "dependencies": { + "@so-ric/colorspace": "^1.1.6", + "enabled": "2.0.x", + "kuler": "^2.0.0" } }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", "dev": true, + "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" + "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": ">=4" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@babel/parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.1.tgz", - "integrity": "sha512-I0dZ3ZpCrJ1c04OqlNsQcKiZlsrXf/kkE4FXzID9rIOYICsAbA8mMDzhW/luRNAHdCNt7os/u8wenklZDlUVUQ==", + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, "license": "MIT", - "dependencies": { - "@babel/types": "^7.27.1" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, "engines": { - "node": ">=6.0.0" + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@babel/template": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.1.tgz", - "integrity": "sha512-Fyo3ghWMqkHHpHQCoBs2VnYjR4iWFFjguTDEqA5WgZDOrFesVjMhMM2FSqTKSoUSDO1VQtavj8NFpdRBEvJTtg==", + "node_modules/@eslint/config-array": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", + "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.1", - "@babel/types": "^7.27.1" + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.2" }, "engines": { - "node": ">=6.9.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@babel/template/node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.0", - "@babel/types": "^7.23.0", - "debug": "^4.1.0", - "globals": "^11.1.0" + "node_modules/@eslint/config-array/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, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=6.9.0" + "node": "*" } }, - "node_modules/@babel/traverse/node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" + "@eslint/core": "^0.17.0" }, "engines": { - "node": ">=6.9.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@babel/traverse/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "color-convert": "^1.9.0" + "@types/json-schema": "^7.0.15" }, "engines": { - "node": ">=4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@babel/traverse/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" }, "engines": { - "node": ">=4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@babel/traverse/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, + "license": "MIT", "dependencies": { - "color-name": "1.1.3" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/@babel/traverse/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/traverse/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.8.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, + "license": "MIT", "engines": { - "node": ">=4" + "node": ">= 4" } }, - "node_modules/@babel/traverse/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "node_modules/@eslint/eslintrc/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, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, "engines": { - "node": ">=4" + "node": "*" } }, - "node_modules/@babel/traverse/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/@eslint/js": { + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", + "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", "dev": true, - "dependencies": { - "has-flag": "^3.0.0" + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@babel/types": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.1.tgz", - "integrity": "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==", + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" }, "engines": { - "node": ">=6.9.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@colors/colors": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", - "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", - "license": "MIT", + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=0.1.90" + "node": ">=18.18.0" } }, - "node_modules/@dabh/diagnostics": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.8.tgz", - "integrity": "sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==", - "license": "MIT", - "dependencies": { - "@so-ric/colorspace": "^1.1.6", - "enabled": "2.0.x", - "kuler": "^2.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", - "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/@eslint/eslintrc/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" + "node": ">=18.18.0" } }, - "node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@eslint/eslintrc/node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", - "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.0", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - }, + "license": "Apache-2.0", "engines": { - "node": ">=10.10.0" + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, + "license": "ISC", "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", @@ -696,6 +622,7 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, + "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } @@ -705,6 +632,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -718,6 +646,7 @@ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -731,6 +660,7 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -743,6 +673,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, + "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -758,6 +689,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -765,159 +697,119 @@ "node": ">=8" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - }, - "engines": { - "node": ">=6.0.0" + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", "dev": true, - "engines": { - "node": ">=6.0.0" + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/@rtsao/scc": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "type-detect": "4.0.8" } }, + "node_modules/@sinonjs/commons/node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/@sinonjs/fake-timers": { "version": "9.1.2", "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@sinonjs/commons": "^1.7.0" } }, "node_modules/@sinonjs/samsam": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.1.1.tgz", - "integrity": "sha512-cZ7rKJTLiE7u7Wi/v9Hc2fs3Ucc3jrWeMgPHbbTCeVAB2S0wOBbYlkJVeNSL04i7fdhT8wIbDq1zhC/PXTD2SA==", + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.1.3.tgz", + "integrity": "sha512-nhOb2dWPeb1sd3IQXL/dVPnKHDOAFfvichtBf4xV00/rU1QbPCQqKMbvIheIjqwVjh7qIgf2AHTHi391yMOMpQ==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@sinonjs/commons": "^1.6.0", "lodash.get": "^4.4.2", @@ -925,10 +817,11 @@ } }, "node_modules/@sinonjs/text-encoding": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", - "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", - "dev": true + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.3.tgz", + "integrity": "sha512-DE427ROAphMQzU4ENbliGYrBSYPXF+TtLg9S8vzeA+OF4ZKzoDdzfL8sxuMUGS/lgRhM6j1URSk9ghf7Xo1tyA==", + "dev": true, + "license": "(Unlicense OR Apache-2.0)" }, "node_modules/@so-ric/colorspace": { "version": "1.1.6", @@ -940,20 +833,36 @@ "text-hex": "1.0.x" } }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/fs-extra": { "version": "9.0.13", "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/lodash": { "version": "4.17.21", @@ -973,13 +882,18 @@ "version": "0.10.7", "resolved": "https://registry.npmjs.org/@types/nconf/-/nconf-0.10.7.tgz", "integrity": "sha512-ltJgbQX0XgjkeDrz0anTCXLBLatppWYFCxp88ILEwybfAuyNWr0Qb+ceFFqZ0VDR8fguEjr0hH37ZF+AF4gsxw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/node": { - "version": "18.7.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.2.tgz", - "integrity": "sha512-ce7MIiaYWCFv6A83oEultwhBXb22fxwNOQf5DIxWA4WXvDQ7K+L0fbWl/YOfCzlR5B/uFkSnVBhPcOfOECcWvA==", - "dev": true + "version": "24.10.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.1.tgz", + "integrity": "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } }, "node_modules/@types/triple-beam": { "version": "1.3.5", @@ -987,57 +901,150 @@ "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==", "license": "MIT" }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.50.0.tgz", + "integrity": "sha512-O7QnmOXYKVtPrfYzMolrCTfkezCJS9+ljLdKW/+DCvRsc3UAz+sbH6Xcsv7p30+0OwUbeWfUDAQE0vpabZ3QLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.50.0", + "@typescript-eslint/type-utils": "8.50.0", + "@typescript-eslint/utils": "8.50.0", + "@typescript-eslint/visitor-keys": "8.50.0", + "ignore": "^7.0.0", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.50.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, "node_modules/@typescript-eslint/parser": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.50.0.tgz", + "integrity": "sha512-6/cmF2piao+f6wSxUsJLZjck7OQsYyRtcOZS02k7XINSNlz93v6emM8WutDQSXnroG2xwYlEVHJI+cPA7CPM3Q==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/scope-manager": "8.50.0", + "@typescript-eslint/types": "8.50.0", + "@typescript-eslint/typescript-estree": "8.50.0", + "@typescript-eslint/visitor-keys": "8.50.0", "debug": "^4.3.4" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.50.0.tgz", + "integrity": "sha512-Cg/nQcL1BcoTijEWyx4mkVC56r8dj44bFDvBdygifuS20f3OZCHmFbjF34DPSi07kwlFvqfv/xOLnJ5DquxSGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.50.0", + "@typescript-eslint/types": "^8.50.0", + "debug": "^4.3.4" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.50.0.tgz", + "integrity": "sha512-xCwfuCZjhIqy7+HKxBLrDVT5q/iq7XBVBXLn57RTIIpelLtEIZHXAF/Upa3+gaCpeV1NNS5Z9A+ID6jn50VD4A==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" + "@typescript-eslint/types": "8.50.0", + "@typescript-eslint/visitor-keys": "8.50.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.50.0.tgz", + "integrity": "sha512-vxd3G/ybKTSlm31MOA96gqvrRGv9RJ7LGtZCn2Vrc5htA0zCDvcMqUkifcjrWNNKXHUU3WCkYOzzVSFBd0wa2w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.50.0.tgz", + "integrity": "sha512-7OciHT2lKCewR0mFoBrvZJ4AXTMe/sYOe87289WAViOocEmDjjv8MvIOT2XESuKj9jp8u3SZYUSh89QA4S1kQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.50.0", + "@typescript-eslint/typescript-estree": "8.50.0", + "@typescript-eslint/utils": "8.50.0", + "debug": "^4.3.4", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.50.0.tgz", + "integrity": "sha512-iX1mgmGrXdANhhITbpp2QQM2fGehBse9LbTf0sidWK6yg/NE+uhV5dfU1g6EYPlcReYmkE9QLPq/2irKAmtS9w==", "dev": true, + "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -1045,54 +1052,94 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.50.0.tgz", + "integrity": "sha512-W7SVAGBR/IX7zm1t70Yujpbk+zdPq/u4soeFSknWFdXIFuWsBGBOUu/Tn/I6KHSKvSh91OiMuaSnYp3mtPt5IQ==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", + "@typescript-eslint/project-service": "8.50.0", + "@typescript-eslint/tsconfig-utils": "8.50.0", + "@typescript-eslint/types": "8.50.0", + "@typescript-eslint/visitor-keys": "8.50.0", "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.1.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.50.0.tgz", + "integrity": "sha512-87KgUXET09CRjGCi2Ejxy3PULXna63/bMYv72tCAlDJC3Yqwln0HiFJ3VJMst2+mEtNtZu5oFvX4qJGjKsnAgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.50.0", + "@typescript-eslint/types": "8.50.0", + "@typescript-eslint/typescript-estree": "8.50.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.50.0.tgz", + "integrity": "sha512-Xzmnb58+Db78gT/CCj/PVCvK+zxbnsw6F+O1oheYszJbBSdEjVhQi3C/Xttzxgi/GLmpvOggRs1RFpiJ8+c34Q==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" + "@typescript-eslint/types": "8.50.0", + "eslint-visitor-keys": "^4.2.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -1105,6 +1152,7 @@ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, + "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } @@ -1114,6 +1162,7 @@ "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "dev": true, + "license": "MIT", "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -1126,6 +1175,7 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -1142,6 +1192,7 @@ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -1150,6 +1201,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", "engines": { "node": ">=8" } @@ -1158,6 +1210,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -1169,10 +1222,11 @@ } }, "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, + "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -1186,6 +1240,7 @@ "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", "dev": true, + "license": "MIT", "dependencies": { "default-require-extensions": "^3.0.0" }, @@ -1197,12 +1252,14 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" }, "node_modules/array-buffer-byte-length": { "version": "1.0.2", @@ -1244,15 +1301,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/array.prototype.findlastindex": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", @@ -1335,28 +1383,31 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/assertion-error": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true, + "license": "MIT", "engines": { "node": "*" } }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "license": "MIT" }, "node_modules/async-function": { "version": "1.0.0", @@ -1369,9 +1420,24 @@ } }, "node_modules/auth0": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/auth0/-/auth0-4.37.0.tgz", - "integrity": "sha512-+TqJRxh4QvbD4TQIYx1ak2vanykQkG/nIZLuR6o8LoQj425gjVG3tFuUbbOeh/nCpP1rnvU0CCV1ChZHYXLU/A==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/auth0/-/auth0-5.2.0.tgz", + "integrity": "sha512-eRtzyldEhXC1g9quWI8daG/j2OcXFsjgkT+zi3gqpe3SOwVNkWyvzaDAHAYWD2Z1ARTNXxezoXJiWNxwfHRMhw==", + "license": "MIT", + "dependencies": { + "auth0-legacy": "npm:auth0@^4.27.0", + "jose": "^4.13.2", + "uuid": "^11.1.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || ^24.0.0" + } + }, + "node_modules/auth0-legacy": { + "name": "auth0", + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/auth0/-/auth0-4.36.0.tgz", + "integrity": "sha512-n/eqshTNXY9HY+KaHbxLNHr5iOqg4PztMczNQXOIrHcyUsi6zB6uQphP25tbKiy7+A1pwgX/ZkAOnTzFUoBroA==", "license": "MIT", "dependencies": { "jose": "^4.13.2", @@ -1382,7 +1448,13 @@ "node": ">=18" } }, - "node_modules/auth0/node_modules/uuid": { + "node_modules/auth0-legacy/node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "license": "MIT" + }, + "node_modules/auth0-legacy/node_modules/uuid": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", @@ -1390,6 +1462,7 @@ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], + "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } @@ -1414,26 +1487,40 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.29.tgz", + "integrity": "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } }, "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "balanced-match": "^1.0.0" } }, "node_modules/braces": { @@ -1441,6 +1528,7 @@ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, + "license": "MIT", "dependencies": { "fill-range": "^7.1.1" }, @@ -1452,12 +1540,13 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/browserslist": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", - "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==", + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.0.tgz", + "integrity": "sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ==", "dev": true, "funding": [ { @@ -1467,13 +1556,19 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001370", - "electron-to-chromium": "^1.4.202", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.5" + "baseline-browser-mapping": "^2.8.25", + "caniuse-lite": "^1.0.30001754", + "electron-to-chromium": "^1.5.249", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.1.4" }, "bin": { "browserslist": "cli.js" @@ -1486,13 +1581,15 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/caching-transform": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", "dev": true, + "license": "MIT", "dependencies": { "hasha": "^5.0.0", "make-dir": "^3.0.0", @@ -1558,6 +1655,7 @@ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -1566,14 +1664,15 @@ "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/caniuse-lite": { - "version": "1.0.30001375", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001375.tgz", - "integrity": "sha512-kWIMkNzLYxSvnjy0hL8w1NOaWNr2rn39RTAVyIwcw8juu60bZDWiF1/loOYANzjtJmy6qPgNmn38ro5Pygagdw==", + "version": "1.0.30001755", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001755.tgz", + "integrity": "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA==", "dev": true, "funding": [ { @@ -1583,14 +1682,20 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/chai": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz", "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==", "dev": true, + "license": "MIT", "dependencies": { "assertion-error": "^1.1.0", "check-error": "^1.0.3", @@ -1617,20 +1722,12 @@ "chai": ">= 2.1.2 < 6" } }, - "node_modules/chai/node_modules/type-detect": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", - "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -1647,6 +1744,7 @@ "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", "dev": true, + "license": "MIT", "dependencies": { "get-func-name": "^2.0.2" }, @@ -1655,16 +1753,11 @@ } }, "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], + "license": "MIT", "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -1677,15 +1770,32 @@ "engines": { "node": ">= 8.10.0" }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, "optionalDependencies": { "fsevents": "~2.3.2" } }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -1694,6 +1804,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -1701,13 +1812,13 @@ } }, "node_modules/color": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/color/-/color-5.0.2.tgz", - "integrity": "sha512-e2hz5BzbUPcYlIRHo8ieAhYgoajrJr+hWoceg6E345TPsATMUKqDgzt8fSXZJJbxfpiPzkWyphz8yn8At7q3fA==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/color/-/color-5.0.3.tgz", + "integrity": "sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==", "license": "MIT", "dependencies": { - "color-convert": "^3.0.1", - "color-string": "^2.0.0" + "color-convert": "^3.1.3", + "color-string": "^2.1.3" }, "engines": { "node": ">=18" @@ -1717,6 +1828,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -1727,12 +1839,13 @@ "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" }, "node_modules/color-string": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-2.1.2.tgz", - "integrity": "sha512-RxmjYxbWemV9gKu4zPgiZagUxbH3RQpEIO77XoSSX0ivgABDZ+h8Zuash/EMFLTI4N9QgFPOJ6JQpPZKFxa+dA==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-2.1.4.tgz", + "integrity": "sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==", "license": "MIT", "dependencies": { "color-name": "^2.0.0" @@ -1742,18 +1855,18 @@ } }, "node_modules/color-string/node_modules/color-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.0.2.tgz", - "integrity": "sha512-9vEt7gE16EW7Eu7pvZnR0abW9z6ufzhXxGXZEVU9IqPdlsUiMwJeJfRtq0zePUmnbHGT9zajca7mX8zgoayo4A==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", + "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", "license": "MIT", "engines": { "node": ">=12.20" } }, "node_modules/color/node_modules/color-convert": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-3.1.2.tgz", - "integrity": "sha512-UNqkvCDXstVck3kdowtOTWROIJQwafjOfXSmddoDrXo4cewMKmusCeF22Q24zvjR8nwWib/3S/dfyzPItPEiJg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-3.1.3.tgz", + "integrity": "sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==", "license": "MIT", "dependencies": { "color-name": "^2.0.0" @@ -1763,9 +1876,9 @@ } }, "node_modules/color/node_modules/color-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.0.2.tgz", - "integrity": "sha512-9vEt7gE16EW7Eu7pvZnR0abW9z6ufzhXxGXZEVU9IqPdlsUiMwJeJfRtq0zePUmnbHGT9zajca7mX8zgoayo4A==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", + "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", "license": "MIT", "engines": { "node": ">=12.20" @@ -1775,34 +1888,22 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/confusing-browser-globals": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", - "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "dev": true, - "dependencies": { - "safe-buffer": "~5.1.1" - } - }, - "node_modules/convert-source-map/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "license": "MIT" }, "node_modules/cross-spawn": { "version": "7.0.6", @@ -1874,10 +1975,11 @@ } }, "node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.3" }, @@ -1894,6 +1996,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -1903,6 +2006,7 @@ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", "dev": true, + "license": "MIT", "dependencies": { "type-detect": "^4.0.0" }, @@ -1914,18 +2018,23 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/default-require-extensions": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", - "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", + "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", "dev": true, + "license": "MIT", "dependencies": { "strip-bom": "^4.0.0" }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/define-data-property": { @@ -1933,6 +2042,7 @@ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -1950,6 +2060,7 @@ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, + "license": "MIT", "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", @@ -1967,38 +2078,29 @@ "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" } }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, "engines": { - "node": ">=6.0.0" + "node": ">=0.10.0" } }, "node_modules/dot-prop": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "license": "MIT", "dependencies": { "is-obj": "^2.0.0" }, @@ -2022,15 +2124,17 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.215", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.215.tgz", - "integrity": "sha512-vqZxT8C5mlDZ//hQFhneHmOLnj1LhbzxV0+I1yqHV8SB1Oo4Y5Ne9+qQhwHl7O1s9s9cRuo2l5CoLEHdhMTwZg==", - "dev": true + "version": "1.5.255", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.255.tgz", + "integrity": "sha512-Z9oIp4HrFF/cZkDPMpz2XSuVpc1THDpT4dlmATFlJUIBVCy9Vap5/rIXsASP1CscBacBqhabwh8vLctqBwEerQ==", + "dev": true, + "license": "ISC" }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" }, "node_modules/enabled": { "version": "2.0.0", @@ -2039,26 +2143,15 @@ "license": "MIT" }, "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", "dev": true, + "license": "MIT", "dependencies": { "once": "^1.4.0" } }, - "node_modules/enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "dependencies": { - "ansi-colors": "^4.1.1" - }, - "engines": { - "node": ">=8.6" - } - }, "node_modules/es-abstract": { "version": "1.24.0", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", @@ -2143,6 +2236,7 @@ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -2211,12 +2305,14 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", "engines": { "node": ">=6" } @@ -2226,6 +2322,7 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -2234,90 +2331,63 @@ } }, "node_modules/eslint": { - "version": "7.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", - "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", + "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.3", - "@humanwhocodes/config-array": "^0.5.0", - "ajv": "^6.10.0", + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.1", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.39.2", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.12.4", "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", - "esquery": "^1.4.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.1.2", - "globals": "^13.6.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^6.0.9", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" + "optionator": "^0.9.3" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-airbnb-base": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", - "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", - "dev": true, - "license": "MIT", - "dependencies": { - "confusing-browser-globals": "^1.0.10", - "object.assign": "^4.1.2", - "object.entries": "^1.1.5", - "semver": "^6.3.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" + "url": "https://eslint.org/donate" }, "peerDependencies": { - "eslint": "^7.32.0 || ^8.2.0", - "eslint-plugin-import": "^2.25.2" - } - }, - "node_modules/eslint-config-airbnb-base/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } } }, "node_modules/eslint-config-prettier": { @@ -2341,6 +2411,7 @@ "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.13.0", @@ -2352,6 +2423,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.1" } @@ -2418,25 +2490,38 @@ "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, + "node_modules/eslint-plugin-import/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/eslint-plugin-import/node_modules/debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "node_modules/eslint-plugin-import/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, + "license": "ISC", "dependencies": { - "esutils": "^2.0.2" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=0.10.0" + "node": "*" } }, "node_modules/eslint-plugin-import/node_modules/semver": { @@ -2444,52 +2529,34 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^1.1.0" + "estraverse": "^5.2.0" }, "engines": { - "node": ">=6" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "engines": { - "node": ">=4" + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-visitor-keys": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", - "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -2497,64 +2564,82 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, + "license": "MIT", "dependencies": { - "sprintf-js": "~1.0.2" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=10" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/js-yaml": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "node_modules/eslint/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint/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, + "license": "ISC", "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "brace-expansion": "^1.1.7" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": "*" } }, - "node_modules/eslint/node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, "node_modules/espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/esprima": { @@ -2562,6 +2647,7 @@ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, + "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -2571,10 +2657,11 @@ } }, "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, @@ -2582,20 +2669,12 @@ "node": ">=0.10" } }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -2603,20 +2682,12 @@ "node": ">=4.0" } }, - "node_modules/esrecurse/node_modules/estraverse": { + "node_modules/estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -2626,6 +2697,7 @@ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } @@ -2635,6 +2707,7 @@ "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", "dev": true, + "license": "MIT", "dependencies": { "cross-spawn": "^7.0.0", "get-stream": "^5.0.0", @@ -2656,43 +2729,21 @@ "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-glob": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", - "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", - "dev": true, - "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" - }, - "engines": { - "node": ">=8.6.0" - } + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } + "license": "MIT" }, "node_modules/fecha": { "version": "4.2.3", @@ -2701,15 +2752,16 @@ "license": "MIT" }, "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, + "license": "MIT", "dependencies": { - "flat-cache": "^3.0.4" + "flat-cache": "^4.0.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16.0.0" } }, "node_modules/fill-range": { @@ -2717,6 +2769,7 @@ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -2729,6 +2782,7 @@ "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "dev": true, + "license": "MIT", "dependencies": { "commondir": "^1.0.1", "make-dir": "^3.0.2", @@ -2741,38 +2795,59 @@ "url": "https://github.com/avajs/find-cache-dir?sponsor=1" } }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/flat": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", "dev": true, + "license": "BSD-3-Clause", "bin": { "flat": "cli.js" } }, "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, + "license": "MIT", "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" + "flatted": "^3.2.9", + "keyv": "^4.5.4" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16" } }, "node_modules/flatted": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.6.tgz", - "integrity": "sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==", - "dev": true + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" }, "node_modules/fn.name": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", - "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", + "license": "MIT" }, "node_modules/for-each": { "version": "0.3.5", @@ -2795,6 +2870,7 @@ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", "dev": true, + "license": "ISC", "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^3.0.2" @@ -2821,12 +2897,14 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/fs-extra": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -2840,14 +2918,16 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -2861,6 +2941,7 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -2886,12 +2967,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true - }, "node_modules/functions-have-names": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", @@ -2902,11 +2977,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -2915,6 +3001,7 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -2924,6 +3011,7 @@ "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", "dev": true, + "license": "MIT", "engines": { "node": "*" } @@ -2958,6 +3046,7 @@ "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.0.0" } @@ -2981,6 +3070,7 @@ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dev": true, + "license": "MIT", "dependencies": { "pump": "^3.0.0" }, @@ -3010,47 +3100,60 @@ } }, "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "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, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "minimatch": "^5.0.1", + "once": "^1.3.0" }, "engines": { - "node": "*" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, + "license": "ISC", "dependencies": { - "is-glob": "^4.0.1" + "is-glob": "^4.0.3" }, "engines": { - "node": ">= 6" + "node": ">=10.13.0" } }, - "node_modules/globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "node_modules/glob/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, + "license": "ISC", "dependencies": { - "type-fest": "^0.20.2" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=8" + "node": ">=10" + } + }, + "node_modules/globals": { + "version": "15.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", + "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -3073,35 +3176,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby/node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -3116,9 +3190,10 @@ } }, "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" }, "node_modules/has-bigints": { "version": "1.1.0", @@ -3138,6 +3213,7 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -3147,6 +3223,7 @@ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" }, @@ -3204,6 +3281,7 @@ "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", "dev": true, + "license": "MIT", "dependencies": { "is-stream": "^2.0.0", "type-fest": "^0.8.0" @@ -3215,20 +3293,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/hasha/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, + "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -3241,6 +3311,7 @@ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true, + "license": "MIT", "bin": { "he": "bin/he" } @@ -3249,13 +3320,15 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/human-signals": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=8.12.0" } @@ -3277,19 +3350,21 @@ } }, "node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, + "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -3306,6 +3381,7 @@ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.19" } @@ -3315,6 +3391,7 @@ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -3323,7 +3400,9 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, + "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -3332,12 +3411,14 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" }, "node_modules/ini": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "license": "ISC", "engines": { "node": ">=10" } @@ -3416,6 +3497,7 @@ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, + "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" }, @@ -3509,6 +3591,7 @@ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -3533,19 +3616,21 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/is-generator-function": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", - "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "get-proto": "^1.0.0", + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" }, @@ -3561,6 +3646,7 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, + "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -3586,6 +3672,7 @@ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -3598,6 +3685,7 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -3623,6 +3711,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "license": "MIT", "engines": { "node": ">=8" } @@ -3632,6 +3721,7 @@ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -3688,6 +3778,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", "engines": { "node": ">=8" }, @@ -3750,13 +3841,15 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -3815,27 +3908,31 @@ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "dev": true + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=8" } @@ -3845,6 +3942,7 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "append-transform": "^2.0.0" }, @@ -3857,6 +3955,7 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@babel/core": "^7.7.5", "@istanbuljs/schema": "^0.1.2", @@ -3872,6 +3971,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -3881,6 +3981,7 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", "dev": true, + "license": "ISC", "dependencies": { "archy": "^1.0.0", "cross-spawn": "^7.0.3", @@ -3893,18 +3994,45 @@ "node": ">=8" } }, + "node_modules/istanbul-lib-processinfo/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", + "make-dir": "^4.0.0", "supports-color": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/istanbul-lib-source-maps": { @@ -3912,6 +4040,7 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", @@ -3926,6 +4055,7 @@ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz", "integrity": "sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" @@ -3938,6 +4068,7 @@ "version": "4.15.9", "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.9.tgz", "integrity": "sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/panva" } @@ -3946,12 +4077,14 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, + "dev": true, + "license": "MIT" + }, "node_modules/js-yaml": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -3960,39 +4093,51 @@ } }, "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, + "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, "engines": { - "node": ">=4" + "node": ">=6" } }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, + "license": "MIT", "bin": { "json5": "lib/cli.js" }, @@ -4001,9 +4146,10 @@ } }, "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "license": "MIT", "dependencies": { "universalify": "^2.0.0" }, @@ -4012,16 +4158,18 @@ } }, "node_modules/just-extend": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", - "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", - "dev": true + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-6.2.0.tgz", + "integrity": "sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==", + "dev": true, + "license": "MIT" }, "node_modules/kacl": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/kacl/-/kacl-1.1.1.tgz", "integrity": "sha512-qA2xJP0A+BZpNPnfSNJfJvBT7WWkK614gxlhOfodSR+hbOEEnBzfx8h7Zt2HauV79JOSKCMjdqt4SbDUJ2vtWQ==", "dev": true, + "license": "MIT", "bin": { "kacl": "bin/kacl" }, @@ -4029,6 +4177,16 @@ "node": ">=10.16.0" } }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, "node_modules/kuler": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", @@ -4040,6 +4198,7 @@ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -4048,40 +4207,56 @@ "node": ">= 0.8.0" } }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" }, "node_modules/lodash.flattendeep": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", - "dev": true + "dev": true, + "license": "MIT" }, "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==", - "dev": true + "deprecated": "This package is deprecated. Use the optional chaining (?.) operator instead.", + "dev": true, + "license": "MIT" }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" @@ -4115,15 +4290,27 @@ "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", "dev": true, + "license": "MIT", "dependencies": { "get-func-name": "^2.0.1" } }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, "node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, + "license": "MIT", "dependencies": { "semver": "^6.0.0" }, @@ -4135,10 +4322,11 @@ } }, "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -4147,7 +4335,8 @@ "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/math-intrinsics": { "version": "1.1.0", @@ -4163,56 +4352,44 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } + "license": "MIT" }, "node_modules/mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "license": "ISC", "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/mkdirp": { "version": "1.0.4", @@ -4262,83 +4439,24 @@ "node": ">= 14.0.0" } }, - "node_modules/mocha/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.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==", "dev": true, + "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^7.0.0" } }, - "node_modules/mocha/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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/mocha/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/mocha/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, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -4346,50 +4464,12 @@ "node": ">=10" } }, - "node_modules/mocha/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/mocha/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -4405,6 +4485,7 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -4422,6 +4503,7 @@ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, + "license": "ISC", "engines": { "node": ">=10" } @@ -4431,6 +4513,7 @@ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, + "license": "MIT", "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", @@ -4449,6 +4532,7 @@ "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -4456,13 +4540,15 @@ "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/nconf": { "version": "0.13.0", @@ -4483,6 +4569,7 @@ "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -4493,6 +4580,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -4509,6 +4597,7 @@ "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", "engines": { "node": ">=10" } @@ -4517,6 +4606,7 @@ "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "license": "MIT", "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", @@ -4533,19 +4623,51 @@ "node_modules/next-tick": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", - "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", + "license": "ISC" }, "node_modules/nise": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.1.tgz", - "integrity": "sha512-yr5kW2THW1AkxVmCnKEh4nbYkJdB3I7LUkiUgOvEkOp414mc2UMaHMA7pjq1nYowhdoJZGwEKGaQVbxfpWj10A==", + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.9.tgz", + "integrity": "sha512-qOnoujW4SV6e40dYxJOb3uvuoPHtmLzIk4TFo+j0jPJoC+5Z9xja5qH5JZobEPsa8+YYphMrOSwnrshEhG2qww==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "@sinonjs/commons": "^1.8.3", - "@sinonjs/fake-timers": ">=5", - "@sinonjs/text-encoding": "^0.7.1", - "just-extend": "^4.0.2", - "path-to-regexp": "^1.7.0" + "@sinonjs/commons": "^3.0.0", + "@sinonjs/fake-timers": "^11.2.2", + "@sinonjs/text-encoding": "^0.7.2", + "just-extend": "^6.2.0", + "path-to-regexp": "^6.2.1" + } + }, + "node_modules/nise/node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/nise/node_modules/@sinonjs/fake-timers": { + "version": "11.3.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-11.3.1.tgz", + "integrity": "sha512-EVJO7nW5M/F5Tur0Rf2z/QoMo+1Ia963RiMtapiQrEWvY0iBUvADo8Beegwjpnle5BHkyHuoxSTW3jF43H1XRA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.1" + } + }, + "node_modules/nise/node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" } }, "node_modules/nock": { @@ -4568,6 +4690,7 @@ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "dev": true, + "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -4588,6 +4711,7 @@ "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", "dev": true, + "license": "MIT", "dependencies": { "process-on-spawn": "^1.0.0" }, @@ -4596,16 +4720,18 @@ } }, "node_modules/node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", - "dev": true + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "dev": true, + "license": "MIT" }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -4615,6 +4741,7 @@ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.0.0" }, @@ -4627,6 +4754,7 @@ "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", "dev": true, + "license": "ISC", "dependencies": { "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.2", @@ -4663,11 +4791,23 @@ "node": ">=8.9" } }, + "node_modules/nyc/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/nyc/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, + "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -4676,11 +4816,34 @@ "node": ">=8" } }, - "node_modules/nyc/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==", + "node_modules/nyc/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, + "license": "ISC", + "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" + } + }, + "node_modules/nyc/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, + "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -4688,11 +4851,25 @@ "node": ">=8" } }, + "node_modules/nyc/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, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/nyc/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, + "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -4708,6 +4885,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -4715,29 +4893,12 @@ "node": ">=8" } }, - "node_modules/nyc/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/nyc/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/nyc/node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -4760,6 +4921,7 @@ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -4785,25 +4947,12 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object.entries": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", - "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/object.fromentries": { "version": "2.0.8", "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -4822,6 +4971,7 @@ "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -4855,6 +5005,7 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, + "license": "ISC", "dependencies": { "wrappy": "1" } @@ -4863,6 +5014,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "license": "MIT", "dependencies": { "fn.name": "1.x.x" } @@ -4872,6 +5024,7 @@ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, + "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" }, @@ -4883,17 +5036,18 @@ } }, "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, + "license": "MIT", "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "word-wrap": "^1.2.5" }, "engines": { "node": ">= 0.8.0" @@ -4921,15 +5075,49 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", "integrity": "sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==", + "license": "MIT", "engines": { "node": ">=4" } }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "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, + "license": "MIT", "dependencies": { "aggregate-error": "^3.0.0" }, @@ -4937,11 +5125,21 @@ "node": ">=8" } }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/package-hash": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", "dev": true, + "license": "ISC", "dependencies": { "graceful-fs": "^4.1.15", "hasha": "^5.0.0", @@ -4957,6 +5155,7 @@ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, + "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -4964,11 +5163,21 @@ "node": ">=6" } }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -4978,6 +5187,7 @@ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -4986,31 +5196,22 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-to-regexp": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz", - "integrity": "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==", "dev": true, - "dependencies": { - "isarray": "0.0.1" - } + "license": "MIT" }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "node_modules/path-to-regexp": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", "dev": true, - "engines": { - "node": ">=8" - } + "license": "MIT" }, "node_modules/pathval": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", "dev": true, + "license": "MIT", "engines": { "node": "*" } @@ -5027,6 +5228,7 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -5039,6 +5241,7 @@ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, + "license": "MIT", "dependencies": { "find-up": "^4.0.0" }, @@ -5051,6 +5254,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -5064,6 +5268,7 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -5076,6 +5281,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, + "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -5091,6 +5297,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -5098,24 +5305,6 @@ "node": ">=8" } }, - "node_modules/pkg-dir/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-dir/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/possible-typed-array-names": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", @@ -5131,6 +5320,7 @@ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8.0" } @@ -5156,6 +5346,7 @@ "resolved": "https://registry.npmjs.org/pretty-quick/-/pretty-quick-3.3.1.tgz", "integrity": "sha512-3b36UXfYQ+IXXqex6mCca89jC8u0mYLqFAN5eTQKoXO6oCQYcIVYZEB/5AlBHI7JPYygReM2Vv6Vom/Gln7fBg==", "dev": true, + "license": "MIT", "dependencies": { "execa": "^4.1.0", "find-up": "^4.1.0", @@ -5180,6 +5371,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -5189,10 +5381,11 @@ } }, "node_modules/pretty-quick/node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } @@ -5202,6 +5395,7 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -5214,6 +5408,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, + "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -5229,6 +5424,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -5236,29 +5432,12 @@ "node": ">=8" } }, - "node_modules/pretty-quick/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/pretty-quick/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/pretty-quick/node_modules/picomatch": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-3.0.1.tgz", "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -5266,17 +5445,12 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/pretty-quick/node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", - "dev": true - }, "node_modules/process-on-spawn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", - "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.1.0.tgz", + "integrity": "sha512-JOnOPQ/8TZgjs1JIH/m9ni7FfimjNa/PRx7y/Wb5qdItsnhO0jE4AT7fC0HjC28DUQWDr50dwSYZLdRMlqDq3Q==", "dev": true, + "license": "MIT", "dependencies": { "fromentries": "^1.2.0" }, @@ -5284,19 +5458,11 @@ "node": ">=8" } }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/promise-batcher": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/promise-batcher/-/promise-batcher-1.1.0.tgz", - "integrity": "sha512-Q/+G7i1ZqRCx56s9W1RRjhK6xveb2UkZz4Lt6xksO3SjcglDrRrQ4YRQ4WtalOFCzUNiAhstLLOX31QJRmr/BA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/promise-batcher/-/promise-batcher-1.1.1.tgz", + "integrity": "sha512-DtGBp8OQlAtALDFoVphyAz6Vn1c0GyelKU5smpMQEXpEAcWWxY3fC5JT0AkpWqrljvJrhC6zVdWbK/jx6NNG2A==", + "license": "MIT", "dependencies": { "p-defer": "^3.0.0" }, @@ -5308,6 +5474,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-3.0.0.tgz", "integrity": "sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw==", + "license": "MIT", "engines": { "node": ">=8" } @@ -5316,6 +5483,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/promise-pool-executor/-/promise-pool-executor-1.1.1.tgz", "integrity": "sha512-WZTGr7E8tiW93QoSRe0+arBIrJ13m7yKov/vyWqP8nkME/OjfzZgmSJjLtcDHd6VVz2LdSoAHZLmDfis8hJd1w==", + "license": "MIT", "dependencies": { "debug": "^3.1.0", "next-tick": "^1.0.0", @@ -5330,6 +5498,7 @@ "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "license": "MIT", "dependencies": { "ms": "^2.1.1" } @@ -5339,53 +5508,37 @@ "resolved": "https://registry.npmjs.org/propagate/-/propagate-2.0.1.tgz", "integrity": "sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", + "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", "dev": true, + "license": "MIT", "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "^5.1.0" } @@ -5409,6 +5562,7 @@ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, + "license": "MIT", "dependencies": { "picomatch": "^2.2.1" }, @@ -5460,23 +5614,12 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, "node_modules/release-zalgo": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", "dev": true, + "license": "ISC", "dependencies": { "es6-error": "^4.0.1" }, @@ -5488,15 +5631,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -5504,21 +5639,26 @@ "node_modules/require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "license": "ISC" }, "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", "dev": true, + "license": "MIT", "dependencies": { - "is-core-module": "^2.13.0", + "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -5528,25 +5668,18 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, "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, + "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -5557,35 +5690,59 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/rmdir-sync": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rmdir-sync/-/rmdir-sync-1.0.1.tgz", - "integrity": "sha512-Fp12ZE5QArxMIfyPIfWh9Jc/n98pCZWGYOpy6u0P1ZdrHN+4dPZLpa57DuSL2Ie2wMcbOrBGv57eHQmxfINtow==", - "dev": true + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "node_modules/rimraf/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, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "license": "ISC", + "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" + } + }, + "node_modules/rimraf/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, + "license": "ISC", "dependencies": { - "queue-microtask": "^1.2.2" + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, + "node_modules/rmdir-sync": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rmdir-sync/-/rmdir-sync-1.0.1.tgz", + "integrity": "sha512-Fp12ZE5QArxMIfyPIfWh9Jc/n98pCZWGYOpy6u0P1ZdrHN+4dPZLpa57DuSL2Ie2wMcbOrBGv57eHQmxfINtow==", + "dev": true, + "license": "MIT" + }, "node_modules/safe-array-concat": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", @@ -5606,13 +5763,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/safe-array-concat/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, - "license": "MIT" - }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -5630,7 +5780,8 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/safe-push-apply": { "version": "1.0.0", @@ -5649,13 +5800,6 @@ "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, - "license": "MIT" - }, "node_modules/safe-regex-test": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", @@ -5687,6 +5831,7 @@ "version": "1.6.3", "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", + "license": "WTFPL OR ISC", "dependencies": { "truncate-utf8-bytes": "^1.0.0" } @@ -5694,16 +5839,15 @@ "node_modules/secure-keys": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/secure-keys/-/secure-keys-1.0.0.tgz", - "integrity": "sha512-nZi59hW3Sl5P3+wOO89eHBAAGwmCPd2aE1+dLZV5MO+ItQctIvAqihzaAXIQhvtH4KJPxM080HsnqltR2y8cWg==" + "integrity": "sha512-nZi59hW3Sl5P3+wOO89eHBAAGwmCPd2aE1+dLZV5MO+ItQctIvAqihzaAXIQhvtH4KJPxM080HsnqltR2y8cWg==", + "license": "MIT" }, "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -5711,29 +5855,12 @@ "node": ">=10" } }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/serialize-javascript": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "randombytes": "^2.1.0" } @@ -5741,13 +5868,15 @@ "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "license": "ISC" }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dev": true, + "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -5894,13 +6023,16 @@ "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/sinon": { "version": "13.0.2", "resolved": "https://registry.npmjs.org/sinon/-/sinon-13.0.2.tgz", "integrity": "sha512-KvOrztAVqzSJWMDoxM4vM+GPys1df2VBoXm+YciyB/OLMamfS3VXh3oGh5WtrAGSzrgczNWFFY22oKb7Fi5eeA==", + "deprecated": "16.1.1", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@sinonjs/commons": "^1.8.3", "@sinonjs/fake-timers": "^9.1.2", @@ -5919,42 +6051,18 @@ "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-3.7.0.tgz", "integrity": "sha512-mf5NURdUaSdnatJx3uhoBOrY9dtL19fiOtAdT1Azxg3+lNJFiuN0uzaU3xX1LeAfL17kHQhTAJgpsfhbMJMY2g==", "dev": true, + "license": "(BSD-2-Clause OR WTFPL)", "peerDependencies": { "chai": "^4.0.0", "sinon": ">=4.0.0" } }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -5964,6 +6072,7 @@ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -5974,6 +6083,7 @@ "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", "dev": true, + "license": "ISC", "dependencies": { "foreground-child": "^2.0.0", "is-windows": "^1.0.2", @@ -5986,10 +6096,18 @@ "node": ">=8" } }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, "node_modules/stack-trace": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", + "license": "MIT", "engines": { "node": "*" } @@ -6021,6 +6139,7 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -6076,6 +6195,7 @@ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -6092,6 +6212,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -6104,6 +6225,7 @@ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -6113,6 +6235,7 @@ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -6122,6 +6245,7 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -6134,6 +6258,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -6146,6 +6271,7 @@ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -6153,56 +6279,65 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/table": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.0.tgz", - "integrity": "sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==", + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, + "license": "ISC", "dependencies": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" }, "engines": { - "node": ">=10.0.0" + "node": ">=8" } }, - "node_modules/table/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, + "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/test-exclude/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, + "license": "ISC", + "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": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/table/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "node_modules/test-exclude/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, + "license": "ISC", "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=8" + "node": "*" } }, "node_modules/text-hex": { @@ -6211,17 +6346,60 @@ "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", "license": "MIT" }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -6233,7 +6411,8 @@ "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/triple-beam": { "version": "1.4.1", @@ -6248,10 +6427,24 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", + "license": "WTFPL", "dependencies": { "utf8-byte-length": "^1.0.1" } }, + "node_modules/ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, "node_modules/ts-mocha": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/ts-mocha/-/ts-mocha-10.1.0.tgz", @@ -6279,6 +6472,7 @@ "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", "dev": true, + "license": "MIT", "dependencies": { "arrify": "^1.0.0", "buffer-from": "^1.1.0", @@ -6296,20 +6490,12 @@ "node": ">=4.2.0" } }, - "node_modules/ts-node/node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/ts-node/node_modules/diff": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" } @@ -6319,6 +6505,7 @@ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, + "license": "MIT", "dependencies": { "minimist": "^1.2.6" }, @@ -6331,6 +6518,7 @@ "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, + "license": "MIT", "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", @@ -6343,6 +6531,7 @@ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, + "license": "MIT", "dependencies": { "minimist": "^1.2.0" }, @@ -6355,36 +6544,24 @@ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } + "license": "0BSD" }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" }, @@ -6393,24 +6570,23 @@ } }, "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", + "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "node_modules/typed-array-buffer": { @@ -6496,6 +6672,7 @@ "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", "dev": true, + "license": "MIT", "dependencies": { "is-typedarray": "^1.0.0" } @@ -6543,22 +6720,25 @@ } }, "node_modules/undici-types": { - "version": "6.19.4", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.4.tgz", - "integrity": "sha512-BiKTnNSkjSEYzxd0X3KQ/ZNoA8/aFlS598kds3PuZ55csLy3fFqGap0aP84Ekb/VWYG5um4MgilNs3kAx4LHMg==" + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "dev": true, + "license": "MIT" }, "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", "engines": { "node": ">= 10.0.0" } }, "node_modules/update-browserslist-db": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz", - "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz", + "integrity": "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==", "dev": true, "funding": [ { @@ -6568,14 +6748,19 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.2.0", + "picocolors": "^1.1.1" }, "bin": { - "browserslist-lint": "cli.js" + "update-browserslist-db": "cli.js" }, "peerDependencies": { "browserslist": ">= 4.21.0" @@ -6585,14 +6770,16 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } }, "node_modules/utf8-byte-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", - "integrity": "sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==" + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", + "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==", + "license": "(WTFPL OR MIT)" }, "node_modules/util-deprecate": { "version": "1.0.2", @@ -6601,31 +6788,31 @@ "license": "MIT" }, "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", + "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", "bin": { - "uuid": "dist/bin/uuid" + "uuid": "dist/esm/bin/uuid" } }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true + "dev": true, + "license": "BSD-2-Clause" }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "dev": true, + "license": "MIT", "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -6695,13 +6882,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/which-builtin-type/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, - "license": "MIT" - }, "node_modules/which-collection": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", @@ -6722,9 +6902,10 @@ } }, "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "license": "ISC" }, "node_modules/which-typed-array": { "version": "1.1.19", @@ -6785,10 +6966,11 @@ } }, "node_modules/word-wrap": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", - "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -6797,12 +6979,14 @@ "version": "6.5.1", "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "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==", + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -6816,13 +7000,15 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/write-file-atomic": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "dev": true, + "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", @@ -6833,12 +7019,21 @@ "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==" + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "license": "ISC" + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" }, "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==", + "license": "MIT", "dependencies": { "cliui": "^6.0.0", "decamelize": "^1.2.0", @@ -6860,6 +7055,7 @@ "version": "20.2.9", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "license": "ISC", "engines": { "node": ">=10" } @@ -6869,6 +7065,7 @@ "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", "dev": true, + "license": "MIT", "dependencies": { "camelcase": "^6.0.0", "decamelize": "^4.0.0", @@ -6884,6 +7081,7 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -6896,6 +7094,7 @@ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -6907,6 +7106,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -6919,6 +7119,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -6930,6 +7131,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -6944,6 +7146,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -6951,26 +7154,11 @@ "node": ">=8" } }, - "node_modules/yargs/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "engines": { - "node": ">=8" - } - }, "node_modules/yargs/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==", + "license": "ISC", "dependencies": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" @@ -6984,6 +7172,7 @@ "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", "integrity": "sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -6993,5025 +7182,13 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } - }, - "node_modules/zlib": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/zlib/-/zlib-1.0.5.tgz", - "integrity": "sha512-40fpE2II+Cd3k8HWTWONfeKE2jL+P42iWJ1zzps5W51qcTsOUKM5Q5m2PFb0CLxlmFAaUuUdJGc3OfZy947v0w==", - "dev": true, - "hasInstallScript": true, - "engines": { - "node": ">=0.2.0" - } - } - }, - "dependencies": { - "@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/compat-data": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.8.tgz", - "integrity": "sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==", - "dev": true - }, - "@babel/core": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.10.tgz", - "integrity": "sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw==", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.10", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-module-transforms": "^7.18.9", - "@babel/helpers": "^7.18.9", - "@babel/parser": "^7.18.10", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.18.10", - "@babel/types": "^7.18.10", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "dev": true, - "requires": { - "@babel/highlight": "^7.18.6" - } - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", - "dev": true, - "requires": { - "@babel/types": "^7.23.0", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - } - } - } - }, - "@babel/helper-compilation-targets": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz", - "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.18.8", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.20.2", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true - }, - "@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "requires": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-module-transforms": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz", - "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.18.6", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" - } - }, - "@babel/helper-simple-access": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", - "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "dev": true - }, - "@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", - "dev": true - }, - "@babel/helpers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.1.tgz", - "integrity": "sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==", - "dev": true, - "requires": { - "@babel/template": "^7.27.1", - "@babel/types": "^7.27.1" - } - }, - "@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.1.tgz", - "integrity": "sha512-I0dZ3ZpCrJ1c04OqlNsQcKiZlsrXf/kkE4FXzID9rIOYICsAbA8mMDzhW/luRNAHdCNt7os/u8wenklZDlUVUQ==", - "dev": true, - "requires": { - "@babel/types": "^7.27.1" - } - }, - "@babel/template": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.1.tgz", - "integrity": "sha512-Fyo3ghWMqkHHpHQCoBs2VnYjR4iWFFjguTDEqA5WgZDOrFesVjMhMM2FSqTKSoUSDO1VQtavj8NFpdRBEvJTtg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.27.1", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - } - } - } - }, - "@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.0", - "@babel/types": "^7.23.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", - "dev": true, - "requires": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/types": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.1.tgz", - "integrity": "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" - } - }, - "@colors/colors": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", - "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==" - }, - "@dabh/diagnostics": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.8.tgz", - "integrity": "sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==", - "requires": { - "@so-ric/colorspace": "^1.1.6", - "enabled": "2.0.x", - "kuler": "^2.0.0" - } - }, - "@eslint/eslintrc": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", - "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "js-yaml": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - } - } - }, - "@humanwhocodes/config-array": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", - "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.0", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - } - }, - "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "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, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "js-yaml": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "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, - "requires": { - "p-locate": "^4.1.0" - } - }, - "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, - "requires": { - "p-try": "^2.0.0" - } - }, - "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, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - } - } - }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true - }, - "@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true - }, - "@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@rtsao/scc": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", - "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", - "dev": true - }, - "@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/fake-timers": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", - "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.7.0" - } - }, - "@sinonjs/samsam": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.1.1.tgz", - "integrity": "sha512-cZ7rKJTLiE7u7Wi/v9Hc2fs3Ucc3jrWeMgPHbbTCeVAB2S0wOBbYlkJVeNSL04i7fdhT8wIbDq1zhC/PXTD2SA==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.6.0", - "lodash.get": "^4.4.2", - "type-detect": "^4.0.8" - } - }, - "@sinonjs/text-encoding": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", - "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", - "dev": true - }, - "@so-ric/colorspace": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@so-ric/colorspace/-/colorspace-1.1.6.tgz", - "integrity": "sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==", - "requires": { - "color": "^5.0.2", - "text-hex": "1.0.x" - } - }, - "@types/fs-extra": { - "version": "9.0.13", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", - "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true - }, - "@types/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-FOvQ0YPD5NOfPgMzJihoT+Za5pdkDJWcbpuj1DjaKZIr/gxodQjY/uWEFlTNqW2ugXHUiL8lRQgw63dzKHZdeQ==", - "dev": true - }, - "@types/mocha": { - "version": "10.0.10", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.10.tgz", - "integrity": "sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==", - "dev": true - }, - "@types/nconf": { - "version": "0.10.7", - "resolved": "https://registry.npmjs.org/@types/nconf/-/nconf-0.10.7.tgz", - "integrity": "sha512-ltJgbQX0XgjkeDrz0anTCXLBLatppWYFCxp88ILEwybfAuyNWr0Qb+ceFFqZ0VDR8fguEjr0hH37ZF+AF4gsxw==", - "dev": true - }, - "@types/node": { - "version": "18.7.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.2.tgz", - "integrity": "sha512-ce7MIiaYWCFv6A83oEultwhBXb22fxwNOQf5DIxWA4WXvDQ7K+L0fbWl/YOfCzlR5B/uFkSnVBhPcOfOECcWvA==", - "dev": true - }, - "@types/triple-beam": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", - "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==" - }, - "@typescript-eslint/parser": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "debug": "^4.3.4" - } - }, - "@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - } - }, - "@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - } - }, - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} - }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "append-transform": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", - "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", - "dev": true, - "requires": { - "default-require-extensions": "^3.0.0" - } - }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", - "dev": true - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "array-buffer-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", - "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", - "dev": true, - "requires": { - "call-bound": "^1.0.3", - "is-array-buffer": "^3.0.5" - } - }, - "array-includes": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", - "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.24.0", - "es-object-atoms": "^1.1.1", - "get-intrinsic": "^1.3.0", - "is-string": "^1.1.1", - "math-intrinsics": "^1.1.0" - } - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "array.prototype.findlastindex": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", - "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "es-shim-unscopables": "^1.1.0" - } - }, - "array.prototype.flat": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", - "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", - "dev": true, - "requires": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-shim-unscopables": "^1.0.2" - } - }, - "array.prototype.flatmap": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", - "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", - "dev": true, - "requires": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-shim-unscopables": "^1.0.2" - } - }, - "arraybuffer.prototype.slice": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", - "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", - "dev": true, - "requires": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "is-array-buffer": "^3.0.4" - } - }, - "assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true - }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true - }, - "async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" - }, - "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 - }, - "auth0": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/auth0/-/auth0-4.37.0.tgz", - "integrity": "sha512-+TqJRxh4QvbD4TQIYx1ak2vanykQkG/nIZLuR6o8LoQj425gjVG3tFuUbbOeh/nCpP1rnvU0CCV1ChZHYXLU/A==", - "requires": { - "jose": "^4.13.2", - "undici-types": "^6.15.0", - "uuid": "^9.0.0" - }, - "dependencies": { - "uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==" - } - } - }, - "available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dev": true, - "requires": { - "possible-typed-array-names": "^1.0.0" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "requires": { - "fill-range": "^7.1.1" - } - }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "browserslist": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", - "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001370", - "electron-to-chromium": "^1.4.202", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.5" - } - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "caching-transform": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", - "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", - "dev": true, - "requires": { - "hasha": "^5.0.0", - "make-dir": "^3.0.0", - "package-hash": "^4.0.0", - "write-file-atomic": "^3.0.0" - } - }, - "call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", - "dev": true, - "requires": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" - } - }, - "call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dev": true, - "requires": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - } - }, - "call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "dev": true, - "requires": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" - }, - "caniuse-lite": { - "version": "1.0.30001375", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001375.tgz", - "integrity": "sha512-kWIMkNzLYxSvnjy0hL8w1NOaWNr2rn39RTAVyIwcw8juu60bZDWiF1/loOYANzjtJmy6qPgNmn38ro5Pygagdw==", - "dev": true - }, - "chai": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz", - "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==", - "dev": true, - "requires": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.3", - "deep-eql": "^4.1.3", - "get-func-name": "^2.0.2", - "loupe": "^2.3.6", - "pathval": "^1.1.1", - "type-detect": "^4.1.0" - }, - "dependencies": { - "type-detect": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", - "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", - "dev": true - } - } - }, - "chai-as-promised": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.2.tgz", - "integrity": "sha512-aBDHZxRzYnUYuIAIPBH2s511DjlKPzXNlXSGFC8CwmroWQLfrW0LtE1nK3MAwwNhJPa9raEjNCmRoFpG0Hurdw==", - "dev": true, - "requires": { - "check-error": "^1.0.2" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "check-error": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", - "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", - "dev": true, - "requires": { - "get-func-name": "^2.0.2" - } - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "color": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/color/-/color-5.0.2.tgz", - "integrity": "sha512-e2hz5BzbUPcYlIRHo8ieAhYgoajrJr+hWoceg6E345TPsATMUKqDgzt8fSXZJJbxfpiPzkWyphz8yn8At7q3fA==", - "requires": { - "color-convert": "^3.0.1", - "color-string": "^2.0.0" - }, - "dependencies": { - "color-convert": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-3.1.2.tgz", - "integrity": "sha512-UNqkvCDXstVck3kdowtOTWROIJQwafjOfXSmddoDrXo4cewMKmusCeF22Q24zvjR8nwWib/3S/dfyzPItPEiJg==", - "requires": { - "color-name": "^2.0.0" - } - }, - "color-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.0.2.tgz", - "integrity": "sha512-9vEt7gE16EW7Eu7pvZnR0abW9z6ufzhXxGXZEVU9IqPdlsUiMwJeJfRtq0zePUmnbHGT9zajca7mX8zgoayo4A==" - } - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "color-string": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-2.1.2.tgz", - "integrity": "sha512-RxmjYxbWemV9gKu4zPgiZagUxbH3RQpEIO77XoSSX0ivgABDZ+h8Zuash/EMFLTI4N9QgFPOJ6JQpPZKFxa+dA==", - "requires": { - "color-name": "^2.0.0" - }, - "dependencies": { - "color-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.0.2.tgz", - "integrity": "sha512-9vEt7gE16EW7Eu7pvZnR0abW9z6ufzhXxGXZEVU9IqPdlsUiMwJeJfRtq0zePUmnbHGT9zajca7mX8zgoayo4A==" - } - } - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "confusing-browser-globals": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", - "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", - "dev": true - }, - "convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, - "cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "data-view-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", - "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", - "dev": true, - "requires": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - } - }, - "data-view-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", - "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", - "dev": true, - "requires": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - } - }, - "data-view-byte-offset": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", - "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", - "dev": true, - "requires": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - } - }, - "debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "dev": true, - "requires": { - "ms": "^2.1.3" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==" - }, - "deep-eql": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", - "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", - "dev": true, - "requires": { - "type-detect": "^4.0.0" - } - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "default-require-extensions": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", - "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", - "dev": true, - "requires": { - "strip-bom": "^4.0.0" - } - }, - "define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, - "requires": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - } - }, - "define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "requires": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, - "diff": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", - "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "requires": { - "is-obj": "^2.0.0" - } - }, - "dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, - "requires": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - } - }, - "electron-to-chromium": { - "version": "1.4.215", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.215.tgz", - "integrity": "sha512-vqZxT8C5mlDZ//hQFhneHmOLnj1LhbzxV0+I1yqHV8SB1Oo4Y5Ne9+qQhwHl7O1s9s9cRuo2l5CoLEHdhMTwZg==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "enabled": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", - "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "requires": { - "ansi-colors": "^4.1.1" - } - }, - "es-abstract": { - "version": "1.24.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", - "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", - "dev": true, - "requires": { - "array-buffer-byte-length": "^1.0.2", - "arraybuffer.prototype.slice": "^1.0.4", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "data-view-buffer": "^1.0.2", - "data-view-byte-length": "^1.0.2", - "data-view-byte-offset": "^1.0.1", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "es-set-tostringtag": "^2.1.0", - "es-to-primitive": "^1.3.0", - "function.prototype.name": "^1.1.8", - "get-intrinsic": "^1.3.0", - "get-proto": "^1.0.1", - "get-symbol-description": "^1.1.0", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "internal-slot": "^1.1.0", - "is-array-buffer": "^3.0.5", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.2", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.2.1", - "is-set": "^2.0.3", - "is-shared-array-buffer": "^1.0.4", - "is-string": "^1.1.1", - "is-typed-array": "^1.1.15", - "is-weakref": "^1.1.1", - "math-intrinsics": "^1.1.0", - "object-inspect": "^1.13.4", - "object-keys": "^1.1.1", - "object.assign": "^4.1.7", - "own-keys": "^1.0.1", - "regexp.prototype.flags": "^1.5.4", - "safe-array-concat": "^1.1.3", - "safe-push-apply": "^1.0.0", - "safe-regex-test": "^1.1.0", - "set-proto": "^1.0.0", - "stop-iteration-iterator": "^1.1.0", - "string.prototype.trim": "^1.2.10", - "string.prototype.trimend": "^1.0.9", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.3", - "typed-array-byte-length": "^1.0.3", - "typed-array-byte-offset": "^1.0.4", - "typed-array-length": "^1.0.7", - "unbox-primitive": "^1.1.0", - "which-typed-array": "^1.1.19" - } - }, - "es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "dev": true - }, - "es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true - }, - "es-object-atoms": { - "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==", - "dev": true, - "requires": { - "es-errors": "^1.3.0" - } - }, - "es-set-tostringtag": { - "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, - "requires": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - } - }, - "es-shim-unscopables": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", - "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", - "dev": true, - "requires": { - "hasown": "^2.0.2" - } - }, - "es-to-primitive": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", - "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", - "dev": true, - "requires": { - "is-callable": "^1.2.7", - "is-date-object": "^1.0.5", - "is-symbol": "^1.0.4" - } - }, - "es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "eslint": { - "version": "7.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", - "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", - "dev": true, - "requires": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.3", - "@humanwhocodes/config-array": "^0.5.0", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.1.2", - "globals": "^13.6.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^6.0.9", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - }, - "js-yaml": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - } - } - }, - "eslint-config-airbnb-base": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", - "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", - "dev": true, - "requires": { - "confusing-browser-globals": "^1.0.10", - "object.assign": "^4.1.2", - "object.entries": "^1.1.5", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "eslint-config-prettier": { - "version": "10.1.8", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", - "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", - "dev": true, - "requires": {} - }, - "eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", - "dev": true, - "requires": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "eslint-module-utils": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", - "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", - "dev": true, - "requires": { - "debug": "^3.2.7" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "eslint-plugin-import": { - "version": "2.32.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", - "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", - "dev": true, - "requires": { - "@rtsao/scc": "^1.1.0", - "array-includes": "^3.1.9", - "array.prototype.findlastindex": "^1.2.6", - "array.prototype.flat": "^1.3.3", - "array.prototype.flatmap": "^1.3.3", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.12.1", - "hasown": "^2.0.2", - "is-core-module": "^2.16.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "object.groupby": "^1.0.3", - "object.values": "^1.2.1", - "semver": "^6.3.1", - "string.prototype.trimend": "^1.0.9", - "tsconfig-paths": "^3.15.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } - } - }, - "eslint-visitor-keys": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", - "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", - "dev": true - }, - "espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", - "dev": true, - "requires": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "fast-glob": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", - "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", - "dev": true, - "requires": { - "@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" - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "fecha": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", - "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - } - }, - "flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.6.tgz", - "integrity": "sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==", - "dev": true - }, - "fn.name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", - "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" - }, - "for-each": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", - "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", - "dev": true, - "requires": { - "is-callable": "^1.2.7" - } - }, - "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, - "requires": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" - } - }, - "fromentries": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", - "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", - "dev": true - }, - "fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true - }, - "function.prototype.name": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", - "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", - "dev": true, - "requires": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "functions-have-names": "^1.2.3", - "hasown": "^2.0.2", - "is-callable": "^1.2.7" - } - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true - }, - "functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - }, - "get-func-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", - "dev": true - }, - "get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "dev": true, - "requires": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - } - }, - "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true - }, - "get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dev": true, - "requires": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - } - }, - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "get-symbol-description": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", - "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", - "dev": true, - "requires": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6" - } - }, - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "dev": true, - "requires": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - } - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "dependencies": { - "ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true - } - } - }, - "gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true - }, - "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" - }, - "has-bigints": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", - "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, - "requires": { - "es-define-property": "^1.0.0" - } - }, - "has-proto": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", - "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", - "dev": true, - "requires": { - "dunder-proto": "^1.0.0" - } - }, - "has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "dev": true - }, - "has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, - "requires": { - "has-symbols": "^1.0.3" - } - }, - "hasha": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", - "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", - "dev": true, - "requires": { - "is-stream": "^2.0.0", - "type-fest": "^0.8.0" - }, - "dependencies": { - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - } - } - }, - "hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, - "requires": { - "function-bind": "^1.1.2" - } - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "dev": true - }, - "husky": { - "version": "9.1.7", - "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", - "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==", - "dev": true - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==" - }, - "internal-slot": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", - "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", - "dev": true, - "requires": { - "es-errors": "^1.3.0", - "hasown": "^2.0.2", - "side-channel": "^1.1.0" - } - }, - "is-array-buffer": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", - "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", - "dev": true, - "requires": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - } - }, - "is-async-function": { - "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, - "requires": { - "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" - } - }, - "is-bigint": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", - "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", - "dev": true, - "requires": { - "has-bigints": "^1.0.2" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-boolean-object": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", - "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", - "dev": true, - "requires": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - } - }, - "is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true - }, - "is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "dev": true, - "requires": { - "hasown": "^2.0.2" - } - }, - "is-data-view": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", - "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", - "dev": true, - "requires": { - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "is-typed-array": "^1.1.13" - } - }, - "is-date-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", - "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", - "dev": true, - "requires": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "is-finalizationregistry": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", - "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", - "dev": true, - "requires": { - "call-bound": "^1.0.3" - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "is-generator-function": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", - "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", - "dev": true, - "requires": { - "call-bound": "^1.0.3", - "get-proto": "^1.0.0", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - } - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", - "dev": true - }, - "is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-number-object": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", - "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", - "dev": true, - "requires": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - } - }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" - }, - "is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true - }, - "is-regex": { - "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, - "requires": { - "call-bound": "^1.0.2", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - } - }, - "is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", - "dev": true - }, - "is-shared-array-buffer": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", - "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", - "dev": true, - "requires": { - "call-bound": "^1.0.3" - } - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" - }, - "is-string": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", - "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", - "dev": true, - "requires": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - } - }, - "is-symbol": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", - "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", - "dev": true, - "requires": { - "call-bound": "^1.0.2", - "has-symbols": "^1.1.0", - "safe-regex-test": "^1.1.0" - } - }, - "is-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", - "dev": true, - "requires": { - "which-typed-array": "^1.1.16" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true - }, - "is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true - }, - "is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", - "dev": true - }, - "is-weakref": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", - "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", - "dev": true, - "requires": { - "call-bound": "^1.0.3" - } - }, - "is-weakset": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", - "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", - "dev": true, - "requires": { - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - } - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true - }, - "istanbul-lib-hook": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", - "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", - "dev": true, - "requires": { - "append-transform": "^2.0.0" - } - }, - "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, - "requires": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "istanbul-lib-processinfo": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", - "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", - "dev": true, - "requires": { - "archy": "^1.0.0", - "cross-spawn": "^7.0.3", - "istanbul-lib-coverage": "^3.2.0", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "uuid": "^8.3.2" - } - }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - } - }, - "istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - } - }, - "istanbul-reports": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz", - "integrity": "sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "jose": { - "version": "4.15.9", - "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.9.tgz", - "integrity": "sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==" - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", - "requires": { - "argparse": "^2.0.1" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true - }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "just-extend": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", - "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", - "dev": true - }, - "kacl": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/kacl/-/kacl-1.1.1.tgz", - "integrity": "sha512-qA2xJP0A+BZpNPnfSNJfJvBT7WWkK614gxlhOfodSR+hbOEEnBzfx8h7Zt2HauV79JOSKCMjdqt4SbDUJ2vtWQ==", - "dev": true - }, - "kuler": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", - "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", - "dev": true - }, - "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==", - "dev": true - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true - }, - "log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - } - }, - "logform": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", - "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==", - "requires": { - "@colors/colors": "1.6.0", - "@types/triple-beam": "^1.3.2", - "fecha": "^4.2.0", - "ms": "^2.1.1", - "safe-stable-stringify": "^2.3.1", - "triple-beam": "^1.3.0" - } - }, - "loupe": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", - "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", - "dev": true, - "requires": { - "get-func-name": "^2.0.1" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "dev": true - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "requires": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" - }, - "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, - "requires": { - "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" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "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, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "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" - } - } - } - }, - "mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", - "dev": true - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "nconf": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/nconf/-/nconf-0.13.0.tgz", - "integrity": "sha512-hJ/u2xCpA663h6xyOiztx3y+lg9eU0rdkwJ+c4FtiHo2g/gB0sjXtW31yTdMLWLOIj1gL2FcJMwfOqouuUK/Wg==", - "requires": { - "async": "^3.0.0", - "ini": "^2.0.0", - "secure-keys": "^1.0.0", - "yargs": "^16.1.1" - }, - "dependencies": { - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "requires": { - "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" - } - } - } - }, - "next-tick": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", - "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" - }, - "nise": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.1.tgz", - "integrity": "sha512-yr5kW2THW1AkxVmCnKEh4nbYkJdB3I7LUkiUgOvEkOp414mc2UMaHMA7pjq1nYowhdoJZGwEKGaQVbxfpWj10A==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.8.3", - "@sinonjs/fake-timers": ">=5", - "@sinonjs/text-encoding": "^0.7.1", - "just-extend": "^4.0.2", - "path-to-regexp": "^1.7.0" - } - }, - "nock": { - "version": "13.5.6", - "resolved": "https://registry.npmjs.org/nock/-/nock-13.5.6.tgz", - "integrity": "sha512-o2zOYiCpzRqSzPj0Zt/dQ/DqZeYoaQ7TUonc/xUPjCGl9WeHpNbxgVvOquXYAaJzI0M9BXV3HTzG0p8IUAbBTQ==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "json-stringify-safe": "^5.0.1", - "propagate": "^2.0.0" - } - }, - "node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dev": true, - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "node-preload": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", - "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", - "dev": true, - "requires": { - "process-on-spawn": "^1.0.0" - } - }, - "node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", - "dev": true - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "nyc": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", - "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", - "dev": true, - "requires": { - "@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.1.4", - "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" - }, - "dependencies": { - "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, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "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, - "requires": { - "p-locate": "^4.1.0" - } - }, - "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, - "requires": { - "p-try": "^2.0.0" - } - }, - "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, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, - "object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "dev": true - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object.assign": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", - "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", - "dev": true, - "requires": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0", - "has-symbols": "^1.1.0", - "object-keys": "^1.1.1" - } - }, - "object.entries": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", - "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - } - }, - "object.fromentries": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", - "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - } - }, - "object.groupby": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", - "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2" - } - }, - "object.values": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", - "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", - "dev": true, - "requires": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "one-time": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", - "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", - "requires": { - "fn.name": "1.x.x" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "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, - "requires": { - "get-intrinsic": "^1.2.6", - "object-keys": "^1.1.1", - "safe-push-apply": "^1.0.0" - } - }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==" - }, - "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, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "package-hash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", - "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.15", - "hasha": "^5.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "path-to-regexp": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz", - "integrity": "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==", - "dev": true, - "requires": { - "isarray": "0.0.1" - } - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true - }, - "picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - }, - "dependencies": { - "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, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "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, - "requires": { - "p-locate": "^4.1.0" - } - }, - "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, - "requires": { - "p-try": "^2.0.0" - } - }, - "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, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - } - } - }, - "possible-typed-array-names": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", - "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", - "dev": true - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "dev": true - }, - "pretty-quick": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/pretty-quick/-/pretty-quick-3.3.1.tgz", - "integrity": "sha512-3b36UXfYQ+IXXqex6mCca89jC8u0mYLqFAN5eTQKoXO6oCQYcIVYZEB/5AlBHI7JPYygReM2Vv6Vom/Gln7fBg==", - "dev": true, - "requires": { - "execa": "^4.1.0", - "find-up": "^4.1.0", - "ignore": "^5.3.0", - "mri": "^1.2.0", - "picocolors": "^1.0.0", - "picomatch": "^3.0.1", - "tslib": "^2.6.2" - }, - "dependencies": { - "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, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", - "dev": true - }, - "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, - "requires": { - "p-locate": "^4.1.0" - } - }, - "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, - "requires": { - "p-try": "^2.0.0" - } - }, - "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, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "picomatch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-3.0.1.tgz", - "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==", - "dev": true - }, - "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", - "dev": true - } - } - }, - "process-on-spawn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", - "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", - "dev": true, - "requires": { - "fromentries": "^1.2.0" - } - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "promise-batcher": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/promise-batcher/-/promise-batcher-1.1.0.tgz", - "integrity": "sha512-Q/+G7i1ZqRCx56s9W1RRjhK6xveb2UkZz4Lt6xksO3SjcglDrRrQ4YRQ4WtalOFCzUNiAhstLLOX31QJRmr/BA==", - "requires": { - "p-defer": "^3.0.0" - }, - "dependencies": { - "p-defer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-3.0.0.tgz", - "integrity": "sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw==" - } - } - }, - "promise-pool-executor": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/promise-pool-executor/-/promise-pool-executor-1.1.1.tgz", - "integrity": "sha512-WZTGr7E8tiW93QoSRe0+arBIrJ13m7yKov/vyWqP8nkME/OjfzZgmSJjLtcDHd6VVz2LdSoAHZLmDfis8hJd1w==", - "requires": { - "debug": "^3.1.0", - "next-tick": "^1.0.0", - "p-defer": "^1.0.0", - "promise-batcher": "^1.0.1" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "propagate": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/propagate/-/propagate-2.0.1.tgz", - "integrity": "sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==", - "dev": true - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "reflect.getprototypeof": { - "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, - "requires": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.7", - "get-proto": "^1.0.1", - "which-builtin-type": "^1.2.1" - } - }, - "regexp.prototype.flags": { - "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, - "requires": { - "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" - } - }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true - }, - "release-zalgo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", - "dev": true, - "requires": { - "es6-error": "^4.0.1" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" - }, - "resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "requires": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "rmdir-sync": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rmdir-sync/-/rmdir-sync-1.0.1.tgz", - "integrity": "sha512-Fp12ZE5QArxMIfyPIfWh9Jc/n98pCZWGYOpy6u0P1ZdrHN+4dPZLpa57DuSL2Ie2wMcbOrBGv57eHQmxfINtow==", - "dev": true - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "safe-array-concat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", - "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", - "dev": true, - "requires": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "has-symbols": "^1.1.0", - "isarray": "^2.0.5" - }, - "dependencies": { - "isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - } - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "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, - "requires": { - "es-errors": "^1.3.0", - "isarray": "^2.0.5" - }, - "dependencies": { - "isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - } - } - }, - "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, - "requires": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-regex": "^1.2.1" - } - }, - "safe-stable-stringify": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", - "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==" - }, - "sanitize-filename": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", - "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", - "requires": { - "truncate-utf8-bytes": "^1.0.0" - } - }, - "secure-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/secure-keys/-/secure-keys-1.0.0.tgz", - "integrity": "sha512-nZi59hW3Sl5P3+wOO89eHBAAGwmCPd2aE1+dLZV5MO+ItQctIvAqihzaAXIQhvtH4KJPxM080HsnqltR2y8cWg==" - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" - }, - "set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dev": true, - "requires": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - } - }, - "set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "dev": true, - "requires": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - } - }, - "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, - "requires": { - "dunder-proto": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0" - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "dev": true, - "requires": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - } - }, - "side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "dev": true, - "requires": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - } - }, - "side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "dev": true, - "requires": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - } - }, - "side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "dev": true, - "requires": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - } - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "sinon": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-13.0.2.tgz", - "integrity": "sha512-KvOrztAVqzSJWMDoxM4vM+GPys1df2VBoXm+YciyB/OLMamfS3VXh3oGh5WtrAGSzrgczNWFFY22oKb7Fi5eeA==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.8.3", - "@sinonjs/fake-timers": "^9.1.2", - "@sinonjs/samsam": "^6.1.1", - "diff": "^5.0.0", - "nise": "^5.1.1", - "supports-color": "^7.2.0" - } - }, - "sinon-chai": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-3.7.0.tgz", - "integrity": "sha512-mf5NURdUaSdnatJx3uhoBOrY9dtL19fiOtAdT1Azxg3+lNJFiuN0uzaU3xX1LeAfL17kHQhTAJgpsfhbMJMY2g==", - "dev": true, - "requires": {} - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "spawn-wrap": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", - "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", - "dev": true, - "requires": { - "foreground-child": "^2.0.0", - "is-windows": "^1.0.2", - "make-dir": "^3.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "which": "^2.0.1" - } - }, - "stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==" - }, - "stop-iteration-iterator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", - "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", - "dev": true, - "requires": { - "es-errors": "^1.3.0", - "internal-slot": "^1.1.0" - } - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "requires": { - "safe-buffer": "~5.2.0" - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "string.prototype.trim": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", - "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", - "dev": true, - "requires": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-data-property": "^1.1.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-object-atoms": "^1.0.0", - "has-property-descriptors": "^1.0.2" - } - }, - "string.prototype.trimend": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", - "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - } - }, - "string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", - "dev": true, - "requires": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "table": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.0.tgz", - "integrity": "sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==", - "dev": true, - "requires": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - } - } - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, - "text-hex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", - "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "triple-beam": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", - "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==" - }, - "truncate-utf8-bytes": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", - "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", - "requires": { - "utf8-byte-length": "^1.0.1" - } - }, - "ts-mocha": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/ts-mocha/-/ts-mocha-10.1.0.tgz", - "integrity": "sha512-T0C0Xm3/WqCuF2tpa0GNGESTBoKZaiqdUP8guNv4ZY316AFXlyidnrzQ1LUrCT0Wb1i3J0zFTgOh/55Un44WdA==", - "dev": true, - "requires": { - "ts-node": "7.0.1", - "tsconfig-paths": "^3.5.0" - } - }, - "ts-node": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", - "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", - "dev": true, - "requires": { - "arrify": "^1.0.0", - "buffer-from": "^1.1.0", - "diff": "^3.1.0", - "make-error": "^1.1.1", - "minimist": "^1.2.0", - "mkdirp": "^0.5.1", - "source-map-support": "^0.5.6", - "yn": "^2.0.0" - }, - "dependencies": { - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", - "dev": true - }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true - }, - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "requires": { - "minimist": "^1.2.6" - } - } - } - }, - "tsconfig-paths": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", - "dev": true, - "requires": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true - } - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - }, - "typed-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", - "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", - "dev": true, - "requires": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.14" - } - }, - "typed-array-byte-length": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", - "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", - "dev": true, - "requires": { - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.14" - } - }, - "typed-array-byte-offset": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", - "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", - "dev": true, - "requires": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.15", - "reflect.getprototypeof": "^1.0.9" - } - }, - "typed-array-length": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", - "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", - "dev": true, - "requires": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0", - "reflect.getprototypeof": "^1.0.6" - } - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true - }, - "unbox-primitive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", - "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", - "dev": true, - "requires": { - "call-bound": "^1.0.3", - "has-bigints": "^1.0.2", - "has-symbols": "^1.1.0", - "which-boxed-primitive": "^1.1.1" - } - }, - "undici": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.16.0.tgz", - "integrity": "sha512-QEg3HPMll0o3t2ourKwOeUAZ159Kn9mx5pnzHRQO8+Wixmh88YdZRiIwat0iNzNNXn0yoEtXJqFpyW7eM8BV7g==" - }, - "undici-types": { - "version": "6.19.4", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.4.tgz", - "integrity": "sha512-BiKTnNSkjSEYzxd0X3KQ/ZNoA8/aFlS598kds3PuZ55csLy3fFqGap0aP84Ekb/VWYG5um4MgilNs3kAx4LHMg==" - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" - }, - "update-browserslist-db": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz", - "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==", - "dev": true, - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "requires": { - "punycode": "^2.1.0" - } - }, - "utf8-byte-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", - "integrity": "sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==" - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true - }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-boxed-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", - "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", - "dev": true, - "requires": { - "is-bigint": "^1.1.0", - "is-boolean-object": "^1.2.1", - "is-number-object": "^1.1.1", - "is-string": "^1.1.1", - "is-symbol": "^1.1.1" - } - }, - "which-builtin-type": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", - "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", - "dev": true, - "requires": { - "call-bound": "^1.0.2", - "function.prototype.name": "^1.1.6", - "has-tostringtag": "^1.0.2", - "is-async-function": "^2.0.0", - "is-date-object": "^1.1.0", - "is-finalizationregistry": "^1.1.0", - "is-generator-function": "^1.0.10", - "is-regex": "^1.2.1", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.1.0", - "which-collection": "^1.0.2", - "which-typed-array": "^1.1.16" - }, - "dependencies": { - "isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - } - } - }, - "which-collection": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", - "dev": true, - "requires": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==" - }, - "which-typed-array": { - "version": "1.1.19", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", - "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", - "dev": true, - "requires": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "for-each": "^0.3.5", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2" - } - }, - "winston": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.19.0.tgz", - "integrity": "sha512-LZNJgPzfKR+/J3cHkxcpHKpKKvGfDZVPS4hfJCc4cCG0CgYzvlD6yE/S3CIL/Yt91ak327YCpiF/0MyeZHEHKA==", - "requires": { - "@colors/colors": "^1.6.0", - "@dabh/diagnostics": "^2.0.8", - "async": "^3.2.3", - "is-stream": "^2.0.0", - "logform": "^2.7.0", - "one-time": "^1.0.0", - "readable-stream": "^3.4.0", - "safe-stable-stringify": "^2.3.1", - "stack-trace": "0.0.x", - "triple-beam": "^1.3.0", - "winston-transport": "^4.9.0" - } - }, - "winston-transport": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz", - "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==", - "requires": { - "logform": "^2.7.0", - "readable-stream": "^3.6.2", - "triple-beam": "^1.3.0" - } - }, - "word-wrap": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", - "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", - "dev": true - }, - "workerpool": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", - "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", - "dev": true - }, - "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==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "requires": { - "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" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "requires": { - "p-try": "^2.0.0" - } - }, - "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==", - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "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==" - }, - "yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "dev": true, - "requires": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, - "dependencies": { - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true - }, - "decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true - } - } - }, - "yn": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", - "integrity": "sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==", - "dev": true - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true - }, - "zlib": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/zlib/-/zlib-1.0.5.tgz", - "integrity": "sha512-40fpE2II+Cd3k8HWTWONfeKE2jL+P42iWJ1zzps5W51qcTsOUKM5Q5m2PFb0CLxlmFAaUuUdJGc3OfZy947v0w==", - "dev": true } } } diff --git a/package.json b/package.json index 2f6e4420f..b79e3982f 100644 --- a/package.json +++ b/package.json @@ -1,14 +1,14 @@ { "name": "auth0-deploy-cli", - "version": "8.22.0", + "version": "8.20.4-beta.0", "description": "A command line tool for deploying updates to your Auth0 tenant", "main": "lib/index.js", "bin": { "a0deploy": "lib/index.js" }, "scripts": { - "lint:fix": "eslint --fix --ignore-path .eslintignore --ignore-pattern webpack . && kacl lint", - "lint": "eslint --ignore-path .eslintignore --ignore-pattern webpack . && kacl lint", + "lint:fix": "eslint --fix . && kacl lint", + "lint": "eslint . && kacl lint", "format": "npx prettier --write .", "test": "ts-mocha -p tsconfig.json --recursive 'test/**/*.test*' --exclude 'test/e2e/*' --timeout 20000", "test:e2e:node-module": "ts-mocha -p tsconfig.json --recursive 'test/e2e/*.test*' --timeout 120000", @@ -33,7 +33,7 @@ "homepage": "https://github.com/auth0/auth0-deploy-cli#readme", "dependencies": { "ajv": "^6.12.6", - "auth0": "^4.37.0", + "auth0": "^5.2.0", "dot-prop": "^5.3.0", "fs-extra": "^10.1.0", "js-yaml": "^4.1.1", @@ -51,13 +51,15 @@ "@types/lodash": "^4.17.21", "@types/mocha": "^10.0.10", "@types/nconf": "^0.10.7", - "@typescript-eslint/parser": "^5.62.0", + "@eslint/js": "^9.39.2", + "@typescript-eslint/eslint-plugin": "^8.50.0", + "@typescript-eslint/parser": "^8.50.0", "chai": "^4.5.0", "chai-as-promised": "^7.1.2", - "eslint": "^7.32.0", - "eslint-config-airbnb-base": "^15.0.0", + "eslint": "^9.39.2", "eslint-config-prettier": "^10.1.8", "eslint-plugin-import": "^2.32.0", + "globals": "^15.12.0", "husky": "^9.1.7", "kacl": "^1.1.1", "mocha": "^10.8.2", @@ -71,11 +73,10 @@ "sinon": "^13.0.2", "sinon-chai": "^3.7.0", "ts-mocha": "^10.1.0", - "typescript": "^5.9.3", - "zlib": "^1.0.5" + "typescript": "^5.9.3" }, "engines": { - "node": ">=20.18.1" + "node": ">=20.19.0" }, "keywords": [ "auth0", diff --git a/src/context/defaults.ts b/src/context/defaults.ts index 63a80df62..a37d8db19 100644 --- a/src/context/defaults.ts +++ b/src/context/defaults.ts @@ -90,6 +90,27 @@ export function phoneProviderDefaults(phoneProvider) { return updated; } +export function phoneTemplatesDefaults(phoneTemplate) { + const updated = { ...phoneTemplate }; + + // Strip read-only fields that are returned by the API but should not be included in exported config + const removeKeysFromOutput = [ + 'id', + 'channel', + 'customizable', + 'tenant', + 'created_at', + 'updated_at', + ]; + removeKeysFromOutput.forEach((key) => { + if (key in updated) { + delete updated[key]; + } + }); + + return updated; +} + export function connectionDefaults(connection) { if (connection.options) { // Mask secret for key: connection.options.client_secret diff --git a/src/context/directory/handlers/clientGrants.ts b/src/context/directory/handlers/clientGrants.ts index ebea6de76..430abe207 100644 --- a/src/context/directory/handlers/clientGrants.ts +++ b/src/context/directory/handlers/clientGrants.ts @@ -1,6 +1,5 @@ import path from 'path'; import fs from 'fs-extra'; -import { Client, ResourceServer } from 'auth0'; import { constants, keywordReplace } from '../../../tools'; import { @@ -17,6 +16,8 @@ import { ParsedAsset } from '../../../types'; import { ClientGrant } from '../../../tools/auth0/handlers/clientGrants'; import { paginate } from '../../../tools/auth0/client'; import { doesHaveKeywordMarker } from '../../../keywordPreservation'; +import { ResourceServer } from '../../../tools/auth0/handlers/resourceServers'; +import { Client } from '../../../tools/auth0/handlers/clients'; type ParsedClientGrants = ParsedAsset<'clientGrants', ClientGrant[]>; @@ -51,14 +52,14 @@ async function dump(context: DirectoryContext): Promise { if (clientGrants.length === 0) return; const allResourceServers = await paginate( - context.mgmtClient.resourceServers.getAll, + context.mgmtClient.resourceServers.list, { paginate: true, include_totals: true, } ); - const allClients = await paginate(context.mgmtClient.clients.getAll, { + const allClients = await paginate(context.mgmtClient.clients.list, { paginate: true, include_totals: true, }); @@ -80,7 +81,9 @@ async function dump(context: DirectoryContext): Promise { })(); // Convert audience to the API name for readability - const apiName = (grantAudience: string) => { + const apiName = (grantAudience: string | undefined) => { + if (!grantAudience) return grantAudience; + const associatedAPI = allResourceServers.find( (resourceServer) => resourceServer.identifier === grantAudience ); diff --git a/src/context/directory/handlers/connectionProfiles.ts b/src/context/directory/handlers/connectionProfiles.ts index 78bd26eb1..b57cdec1f 100644 --- a/src/context/directory/handlers/connectionProfiles.ts +++ b/src/context/directory/handlers/connectionProfiles.ts @@ -1,12 +1,12 @@ import path from 'path'; import fs from 'fs-extra'; -import { ConnectionProfile } from 'auth0'; import { constants } from '../../../tools'; import log from '../../../logger'; import { dumpJSON, existsMustBeDir, getFiles, loadJSON, sanitize } from '../../../utils'; import DirectoryContext from '..'; import { ParsedAsset } from '../../../types'; +import { ConnectionProfile } from '../../../tools/auth0/handlers/connectionProfiles'; type ParsedConnectionProfiles = ParsedAsset<'connectionProfiles', Partial[]>; diff --git a/src/context/directory/handlers/flowVaultConnections.ts b/src/context/directory/handlers/flowVaultConnections.ts index 1ea45e0e2..8d7238a2e 100644 --- a/src/context/directory/handlers/flowVaultConnections.ts +++ b/src/context/directory/handlers/flowVaultConnections.ts @@ -71,6 +71,7 @@ async function dump(context: DirectoryContext) { }); }); + // eslint-disable-next-line no-console console.warn( 'WARNING! Flow vault connections `setup` key does not support keyword preservation, `export` or `dump` commmand will not preserve `setup` key in local configuration file.' ); diff --git a/src/context/directory/handlers/index.ts b/src/context/directory/handlers/index.ts index e1107ff5d..14faa0f1f 100644 --- a/src/context/directory/handlers/index.ts +++ b/src/context/directory/handlers/index.ts @@ -20,6 +20,7 @@ import triggers from './triggers'; import attackProtection from './attackProtection'; import branding from './branding'; import phoneProviders from './phoneProvider'; +import phoneTemplates from './phoneTemplates'; import logStreams from './logStreams'; import prompts from './prompts'; import customDomains from './customDomains'; @@ -33,6 +34,7 @@ import flowVaultConnections from './flowVaultConnections'; import networkACLs from './networkACLs'; import userAttributeProfiles from './userAttributeProfiles'; import connectionProfiles from './connectionProfiles'; +import tokenExchangeProfiles from './tokenExchangeProfiles'; import DirectoryContext from '..'; import { AssetTypes, Asset } from '../../../types'; @@ -71,6 +73,7 @@ const directoryHandlers: { attackProtection, branding, phoneProviders, + phoneTemplates, logStreams, prompts, customDomains, @@ -82,6 +85,7 @@ const directoryHandlers: { networkACLs, userAttributeProfiles, connectionProfiles, + tokenExchangeProfiles, }; export default directoryHandlers; diff --git a/src/context/directory/handlers/phoneTemplates.ts b/src/context/directory/handlers/phoneTemplates.ts new file mode 100644 index 000000000..e8ab3204b --- /dev/null +++ b/src/context/directory/handlers/phoneTemplates.ts @@ -0,0 +1,52 @@ +import path from 'path'; +import fs from 'fs-extra'; +import { constants } from '../../../tools'; + +import { existsMustBeDir, getFiles, dumpJSON, loadJSON } from '../../../utils'; +import { DirectoryHandler } from '.'; +import DirectoryContext from '..'; +import { ParsedAsset } from '../../../types'; +import { PhoneTemplate } from '../../../tools/auth0/handlers/phoneTemplates'; +import { phoneTemplatesDefaults } from '../../defaults'; + +type ParsedPhoneTemplates = ParsedAsset<'phoneTemplates', PhoneTemplate[]>; + +function parse(context: DirectoryContext): ParsedPhoneTemplates { + const phoneTemplatesFolder = path.join(context.filePath, constants.PHONE_TEMPLATES_DIRECTORY); + if (!existsMustBeDir(phoneTemplatesFolder)) return { phoneTemplates: null }; // Skip + + const files = getFiles(phoneTemplatesFolder, ['.json']); + + const phoneTemplates = files.map((f) => + loadJSON(f, { + mappings: context.mappings, + disableKeywordReplacement: context.disableKeywordReplacement, + }) + ); + + return { phoneTemplates }; +} + +async function dump(context: DirectoryContext): Promise { + const { phoneTemplates } = context.assets; + + if (!phoneTemplates) { + return; + } // Skip, nothing to dump + + const phoneTemplatesFolder = path.join(context.filePath, constants.PHONE_TEMPLATES_DIRECTORY); + fs.ensureDirSync(phoneTemplatesFolder); + + phoneTemplates.forEach((template) => { + const templateWithDefaults = phoneTemplatesDefaults(template); + const templateFile = path.join(phoneTemplatesFolder, `${template.type}.json`); + dumpJSON(templateFile, templateWithDefaults); + }); +} + +const phoneTemplatesHandler: DirectoryHandler = { + parse, + dump, +}; + +export default phoneTemplatesHandler; diff --git a/src/context/directory/handlers/resourceServers.ts b/src/context/directory/handlers/resourceServers.ts index 6b48bb2d6..086f12881 100644 --- a/src/context/directory/handlers/resourceServers.ts +++ b/src/context/directory/handlers/resourceServers.ts @@ -1,4 +1,3 @@ -import { Client, ResourceServer } from 'auth0'; import path from 'path'; import fs from 'fs-extra'; import { constants } from '../../../tools'; @@ -14,6 +13,8 @@ import { DirectoryHandler } from '.'; import DirectoryContext from '..'; import { ParsedAsset } from '../../../types'; import { paginate } from '../../../tools/auth0/client'; +import { ResourceServer } from '../../../tools/auth0/handlers/resourceServers'; +import { Client } from '../../../tools/auth0/handlers/clients'; type ParsedResourceServers = ParsedAsset<'resourceServers', ResourceServer[]>; @@ -47,7 +48,7 @@ async function dump(context: DirectoryContext): Promise { fs.ensureDirSync(resourceServersFolder); if (clients === undefined) { - clients = await paginate(context.mgmtClient.clients.getAll, { + clients = await paginate(context.mgmtClient.clients.list, { paginate: true, include_totals: true, }); diff --git a/src/context/directory/handlers/selfServiceProfiles.ts b/src/context/directory/handlers/selfServiceProfiles.ts index 41f0a1cec..ae9f65ce3 100644 --- a/src/context/directory/handlers/selfServiceProfiles.ts +++ b/src/context/directory/handlers/selfServiceProfiles.ts @@ -67,7 +67,6 @@ async function dump(context: DirectoryContext): Promise { profile.user_attribute_profile_id = p?.name || profile.user_attribute_profile_id; if (profile.user_attributes?.length === 0) { - // @ts-expect-error - ignore type error here as we know that user_attributes can be removed. delete profile.user_attributes; } } diff --git a/src/context/directory/handlers/tokenExchangeProfiles.ts b/src/context/directory/handlers/tokenExchangeProfiles.ts new file mode 100644 index 000000000..323161bdc --- /dev/null +++ b/src/context/directory/handlers/tokenExchangeProfiles.ts @@ -0,0 +1,51 @@ +import path from 'path'; +import fs from 'fs-extra'; +import { constants } from '../../../tools'; +import log from '../../../logger'; +import { getFiles, existsMustBeDir, dumpJSON, loadJSON, sanitize } from '../../../utils'; +import { DirectoryHandler } from '.'; +import DirectoryContext from '..'; +import { Asset, ParsedAsset } from '../../../types'; + +type ParsedTokenExchangeProfiles = ParsedAsset<'tokenExchangeProfiles', Asset[]>; + +function parse(context: DirectoryContext): ParsedTokenExchangeProfiles { + const folder = path.join(context.filePath, constants.TOKEN_EXCHANGE_PROFILES_DIRECTORY); + if (!existsMustBeDir(folder)) return { tokenExchangeProfiles: null }; // Skip + + const files = getFiles(folder, ['.json']); + + const profiles = files.map((f) => + loadJSON(f, { + mappings: context.mappings, + disableKeywordReplacement: context.disableKeywordReplacement, + }) + ); + + return { + tokenExchangeProfiles: profiles, + }; +} + +async function dump(context: DirectoryContext) { + const { tokenExchangeProfiles } = context.assets; + + if (!tokenExchangeProfiles || !Array.isArray(tokenExchangeProfiles)) return; // Skip + + const folder = path.join(context.filePath, constants.TOKEN_EXCHANGE_PROFILES_DIRECTORY); + fs.ensureDirSync(folder); + + tokenExchangeProfiles.forEach((profile) => { + const { id, created_at, updated_at, ...profileWithoutMetadata } = profile; + const fileName = path.join(folder, sanitize(`${profile.name}.json`)); + log.info(`Writing ${fileName}`); + dumpJSON(fileName, profileWithoutMetadata); + }); +} + +const handler: DirectoryHandler = { + parse, + dump, +}; + +export default handler; diff --git a/src/context/directory/handlers/triggers.ts b/src/context/directory/handlers/triggers.ts index b37b8b213..480524ea8 100644 --- a/src/context/directory/handlers/triggers.ts +++ b/src/context/directory/handlers/triggers.ts @@ -8,7 +8,7 @@ import { getFiles, existsMustBeDir, loadJSON } from '../../../utils'; import log from '../../../logger'; import { Asset, ParsedAsset } from '../../../types'; -type ParsedTriggers = ParsedAsset<'triggers', Asset[]>; +type ParsedTriggers = ParsedAsset<'triggers', Asset>; function parse(context: DirectoryContext): ParsedTriggers { const triggersFolder = path.join(context.filePath, constants.TRIGGERS_DIRECTORY); diff --git a/src/context/directory/handlers/userAttributeProfiles.ts b/src/context/directory/handlers/userAttributeProfiles.ts index 7b01a6c89..e140be8bb 100644 --- a/src/context/directory/handlers/userAttributeProfiles.ts +++ b/src/context/directory/handlers/userAttributeProfiles.ts @@ -1,11 +1,11 @@ import path from 'path'; import fs from 'fs-extra'; -import { UserAttributeProfile } from 'auth0'; import { constants } from '../../../tools'; import DirectoryContext from '..'; import { dumpJSON, existsMustBeDir, getFiles, loadJSON, sanitize } from '../../../utils'; import { DirectoryHandler } from '.'; import { ParsedAsset } from '../../../types'; +import { UserAttributeProfile } from '../../../tools/auth0/handlers/userAttributeProfiles'; type ParsedUserAttributeProfiles = ParsedAsset< 'userAttributeProfiles', diff --git a/src/context/index.ts b/src/context/index.ts index 268dfcbce..9d03f50b5 100644 --- a/src/context/index.ts +++ b/src/context/index.ts @@ -202,10 +202,10 @@ export const setupContext = async ( const mgmtClient = new ManagementClient({ domain: config.AUTH0_DOMAIN, token: accessToken, - retry: { maxRetries: config.AUTH0_API_MAX_RETRIES || 10, enabled: true }, headers: { 'User-agent': `deploy-cli/${packageVersion} (node.js/${process.version.replace('v', '')})`, }, + maxRetries: config.AUTH0_API_MAX_RETRIES || 10, }); const inputFile = config.AUTH0_INPUT_FILE; diff --git a/src/context/yaml/handlers/clientGrants.ts b/src/context/yaml/handlers/clientGrants.ts index 5c14c9851..fcf6d28ea 100644 --- a/src/context/yaml/handlers/clientGrants.ts +++ b/src/context/yaml/handlers/clientGrants.ts @@ -1,10 +1,10 @@ -import { Client } from 'auth0'; import { convertClientIdToName } from '../../../utils'; import { YAMLHandler } from '.'; import YAMLContext from '..'; import { ParsedAsset } from '../../../types'; import { ClientGrant } from '../../../tools/auth0/handlers/clientGrants'; import { paginate } from '../../../tools/auth0/client'; +import { Client } from '../../../tools/auth0/handlers/clients'; type ParsedClientGrants = ParsedAsset<'clientGrants', ClientGrant[]>; @@ -25,7 +25,7 @@ async function dump(context: YAMLContext): Promise { if (!clientGrants) return { clientGrants: null }; if (clients === undefined) { - clients = await paginate(context.mgmtClient.clients.getAll, { + clients = await paginate(context.mgmtClient.clients.list, { paginate: true, include_totals: true, }); diff --git a/src/context/yaml/handlers/connectionProfiles.ts b/src/context/yaml/handlers/connectionProfiles.ts index 6ec40cd1c..e8111076f 100644 --- a/src/context/yaml/handlers/connectionProfiles.ts +++ b/src/context/yaml/handlers/connectionProfiles.ts @@ -1,5 +1,5 @@ -import { ConnectionProfile } from 'auth0'; import YAMLContext from '..'; +import { ConnectionProfile } from '../../../tools/auth0/handlers/connectionProfiles'; import { ParsedAsset } from '../../../types'; type ParsedConnectionProfiles = ParsedAsset<'connectionProfiles', Partial[]>; diff --git a/src/context/yaml/handlers/flowVaultConnections.ts b/src/context/yaml/handlers/flowVaultConnections.ts index 91a9226df..6a18f88d2 100644 --- a/src/context/yaml/handlers/flowVaultConnections.ts +++ b/src/context/yaml/handlers/flowVaultConnections.ts @@ -40,6 +40,7 @@ async function dump(context: YAMLContext): Promise { }); }); + // eslint-disable-next-line no-console console.warn( 'WARNING! Flow vault connections `setup` key does not support keyword preservation, `export` or `dump` commmand will not preserve `setup` key in local configuration file.' ); diff --git a/src/context/yaml/handlers/index.ts b/src/context/yaml/handlers/index.ts index 46c60a793..f6bbf8f0e 100644 --- a/src/context/yaml/handlers/index.ts +++ b/src/context/yaml/handlers/index.ts @@ -20,6 +20,7 @@ import triggers from './triggers'; import attackProtection from './attackProtection'; import branding from './branding'; import phoneProviders from './phoneProvider'; +import phoneTemplates from './phoneTemplates'; import logStreams from './logStreams'; import prompts from './prompts'; import customDomains from './customDomains'; @@ -33,6 +34,7 @@ import flowVaultConnections from './flowVaultConnections'; import networkACLs from './networkACLs'; import userAttributeProfiles from './userAttributeProfiles'; import connectionProfiles from './connectionProfiles'; +import tokenExchangeProfiles from './tokenExchangeProfiles'; import YAMLContext from '..'; import { AssetTypes } from '../../../types'; @@ -69,6 +71,7 @@ const yamlHandlers: { [key in AssetTypes]: YAMLHandler<{ [key: string]: unknown attackProtection, branding, phoneProviders, + phoneTemplates, logStreams, prompts, customDomains, @@ -80,6 +83,7 @@ const yamlHandlers: { [key in AssetTypes]: YAMLHandler<{ [key: string]: unknown networkACLs, userAttributeProfiles, connectionProfiles, + tokenExchangeProfiles, }; export default yamlHandlers; diff --git a/src/context/yaml/handlers/phoneTemplates.ts b/src/context/yaml/handlers/phoneTemplates.ts new file mode 100644 index 000000000..1ce0ab6d2 --- /dev/null +++ b/src/context/yaml/handlers/phoneTemplates.ts @@ -0,0 +1,36 @@ +import { YAMLHandler } from '.'; +import YAMLContext from '..'; +import { PhoneTemplate } from '../../../tools/auth0/handlers/phoneTemplates'; +import { ParsedAsset } from '../../../types'; +import { phoneTemplatesDefaults } from '../../defaults'; + +type ParsedPhoneTemplates = ParsedAsset<'phoneTemplates', PhoneTemplate[]>; + +async function parse(context: YAMLContext): Promise { + const { phoneTemplates } = context.assets; + + if (!phoneTemplates) return { phoneTemplates: null }; + + return { + phoneTemplates, + }; +} + +async function dump(context: YAMLContext): Promise { + const { phoneTemplates } = context.assets; + + if (!phoneTemplates) return { phoneTemplates: null }; + + const processedTemplates = phoneTemplates.map((template) => phoneTemplatesDefaults(template)); + + return { + phoneTemplates: processedTemplates, + }; +} + +const phoneTemplatesHandler: YAMLHandler = { + parse, + dump, +}; + +export default phoneTemplatesHandler; diff --git a/src/context/yaml/handlers/prompts.ts b/src/context/yaml/handlers/prompts.ts index aa20e0f62..3a1392286 100644 --- a/src/context/yaml/handlers/prompts.ts +++ b/src/context/yaml/handlers/prompts.ts @@ -1,6 +1,6 @@ import path from 'path'; import { ensureDirSync, writeFileSync } from 'fs-extra'; -import { GetRendering200Response } from 'auth0'; +import { Management } from 'auth0'; import { YAMLHandler } from '.'; import YAMLContext from '..'; import { constants } from '../../../tools'; @@ -22,9 +22,9 @@ const getPromptsDirectory = (filePath: string) => path.join(filePath, constants. const loadScreenRenderers = ( context: YAMLContext, screenRenderArray: ScreenRenderYAML -): GetRendering200Response[] => { +): Management.GetAculResponseContent[] => { // Array to store loaded renderers - const loadedRenderers: GetRendering200Response[] = []; + const loadedRenderers: Management.GetAculResponseContent[] = []; screenRenderArray.forEach((promptEntry) => { // Get the prompt (there will be only one key in each entry) diff --git a/src/context/yaml/handlers/resourceServers.ts b/src/context/yaml/handlers/resourceServers.ts index 81a62518d..9f5f9250e 100644 --- a/src/context/yaml/handlers/resourceServers.ts +++ b/src/context/yaml/handlers/resourceServers.ts @@ -1,9 +1,10 @@ -import { Client, ResourceServer } from 'auth0'; import { YAMLHandler } from '.'; import YAMLContext from '..'; import { ParsedAsset } from '../../../types'; import { paginate } from '../../../tools/auth0/client'; import { convertClientIdToName } from '../../../utils'; +import { ResourceServer } from '../../../tools/auth0/handlers/resourceServers'; +import { Client } from '../../../tools/auth0/handlers/clients'; type ParsedResourceServers = ParsedAsset<'resourceServers', ResourceServer[]>; @@ -16,7 +17,7 @@ async function dumpAndParse(context: YAMLContext): Promise(context.mgmtClient.clients.getAll, { + clients = await paginate(context.mgmtClient.clients.list, { paginate: true, include_totals: true, }); diff --git a/src/context/yaml/handlers/selfServiceProfiles.ts b/src/context/yaml/handlers/selfServiceProfiles.ts index f08541bd2..0c2dcde05 100644 --- a/src/context/yaml/handlers/selfServiceProfiles.ts +++ b/src/context/yaml/handlers/selfServiceProfiles.ts @@ -37,7 +37,6 @@ async function dump(context: YAMLContext): Promise { profile.user_attribute_profile_id = p?.name || profile.user_attribute_profile_id; if (profile.user_attributes?.length === 0) { - // @ts-expect-error - ignore type error here as we know that user_attributes can be removed. delete profile.user_attributes; } } diff --git a/src/context/yaml/handlers/tokenExchangeProfiles.ts b/src/context/yaml/handlers/tokenExchangeProfiles.ts new file mode 100644 index 000000000..b3517c3af --- /dev/null +++ b/src/context/yaml/handlers/tokenExchangeProfiles.ts @@ -0,0 +1,36 @@ +import { YAMLHandler } from '.'; +import YAMLContext from '..'; +import { Asset, ParsedAsset } from '../../../types'; + +type ParsedTokenExchangeProfiles = ParsedAsset<'tokenExchangeProfiles', Asset[]>; + +async function parse(context: YAMLContext): Promise { + const { tokenExchangeProfiles } = context.assets; + + if (!tokenExchangeProfiles) return { tokenExchangeProfiles: null }; + + return { + tokenExchangeProfiles, + }; +} + +async function dump(context: YAMLContext): Promise { + const { tokenExchangeProfiles } = context.assets; + + if (!tokenExchangeProfiles) return { tokenExchangeProfiles: null }; + + return { + tokenExchangeProfiles: tokenExchangeProfiles.map((profile) => { + // Strip server-generated fields + const { id, created_at, updated_at, ...cleanProfile } = profile; + return cleanProfile; + }), + }; +} + +const handler: YAMLHandler = { + parse, + dump, +}; + +export default handler; diff --git a/src/context/yaml/handlers/triggers.ts b/src/context/yaml/handlers/triggers.ts index e71949d0d..3c3aa2537 100644 --- a/src/context/yaml/handlers/triggers.ts +++ b/src/context/yaml/handlers/triggers.ts @@ -2,7 +2,7 @@ import { YAMLHandler } from '.'; import YAMLContext from '..'; import { Asset, ParsedAsset } from '../../../types'; -type ParsedTriggers = ParsedAsset<'triggers', Asset[]>; +type ParsedTriggers = ParsedAsset<'triggers', Asset>; async function parse(context: YAMLContext): Promise { // Load the script file for each action diff --git a/src/context/yaml/handlers/userAttributeProfiles.ts b/src/context/yaml/handlers/userAttributeProfiles.ts index 42e0b4516..37f4bda4d 100644 --- a/src/context/yaml/handlers/userAttributeProfiles.ts +++ b/src/context/yaml/handlers/userAttributeProfiles.ts @@ -1,6 +1,6 @@ -import { UserAttributeProfile } from 'auth0'; import { YAMLHandler } from '.'; import YAMLContext from '..'; +import { UserAttributeProfile } from '../../../tools/auth0/handlers/userAttributeProfiles'; import { ParsedAsset } from '../../../types'; type ParsedUserAttributeProfiles = ParsedAsset< diff --git a/src/index.ts b/src/index.ts index d7f3ce55a..6fbb8a321 100644 --- a/src/index.ts +++ b/src/index.ts @@ -85,7 +85,14 @@ if (require.main === module) { } // Export commands to be used programmatically -export default { +// Explicit type to avoid non-portable type inference +const cliCommands: { + deploy: typeof importCMD; + dump: typeof exportCMD; + import: typeof importCMD; + export: typeof exportCMD; + tools: typeof tools; +} = { deploy: importCMD, dump: exportCMD, import: importCMD, @@ -93,5 +100,7 @@ export default { tools, }; +export default cliCommands; + export const dump = exportCMD; export const deploy = importCMD; diff --git a/src/keywordPreservation.ts b/src/keywordPreservation.ts index dbbefb86d..3e2463480 100644 --- a/src/keywordPreservation.ts +++ b/src/keywordPreservation.ts @@ -15,13 +15,21 @@ import log from './logger'; Original Github Issue: https://github.com/auth0/auth0-deploy-cli/issues/328 */ -export const doesHaveKeywordMarker = (string: string, keywordMappings: KeywordMappings): boolean => - !Object.keys(keywordMappings).every((keyword) => { +export const doesHaveKeywordMarker = ( + string: string | undefined, + keywordMappings: KeywordMappings +): boolean => { + if (string === undefined) { + return false; + } + + return !Object.keys(keywordMappings).every((keyword) => { const hasArrayMarker = keywordReplaceArrayRegExp(keyword).test(string); const hasStringMarker = keywordReplaceStringRegExp(keyword).test(string); return !hasArrayMarker && !hasStringMarker; }); +}; export const getPreservableFieldsFromAssets = ( asset: object, @@ -292,6 +300,7 @@ export const preserveKeywords = ({ })(); if (!localAndRemoteValuesAreEqual) { + // eslint-disable-next-line no-console console.warn( `WARNING! The remote value with address of ${address} has value of "${remoteValue}" but will be preserved with "${localValueWithReplacement}" due to keyword preservation.` ); diff --git a/src/tools/auth0/client.ts b/src/tools/auth0/client.ts index 932094ff1..3226b5240 100644 --- a/src/tools/auth0/client.ts +++ b/src/tools/auth0/client.ts @@ -11,6 +11,14 @@ import { PagePaginationParams, } from '../../types'; +type JSONApiResponseWithPage = JSONApiResponse & { + response: { + start: number; + limit: number; + total: number; + }; +}; + const API_CONCURRENCY = 3; // To ensure a complete deployment, limit the API requests generated to be 80% of the capacity // https://auth0.com/docs/policies/rate-limits#management-api-v2 @@ -18,31 +26,37 @@ const API_FREQUENCY_PER_SECOND = 8; const MAX_PAGE_SIZE = 100; -function getEntity(rsp: ApiResponse | Asset[]): Asset[] { - // Extract all array values from the response object - const found = Object.values(rsp).filter((a) => Array.isArray(a)); - - // If response contains exactly one array property, return it as the entity list - if (Array.isArray(found) && found.length === 1) { - return found[0] as Asset[]; - } - - // If the response itself is an array, return it directly +function getEntity(rsp: ApiResponse): Asset[] { + // If the response is already an array, return it directly (v5 SDK behavior) if (Array.isArray(rsp)) { return rsp as Asset[]; } - // If empty response case - return empty array instead of throwing error - if (Array.isArray(found) && found.length === 0) { - return []; + // If the response is an object, look for array properties (legacy behavior) + if (typeof rsp === 'object' && rsp !== null) { + const found = Object.values(rsp).filter((a) => Array.isArray(a)); + if (found.length === 1) { + return found[0] as Asset[]; + } + // If we can't find exactly one array, but there's a property that looks like it contains the data + // Try some common property names from Auth0 SDK v5 + if ('data' in rsp && Array.isArray(rsp.data)) { + return rsp.data as Asset[]; + } + + // Handle empty response case - return empty array instead of throwing error + if (Array.isArray(found) && found.length === 0) { + return []; + } } + throw new Error('There was an error trying to find the entity within paginate'); } function checkpointPaginator( client: Auth0APIClient, target, - name: 'getAll' + name: 'list' ): (arg0: CheckpointPaginationParams) => Promise { return async function (...args: [CheckpointPaginationParams]) { const data: Asset[] = []; @@ -50,40 +64,30 @@ function checkpointPaginator( // remove the _checkpoint_ flag const { checkpoint, ...newArgs } = _.cloneDeep(args[0]); - // fetch the total to validate records match - const total = - ( - await client.pool - .addSingleTask({ - data: newArgs, - generator: (requestArgs) => target[name](requestArgs), - }) - .promise() - ).data?.total || 0; - - let done = false; - // use checkpoint pagination to allow fetching 1000+ results - newArgs.take = newArgs.take ?? 50; - - while (!done) { - const rsp = await client.pool + // Set appropriate page size for checkpoint pagination + newArgs.take = newArgs.take || 50; // Default to 50 + + let currentPage = await client.pool + .addSingleTask({ + data: newArgs, + generator: (requestArgs) => target[name](requestArgs), + }) + .promise(); + + // Add first page data + data.push(...(currentPage.data || [])); + + // Continue fetching while there are more pages + while (currentPage.hasNextPage && currentPage.hasNextPage()) { + const pageToFetch = currentPage; // Capture the current page reference + currentPage = await client.pool .addSingleTask({ - data: newArgs, - generator: (requestArgs) => target[name](requestArgs), + data: null, + generator: () => pageToFetch.getNextPage(), }) .promise(); - data.push(...getEntity(rsp.data)); - if (!rsp.data.next) { - done = true; - } else { - newArgs.from = rsp.data.next; - } - } - - // Not all entities return total, so only validate when we have a total - if (total > 0 && data.length !== total) { - throw new Error('Fail to load data from tenant'); + data.push(...(currentPage.data || [])); } return data; @@ -93,7 +97,7 @@ function checkpointPaginator( function pagePaginator( client: Auth0APIClient, target, - name: 'getAll' + name: 'list' ): (arg0: PagePaginationParams) => Promise { return async function (...args: [PagePaginationParams]): Promise { // Where the entity data will be collected @@ -109,7 +113,7 @@ function pagePaginator( delete newArgs[0].paginate; // Run the first request to get the total number of entity items - const rsp: JSONApiResponse = await client.pool + const rsp: JSONApiResponseWithPage = await client.pool .addSingleTask({ data: _.cloneDeep(newArgs), generator: (pageArgs) => target[name](...pageArgs), @@ -117,7 +121,16 @@ function pagePaginator( .promise(); data.push(...getEntity(rsp.data)); - const total = rsp.data?.total || 0; + // In Auth0 SDK v5, the total is not provided + const total = rsp.response?.total || 0; + + // If total is 0 but we have data, it likely means the response doesn't include pagination info + // In this case, we should assume this is all the data and skip pagination + const initialDataLength = getEntity(rsp.data).length; + if (total === 0 && initialDataLength > 0) { + return data; // Return what we have without pagination + } + const pagesLeft = Math.ceil(total / perPage) - 1; // Setup pool to get the rest of the pages if (pagesLeft > 0) { @@ -135,7 +148,9 @@ function pagePaginator( data.push(...flatten(pages)); - if (data.length !== total) { + // Only validate total if it was provided (non-zero) + // In Auth0 SDK v5,endpoints don't provide total count + if (total > 0 && data.length !== total) { throw new Error('Fail to load data from tenant'); } } @@ -147,7 +162,7 @@ function pagePaginator( function pagedManager(client: Auth0APIClient, manager: Auth0APIClient) { return new Proxy(manager, { get: function (target: Auth0APIClient, name: string, receiver: unknown) { - if (name === 'getAll') { + if (name === 'list') { return async function (...args: [CheckpointPaginationParams | PagePaginationParams]) { switch (true) { case args[0] && typeof args[0] === 'object' && args[0].checkpoint: @@ -177,16 +192,20 @@ function pagedManager(client: Auth0APIClient, manager: Auth0APIClient) { // Warp around the ManagementClient and detect when requesting specific pages to return all export default function pagedClient(client: ManagementClient): Auth0APIClient { - const clientWithPooling: Auth0APIClient = { - ...client, - pool: new PromisePoolExecutor({ - concurrencyLimit: API_CONCURRENCY, - frequencyLimit: API_FREQUENCY_PER_SECOND, - frequencyWindow: 1000, // 1 sec - }), - } as Auth0APIClient; - - return pagedManager(clientWithPooling, clientWithPooling); + // Create a new object that inherits from the original client + const clientWithPooling = Object.create(Object.getPrototypeOf(client)); + + // Copy all enumerable properties from the original client + Object.assign(clientWithPooling, client); + + // Add the pool property + clientWithPooling.pool = new PromisePoolExecutor({ + concurrencyLimit: API_CONCURRENCY, + frequencyLimit: API_FREQUENCY_PER_SECOND, + frequencyWindow: 1000, // 1 sec + }); + + return pagedManager(clientWithPooling as Auth0APIClient, clientWithPooling as Auth0APIClient); } // eslint-disable-next-line no-unused-vars @@ -194,7 +213,7 @@ export async function paginate( fetchFunc: (...paginateArgs: any) => any, args: PagePaginationParams | CheckpointPaginationParams ): Promise { - // override default .getAll() behaviour using pagedClient + // override default .list() behaviour using pagedClient const allItems = (await fetchFunc(args)) as unknown as T[]; return allItems; } diff --git a/src/tools/auth0/handlers/actions.ts b/src/tools/auth0/handlers/actions.ts index eee14ee6f..cf3ceadf8 100644 --- a/src/tools/auth0/handlers/actions.ts +++ b/src/tools/auth0/handlers/actions.ts @@ -1,5 +1,5 @@ -import _ from 'lodash'; -import { GetActions200ResponseActionsInner, PostActionRequest } from 'auth0'; +import { get } from 'lodash'; +import { Management } from 'auth0'; import DefaultAPIHandler, { order } from './default'; import log from '../../../logger'; import { areArraysEquals, sleep } from '../../utils'; @@ -8,31 +8,12 @@ import { paginate } from '../client'; const MAX_ACTION_DEPLOY_RETRY_ATTEMPTS = 60; // 60 * 2s => 2 min timeout -export type Action = { - id: string; - name: string; - created_at: string; - updated_at: string; +export type Action = Management.Action & { deployed?: boolean; - supported_triggers: { - id: string; - version: string; - status?: string; - }[]; - code?: string; - dependencies?: []; - runtime?: string; - status?: string; - secrets?: { - name: string; - value: string; - }[]; - all_changes_deployed?: boolean; - installed_integration_id?: string; - integration?: Object; }; +type ActionCreate = Management.CreateActionRequestContent; -type PostActionRequestWithId = PostActionRequest & { +type CreateActionRequestWithId = ActionCreate & { id: string; }; @@ -88,7 +69,7 @@ export const schema = { }; function isActionsDisabled(err) { - const errorBody = _.get(err, 'originalError.response.body') || {}; + const errorBody = get(err, 'originalError.response.body') || {}; return err.statusCode === 403 && errorBody.errorCode === 'feature_not_enabled'; } @@ -98,21 +79,23 @@ export function isMarketplaceAction(action: Action): boolean { } export default class ActionHandler extends DefaultAPIHandler { - existing: GetActions200ResponseActionsInner[] | null; + existing: Action[] | null; constructor(options: DefaultAPIHandler) { super({ ...options, type: 'actions', functions: { - create: (action: PostActionRequestWithId) => this.createAction(action), - delete: (action: Action) => this.deleteAction(action), + create: (action: CreateActionRequestWithId) => this.createAction(action), + update: ({ id }: { id: string }, action: Management.UpdateActionRequestContent) => + this.updateAction(id, action), + delete: (actionId: string) => this.deleteAction(actionId), }, stripUpdateFields: ['deployed', 'status'], }); } - async createAction(action: PostActionRequestWithId) { + async createAction(action: CreateActionRequestWithId) { // Strip the deployed flag const addAction = { ...action }; @@ -123,19 +106,25 @@ export default class ActionHandler extends DefaultAPIHandler { delete addAction.status; } - const { data: createdAction } = await this.client.actions.create(addAction); + const createdAction = await this.client.actions.create(addAction); // Add the action id so we can deploy it later - action.id = createdAction.id; + if (createdAction?.id) { + action.id = createdAction.id; + } return createdAction; } - async deleteAction(action: Action) { + async updateAction(actionId: string, action: Management.UpdateActionRequestContent) { + return this.client.actions.update(actionId, action); + } + + async deleteAction(actionId: string) { if (!this.client.actions || typeof this.client.actions.delete !== 'function') { return []; } - return this.client.actions.delete({ id: action.id, force: true }); + return this.client.actions.delete(actionId, { force: true }); } objString(action) { @@ -160,7 +149,7 @@ export default class ActionHandler extends DefaultAPIHandler { async deployAction(action) { try { - await this.client.actions.deploy({ id: action.id }); + await this.client.actions.deploy(action.id); } catch (err) { // Retry if pending build. if (err.message && err.message.includes("must be in the 'built' state")) { @@ -209,18 +198,15 @@ export default class ActionHandler extends DefaultAPIHandler { async getType(): Promise { if (this.existing) return this.existing; - if (!this.client.actions || typeof this.client.actions.getAll !== 'function') { + if (!this.client.actions || typeof this.client.actions.list !== 'function') { return []; } // Actions API does not support include_totals param like the other paginate API's. // So we set it to false otherwise it will fail with "Additional properties not allowed: include_totals" try { - const actions = await paginate( - this.client.actions.getAll, - { - paginate: true, - } - ); + const actions = await paginate(this.client.actions.list, { + paginate: true, + }); this.existing = actions; return actions; diff --git a/src/tools/auth0/handlers/attackProtection.ts b/src/tools/auth0/handlers/attackProtection.ts index ae6f095b4..112f087be 100644 --- a/src/tools/auth0/handlers/attackProtection.ts +++ b/src/tools/auth0/handlers/attackProtection.ts @@ -240,9 +240,9 @@ export default class AttackProtectionHandler extends DefaultAPIHandler { const [breachedPasswordDetection, bruteForceProtection, suspiciousIpThrottling] = await Promise.all([ - this.client.attackProtection.getBreachedPasswordDetectionConfig(), - this.client.attackProtection.getBruteForceConfig(), - this.client.attackProtection.getSuspiciousIpThrottlingConfig(), + this.client.attackProtection.breachedPasswordDetection.get(), + this.client.attackProtection.bruteForceProtection.get(), + this.client.attackProtection.suspiciousIpThrottling.get(), ]); let botDetection: Asset | null = null; @@ -250,8 +250,8 @@ export default class AttackProtectionHandler extends DefaultAPIHandler { try { [botDetection, captcha] = await Promise.all([ - this.client.attackProtection.getBotDetectionConfig(), - this.client.attackProtection.getCaptchaConfig(), + this.client.attackProtection.botDetection.get(), + this.client.attackProtection.captcha.get(), ]); } catch (err) { if (err.statusCode === 403) { @@ -262,17 +262,17 @@ export default class AttackProtectionHandler extends DefaultAPIHandler { } const attackProtection: AttackProtection = { - breachedPasswordDetection: breachedPasswordDetection.data, - bruteForceProtection: bruteForceProtection.data, - suspiciousIpThrottling: suspiciousIpThrottling.data, + breachedPasswordDetection: breachedPasswordDetection, + bruteForceProtection: bruteForceProtection, + suspiciousIpThrottling: suspiciousIpThrottling, }; - if (botDetection?.data) { - attackProtection.botDetection = botDetection.data; + if (botDetection) { + attackProtection.botDetection = botDetection; } - if (captcha?.data) { - attackProtection.captcha = captcha.data; + if (captcha) { + attackProtection.captcha = captcha; } this.existing = attackProtection; @@ -290,14 +290,12 @@ export default class AttackProtectionHandler extends DefaultAPIHandler { const updates: Promise[] = []; if (attackProtection.botDetection && Object.keys(attackProtection.botDetection).length) { - updates.push( - this.client.attackProtection.updateBotDetectionConfig(attackProtection.botDetection) - ); + updates.push(this.client.attackProtection.botDetection.update(attackProtection.botDetection)); } if (attackProtection.breachedPasswordDetection) { updates.push( - this.client.attackProtection.updateBreachedPasswordDetectionConfig( + this.client.attackProtection.breachedPasswordDetection.update( attackProtection.breachedPasswordDetection ) ); @@ -323,18 +321,20 @@ export default class AttackProtectionHandler extends DefaultAPIHandler { attackProtection.captcha = captcha; - updates.push(this.client.attackProtection.updateCaptchaConfig(attackProtection.captcha)); + updates.push(this.client.attackProtection.captcha.update(attackProtection.captcha)); } if (attackProtection.bruteForceProtection) { updates.push( - this.client.attackProtection.updateBruteForceConfig(attackProtection.bruteForceProtection) + this.client.attackProtection.bruteForceProtection.update( + attackProtection.bruteForceProtection + ) ); } if (attackProtection.suspiciousIpThrottling) { updates.push( - this.client.attackProtection.updateSuspiciousIpThrottlingConfig( + this.client.attackProtection.suspiciousIpThrottling.update( attackProtection.suspiciousIpThrottling ) ); diff --git a/src/tools/auth0/handlers/branding.ts b/src/tools/auth0/handlers/branding.ts index 8f8471435..9faa649cd 100644 --- a/src/tools/auth0/handlers/branding.ts +++ b/src/tools/auth0/handlers/branding.ts @@ -1,4 +1,4 @@ -import { CustomDomain, GetBranding200Response, GetUniversalLogin200ResponseOneOf } from 'auth0'; +import { Management } from 'auth0'; import DefaultHandler, { order } from './default'; import constants from '../../constants'; import log from '../../../logger'; @@ -34,42 +34,34 @@ export default class BrandingHandler extends DefaultHandler { let branding = {}; try { - // in case client version does not support branding - if (this.client.branding && typeof this.client.branding.getSettings === 'function') { - const response = await this.client.branding.getSettings(); - branding = response.data as GetBranding200Response; - } - - // in case client version does not custom domains - if (this.client.customDomains && typeof this.client.customDomains.getAll === 'function') { - let { data: customDomains } = await this.client.customDomains.getAll(); - - customDomains = customDomains as CustomDomain[]; - - // templates are only supported if there's custom domains. - if (customDomains && customDomains.length) { - const { data: payload } = await this.client.branding.getUniversalLoginTemplate(); - - if (Object.keys(branding).length === 0) { - branding = { - templates: [ - { - template: constants.UNIVERSAL_LOGIN_TEMPLATE, - body: (payload as GetUniversalLogin200ResponseOneOf).body, - }, - ], - }; - } else { - branding = { - ...branding, - templates: [ - { - template: constants.UNIVERSAL_LOGIN_TEMPLATE, - body: (payload as GetUniversalLogin200ResponseOneOf).body, - }, - ], - }; - } + branding = await this.client.branding.get(); + + const customDomains = await this.client.customDomains.list(); + + // templates are only supported if there's custom domains. + if (customDomains && customDomains.length) { + let payload = await this.client.branding.templates.getUniversalLogin(); + payload = payload as Management.GetUniversalLoginTemplate; + + if (Object.keys(branding).length === 0) { + branding = { + templates: [ + { + template: constants.UNIVERSAL_LOGIN_TEMPLATE, + body: payload.body, + }, + ], + }; + } else { + branding = { + ...branding, + templates: [ + { + template: constants.UNIVERSAL_LOGIN_TEMPLATE, + body: payload.body, + }, + ], + }; } } @@ -97,12 +89,12 @@ export default class BrandingHandler extends DefaultHandler { const { templates, ...brandingSettings } = assets.branding; if (brandingSettings.logo_url === '') { - //Sometimes blank logo_url returned by API but is invalid on import. See: DXCDT-240 + // Sometimes blank logo_url returned by API but is invalid on import. See: DXCDT-240 delete brandingSettings.logo_url; } if (brandingSettings && Object.keys(brandingSettings).length) { - await this.client.branding.updateSettings(brandingSettings); + await this.client.branding.update(brandingSettings); this.updated += 1; this.didUpdate(brandingSettings); } @@ -125,7 +117,9 @@ export default class BrandingHandler extends DefaultHandler { (t) => t.template === constants.UNIVERSAL_LOGIN_TEMPLATE ); if (templateDefinition && templateDefinition.body) { - await this.client.branding.setUniversalLoginTemplate({ template: templateDefinition.body }); + await this.client.branding.templates.updateUniversalLogin({ + template: templateDefinition.body, + }); this.updated += 1; this.didUpdate(templates); } diff --git a/src/tools/auth0/handlers/clientGrants.ts b/src/tools/auth0/handlers/clientGrants.ts index 9dace8f49..9927ac781 100644 --- a/src/tools/auth0/handlers/clientGrants.ts +++ b/src/tools/auth0/handlers/clientGrants.ts @@ -1,9 +1,10 @@ -import { Client, ClientGrantSubjectTypeEnum } from 'auth0'; +import { Management } from 'auth0'; import DefaultHandler, { order } from './default'; import { convertClientNamesToIds } from '../../utils'; import { Assets, CalculatedChanges } from '../../../types'; import DefaultAPIHandler from './default'; import { paginate } from '../client'; +import { Client } from './clients'; export const schema = { type: 'array', @@ -19,7 +20,7 @@ export const schema = { }, subject_type: { type: 'string', - enum: Object.values(ClientGrantSubjectTypeEnum), + enum: Object.values(Management.ClientGrantSubjectTypeEnum), description: 'The subject type for this grant.', }, authorization_details_types: { @@ -31,18 +32,11 @@ export const schema = { uniqueItems: true, }, }, - required: ['client_id', 'scope', 'audience'], + required: ['client_id', 'audience'], }, }; -export type ClientGrant = { - client_id: string; - audience: string; - scope: string[]; - subject_type: ClientGrantSubjectTypeEnum; - authorization_details_types: string[]; - is_system?: boolean; -}; +export type ClientGrant = Management.ClientGrantResponseContent; export default class ClientGrantsHandler extends DefaultHandler { existing: ClientGrant[] | null; @@ -54,6 +48,12 @@ export default class ClientGrantsHandler extends DefaultHandler { id: 'id', // @ts-ignore because not sure why two-dimensional array passed in identifiers: ['id', ['client_id', 'audience']], + functions: { + update: async ( + { id }: { id: string }, + bodyParams: Management.UpdateClientGrantRequestContent + ) => this.client.clientGrants.update(id, bodyParams), + }, stripUpdateFields: ['audience', 'client_id', 'subject_type', 'is_system'], }); } @@ -67,9 +67,8 @@ export default class ClientGrantsHandler extends DefaultHandler { return this.existing; } - const clientGrants = await paginate(this.client.clientGrants.getAll, { + const clientGrants = await paginate(this.client.clientGrants.list, { paginate: true, - include_totals: true, }); this.existing = clientGrants; @@ -91,9 +90,8 @@ export default class ClientGrantsHandler extends DefaultHandler { // Do nothing if not set if (!clientGrants) return; - const clients = await paginate(this.client.clients.getAll, { + const clients = await paginate(this.client.clients.list, { paginate: true, - include_totals: true, }); const excludedClientsByNames = (assets.exclude && assets.exclude.clients) || []; const excludedClients = convertClientNamesToIds(excludedClientsByNames, clients); @@ -119,6 +117,7 @@ export default class ClientGrantsHandler extends DefaultHandler { return list.filter( (item) => item.client_id !== currentClient && + item.client_id && ![...excludedClientsByNames, ...excludedClients].includes(item.client_id) ); } diff --git a/src/tools/auth0/handlers/clients.ts b/src/tools/auth0/handlers/clients.ts index d1e6c9b8f..6ad393754 100644 --- a/src/tools/auth0/handlers/clients.ts +++ b/src/tools/auth0/handlers/clients.ts @@ -1,8 +1,4 @@ -import { - ClientClientAuthenticationMethods, - ClientExpressConfiguration, - ClientOrganizationRequireBehaviorEnum, -} from 'auth0'; +import { Management } from 'auth0'; import { has, omit } from 'lodash'; import { Assets, Auth0APIClient } from '../../../types'; import { paginate } from '../client'; @@ -267,25 +263,26 @@ export const schema = { 'admin_login_domain', ], }, + token_exchange: { + type: ['object', 'null'], + description: 'Token exchange configuration for the client', + properties: { + allow_any_profile_of_type: { + type: 'array', + description: 'List of enabled token exchange profile types for this client', + items: { + type: 'string', + enum: ['custom_authentication'], + }, + }, + }, + }, }, required: ['name'], }, }; -export type Client = { - client_id: string; - name: string; - app_type?: string; - is_first_party?: boolean; - resource_server_identifier?: string; - cross_origin_authentication?: boolean; - cross_origin_auth?: boolean; - custom_login_page?: string; - custom_login_page_on?: boolean; - express_configuration?: ClientExpressConfiguration; - client_authentication_methods?: ClientClientAuthenticationMethods | null; - organization_require_behavior?: ClientOrganizationRequireBehaviorEnum; -}; +export type Client = Management.Client; export default class ClientHandler extends DefaultAPIHandler { existing: Client[]; @@ -306,6 +303,13 @@ export default class ClientHandler extends DefaultAPIHandler { 'jwt_configuration.secret_encoded', 'resource_server_identifier', ], + functions: { + update: async ( + // eslint-disable-next-line camelcase + { client_id }: { client_id: string }, + bodyParams: Management.UpdateClientRequestContent + ) => this.client.clients.update(client_id, bodyParams), + }, }); } @@ -343,6 +347,7 @@ export default class ClientHandler extends DefaultAPIHandler { list.filter( (item) => item.client_id !== currentClient && + item.name && !excludedClients.includes(item.name) && (!excludeThirdPartyClients || item.is_first_party) ); @@ -393,7 +398,8 @@ export default class ClientHandler extends DefaultAPIHandler { let updated: Client = { ...client }; if (has(updated, 'cross_origin_auth')) { - deprecatedClients.push(client.name); + const clientName = client.name || client.client_id || 'unknown client'; + deprecatedClients.push(clientName); if (!has(updated, 'cross_origin_authentication')) { updated.cross_origin_authentication = updated.cross_origin_auth; @@ -424,9 +430,8 @@ export default class ClientHandler extends DefaultAPIHandler { this.config('AUTH0_EXCLUDE_THIRD_PARTY_CLIENTS') === 'true' || this.config('AUTH0_EXCLUDE_THIRD_PARTY_CLIENTS') === true; - const clients = await paginate(this.client.clients.getAll, { + const clients = await paginate(this.client.clients.list, { paginate: true, - include_totals: true, is_global: false, ...(excludeThirdPartyClients && { is_first_party: true }), }); @@ -477,7 +482,7 @@ export default class ClientHandler extends DefaultAPIHandler { const oktaOinClientName = client.express_configuration.okta_oin_client_id; if (oktaOinClientName) { const oktaOinClient = clientData?.find((c) => c.name === oktaOinClientName); - if (oktaOinClient) { + if (oktaOinClient?.client_id) { client.express_configuration.okta_oin_client_id = oktaOinClient.client_id; } } diff --git a/src/tools/auth0/handlers/connectionProfiles.ts b/src/tools/auth0/handlers/connectionProfiles.ts index 22e575a21..37ce45052 100644 --- a/src/tools/auth0/handlers/connectionProfiles.ts +++ b/src/tools/auth0/handlers/connectionProfiles.ts @@ -1,4 +1,4 @@ -import { ConnectionProfile } from 'auth0'; +import { Management } from 'auth0'; import { Assets, Auth0APIClient } from '../../../types'; import DefaultAPIHandler from './default'; import { paginate } from '../client'; @@ -177,12 +177,14 @@ export const schema = { }, }; +export type ConnectionProfile = Management.ConnectionProfile; + export const getConnectionProfile = async ( auth0Client: Auth0APIClient ): Promise => { try { const connectionProfiles = await paginate( - auth0Client.connectionProfiles?.getAll, + auth0Client.connectionProfiles?.list, { checkpoint: true, take: 10, @@ -213,7 +215,15 @@ export default class ConnectionProfilesHandler extends DefaultAPIHandler { type: 'connectionProfiles', id: 'id', identifiers: ['id', 'name'], - stripUpdateFields: ['id'], + functions: { + update: (args, data) => this.client.connectionProfiles.update(args?.id, data), + }, + }); + } + + objString(item): string { + return super.objString({ + name: item.name, }); } @@ -230,7 +240,18 @@ export default class ConnectionProfilesHandler extends DefaultAPIHandler { // Do nothing if not set if (!connectionProfiles) return; + const { del, update, create, conflicts } = await this.calcChanges(assets); + + const changes = { + del: del, + update: update, + create: create, + conflicts: conflicts, + }; + // Process using the default implementation - await super.processChanges(assets, await this.calcChanges(assets)); + await super.processChanges(assets, { + ...changes, + }); } } diff --git a/src/tools/auth0/handlers/connections.ts b/src/tools/auth0/handlers/connections.ts index ddf2d1620..5f9eca789 100644 --- a/src/tools/auth0/handlers/connections.ts +++ b/src/tools/auth0/handlers/connections.ts @@ -1,6 +1,6 @@ import dotProp from 'dot-prop'; -import _ from 'lodash'; -import { Client, Connection, GetConnectionsStrategyEnum, PatchClientsRequestInner } from 'auth0'; +import { chunk, keyBy } from 'lodash'; +import { Management } from 'auth0'; import DefaultAPIHandler, { order } from './default'; import { filterExcluded, convertClientNameToId, getEnabledClients, sleep } from '../../utils'; import { CalculatedChanges, Asset, Assets, Auth0APIClient } from '../../../types'; @@ -8,6 +8,7 @@ import { ConfigFunction } from '../../../configFactory'; import { paginate } from '../client'; import ScimHandler from './scimHandler'; import log from '../../../logger'; +import { Client } from './clients'; export const schema = { type: 'array', @@ -56,6 +57,8 @@ export const schema = { }, }; +export type Connection = Management.ConnectionForList; + // addExcludedConnectionPropertiesToChanges superimposes excluded properties on the `options` object. The Auth0 API // will overwrite the options property when updating connections, so it is necessary to add excluded properties back in to prevent those excluded properties from being deleted. // This use case is common because organizations may not want to expose sensitive connection details, but want to preserve them in the tenant. @@ -71,11 +74,11 @@ export const addExcludedConnectionPropertiesToChanges = ({ }) => { if (proposedChanges.update.length === 0) return proposedChanges; - //@ts-ignore because this expects a parameter to be passed + // @ts-ignore because this expects a parameter to be passed const excludedFields = config()?.EXCLUDED_PROPS?.connections || []; if (excludedFields.length === 0) return proposedChanges; - const existingConnectionsMap = _.keyBy(existingConnections, 'id'); + const existingConnectionsMap = keyBy(existingConnections, 'id'); const excludedOptions = excludedFields.filter( // Only include fields that pertain to options (excludedField) => excludedField.startsWith('options') @@ -126,29 +129,20 @@ export const getConnectionEnabledClients = async ( try { const enabledClientsFormatted: string[] = []; - let from: string | undefined; - let hasMore = true; - - while (hasMore) { - const response = await auth0Client.connections.getEnabledClients({ - id: connectionId, - take: 50, - ...(from && { from }), - }); - const { clients: enabledClients, next } = response?.data || {}; + let enabledClients = await auth0Client.connections.clients.get(connectionId); - if (enabledClients?.length) { - enabledClients.forEach((client) => { + do { + if (enabledClients && enabledClients.data?.length > 0) { + enabledClients.data.forEach((client) => { if (client?.client_id) { enabledClientsFormatted.push(client.client_id); } }); } - hasMore = !!next; - from = next; - } + enabledClients = await enabledClients.getNextPage(); + } while (enabledClients.hasNextPage()); return enabledClientsFormatted; } catch (error) { @@ -174,24 +168,17 @@ export const updateConnectionEnabledClients = async ( ): Promise => { if (!connectionId || !Array.isArray(enabledClientIds) || !enabledClientIds.length) return false; - const enabledClientUpdatePayloads: Array = enabledClientIds.map( - (clientId) => ({ + const enabledClientUpdatePayloads: Management.UpdateEnabledClientConnectionsRequestContentItem[] = + enabledClientIds.map((clientId) => ({ client_id: clientId, status: true, - }) - ); - const payloadChunks = _.chunk(enabledClientUpdatePayloads, 50); + })); + + const payloadChunks = chunk(enabledClientUpdatePayloads, 50); try { await Promise.all( - payloadChunks.map((payload) => - auth0Client.connections.updateEnabledClients( - { - id: connectionId, - }, - payload - ) - ) + payloadChunks.map((payload) => auth0Client.connections.clients.update(connectionId, payload)) ); log.debug(`Updated enabled clients for ${typeName}: ${connectionId}`); return true; @@ -229,22 +216,18 @@ export const processConnectionEnabledClients = async ( let newConnections; if (typeName === 'database') { - const { - data: { connections }, - } = await auth0Client.connections.getAll({ + const { data: connections } = await auth0Client.connections.list({ name: conn.name, take: 1, - strategy: [GetConnectionsStrategyEnum.auth0], - include_totals: true, + strategy: [Management.ConnectionStrategyEnum.Auth0], + include_fields: true, }); newConnections = connections; } else { - const { - data: { connections }, - } = await auth0Client.connections.getAll({ + const { data: connections } = await auth0Client.connections.list({ name: conn.name, take: 1, - include_totals: true, + include_fields: true, }); newConnections = connections; } @@ -277,7 +260,8 @@ export const processConnectionEnabledClients = async ( }; export default class ConnectionsHandler extends DefaultAPIHandler { - existing: Asset[] | null; + existing: Connection[] | null; + scimHandler: ScimHandler; constructor(config: DefaultAPIHandler) { @@ -289,11 +273,11 @@ export default class ConnectionsHandler extends DefaultAPIHandler { // When `connections` is updated, it can result in `update`,`create` or `delete` action on SCIM. // Because, `scim_configuration` is inside `connections`. update: async (requestParams, bodyParams) => - await this.scimHandler.updateOverride(requestParams, bodyParams), + this.scimHandler.updateOverride(requestParams, bodyParams), // When a new `connection` is created. We can perform only `create` option on SCIM. // When a connection is `deleted`. `scim_configuration` is also deleted along with it; no action on SCIM is required. - create: async (bodyParams) => await this.scimHandler.createOverride(bodyParams), + create: async (bodyParams) => this.scimHandler.createOverride(bodyParams), }, }); @@ -324,9 +308,8 @@ export default class ConnectionsHandler extends DefaultAPIHandler { async getType(): Promise { if (this.existing) return this.existing; - const connections = await paginate(this.client.connections.getAll, { + const connections = await paginate(this.client.connections.list, { checkpoint: true, - include_totals: true, }); // Filter out database connections as we have separate handler for it @@ -347,6 +330,7 @@ export default class ConnectionsHandler extends DefaultAPIHandler { const connectionsWithEnabledClients = await Promise.all( filteredConnections.map(async (con) => { + if (!con?.id) return con; const enabledClients = await getConnectionEnabledClients(this.client, con.id); if (enabledClients && enabledClients?.length) { return { ...con, enabled_clients: enabledClients }; @@ -376,12 +360,12 @@ export default class ConnectionsHandler extends DefaultAPIHandler { }; // Convert enabled_clients by name to the id - const clients = await paginate(this.client.clients.getAll, { + const clients = await paginate(this.client.clients.list, { paginate: true, include_totals: true, }); - const existingConnections = await paginate(this.client.connections.getAll, { + const existingConnections = await paginate(this.client.connections.list, { checkpoint: true, include_totals: true, }); diff --git a/src/tools/auth0/handlers/customDomains.ts b/src/tools/auth0/handlers/customDomains.ts index fab581db2..6deb181f3 100644 --- a/src/tools/auth0/handlers/customDomains.ts +++ b/src/tools/auth0/handlers/customDomains.ts @@ -1,4 +1,4 @@ -import { CustomDomain } from 'auth0'; +import { Management } from 'auth0'; import DefaultAPIHandler, { order } from './default'; import { Asset, Assets } from '../../../types'; import log from '../../../logger'; @@ -41,8 +41,10 @@ export const schema = { }, }; +type CustomDomain = Management.CustomDomain; + export default class CustomDomainsHadnler extends DefaultAPIHandler { - existing: Asset[] | null; + existing: CustomDomain[] | null; constructor(config: DefaultAPIHandler) { super({ @@ -70,9 +72,7 @@ export default class CustomDomainsHadnler extends DefaultAPIHandler { 'updated_at', ], functions: { - delete: (args) => this.client.customDomains.delete({ id: args.custom_domain_id }), - update: (args, data) => - this.client.customDomains.update({ id: args.custom_domain_id }, data), + update: (args, data) => this.client.customDomains.update(args.custom_domain_id, data), }, }); } @@ -87,7 +87,7 @@ export default class CustomDomainsHadnler extends DefaultAPIHandler { return this.existing; } - const customDomains = await paginate(this.client.customDomains.getAll, { + const customDomains = await paginate(this.client.customDomains.list, { checkpoint: true, }); diff --git a/src/tools/auth0/handlers/databases.ts b/src/tools/auth0/handlers/databases.ts index c4d232482..947d98008 100644 --- a/src/tools/auth0/handlers/databases.ts +++ b/src/tools/auth0/handlers/databases.ts @@ -1,11 +1,16 @@ -import { Client, Connection, GetConnectionsStrategyEnum } from 'auth0'; +import { Management } from 'auth0'; import DefaultAPIHandler, { order } from './default'; import constants from '../../constants'; import { filterExcluded, getEnabledClients } from '../../utils'; import { CalculatedChanges, Assets, Asset } from '../../../types'; import { paginate } from '../client'; import log from '../../../logger'; -import { getConnectionEnabledClients, processConnectionEnabledClients } from './connections'; +import { + Connection, + getConnectionEnabledClients, + processConnectionEnabledClients, +} from './connections'; +import { Client } from './clients'; export const schema = { type: 'array', @@ -175,8 +180,8 @@ export default class DatabaseHandler extends DefaultAPIHandler { // If we going to update database, we need to get current options first if (fn === 'update') { return (params, payload) => - this.client.connections.get(params).then((response) => { - const connection = response.data; + this.client.connections.get(params?.id).then((response) => { + const connection = response; const attributes = payload?.options?.attributes; const requiresUsername = payload?.options?.requires_username; const validation = payload?.options?.validation; @@ -186,10 +191,10 @@ export default class DatabaseHandler extends DefaultAPIHandler { 'Warning: "attributes" cannot be used with "requires_username" or "validation". Please remove one of the conflicting options.' ); } else if (attributes) { - delete connection.options.validation; - delete connection.options.requires_username; + delete connection.options?.validation; + delete connection.options?.requires_username; } else if (requiresUsername || validation) { - delete connection.options.attributes; + delete connection.options?.attributes; } payload.options = { ...connection.options, ...payload.options }; @@ -197,7 +202,7 @@ export default class DatabaseHandler extends DefaultAPIHandler { if (payload.options && Object.keys(payload.options).length === 0) { delete payload.options; } - return this.client.connections.update(params, payload); + return this.client.connections.update(params.id, payload); }); } @@ -207,14 +212,14 @@ export default class DatabaseHandler extends DefaultAPIHandler { async getType() { if (this.existing) return this.existing; - const connections = await paginate(this.client.connections.getAll, { - strategy: [GetConnectionsStrategyEnum.auth0], + const connections = await paginate(this.client.connections.list, { + strategy: [Management.ConnectionStrategyEnum.Auth0], checkpoint: true, - include_totals: true, }); const dbConnectionsWithEnabledClients = await Promise.all( connections.map(async (con) => { + if (!con?.id) return con; const enabledClients = await getConnectionEnabledClients(this.client, con.id); if (enabledClients && enabledClients?.length) { return { ...con, enabled_clients: enabledClients }; @@ -252,19 +257,15 @@ export default class DatabaseHandler extends DefaultAPIHandler { // Convert enabled_clients by name to the id - const clients = await paginate(this.client.clients.getAll, { + const clients = await paginate(this.client.clients.list, { paginate: true, - include_totals: true, }); - const existingDatabasesConnections = await paginate( - this.client.connections.getAll, - { - strategy: [GetConnectionsStrategyEnum.auth0], - checkpoint: true, - include_totals: true, - } - ); + const existingDatabasesConnections = await paginate(this.client.connections.list, { + strategy: [Management.ConnectionStrategyEnum.Auth0], + checkpoint: true, + include_totals: true, + }); const formatted = databases.map((db) => { if (db.enabled_clients) { return { diff --git a/src/tools/auth0/handlers/default.ts b/src/tools/auth0/handlers/default.ts index 8c13ab676..b76d6651e 100644 --- a/src/tools/auth0/handlers/default.ts +++ b/src/tools/auth0/handlers/default.ts @@ -28,6 +28,77 @@ export function order(value) { }; } +// Retry configuration constants +const DEFAULT_MAX_RETRIES = 3; +const DEFAULT_INITIAL_DELAY_MS = 1000; // 1 second +const DEFAULT_MAX_DELAY_MS = 30000; // 30 seconds + +interface RetryOptions { + maxRetries?: number; + initialDelay?: number; + maxDelay?: number; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + onRetry?: (error: any, attempt: number, delay: number) => void; +} + +/** + * Executes a function with exponential backoff retry logic for rate limit errors (429). + * + * @param fn - The function to execute with retry logic + * @param options - Configuration options for retry behavior + * @returns Promise that resolves with the function result or rejects after max retries + */ +async function retryWithExponentialBackoff( + fn: () => Promise, + options: RetryOptions = {} +): Promise { + const { + maxRetries = DEFAULT_MAX_RETRIES, + initialDelay = DEFAULT_INITIAL_DELAY_MS, + maxDelay = DEFAULT_MAX_DELAY_MS, + onRetry = () => {}, + } = options; + + let lastError: any; + + for (let attempt = 0; attempt <= maxRetries; attempt++) { + try { + return await fn(); + } catch (error) { + lastError = error; + + // Only retry on rate limit errors (429) + const isRateLimitError = + error?.statusCode === 429 || + error?.message?.includes('429') || + error?.message?.includes('Too Many Requests') || + error?.message?.includes('TooManyRequestsError') || + error?.message?.includes('Global limit has been reached'); + + if (!isRateLimitError || attempt === maxRetries) { + throw error; + } + + // Calculate delay with exponential backoff and jitter + const exponentialDelay = initialDelay * 2 ** attempt; + const jitter = Math.random() * 1000; // 0-1s randomization to prevent thundering herd + const delay = Math.min(exponentialDelay + jitter, maxDelay); + + // Check for Retry-After header (if available in error response) + const retryAfter = error?.rawResponse?.headers?.get('retry-after'); + const finalDelay = retryAfter ? parseInt(retryAfter, 10) * 1000 : delay; + + onRetry(error, attempt + 1, finalDelay); + + await new Promise((resolve) => { + setTimeout(resolve, finalDelay); + }); + } + } + + throw lastError; +} + type ApiMethodOverride = string | Function; export default class APIHandler { @@ -46,7 +117,7 @@ export default class APIHandler { stripCreateFields: string[]; //Fields to strip from payload when creating name?: string; // TODO: understand if any handlers actually leverage `name` property functions: { - getAll: ApiMethodOverride; + list: ApiMethodOverride; update: ApiMethodOverride; create: ApiMethodOverride; delete: ApiMethodOverride; @@ -63,7 +134,7 @@ export default class APIHandler { sensitiveFieldsToObfuscate?: APIHandler['sensitiveFieldsToObfuscate']; stripCreateFields?: APIHandler['stripCreateFields']; functions: { - getAll?: ApiMethodOverride; + list?: ApiMethodOverride; update?: ApiMethodOverride; create?: ApiMethodOverride; delete?: ApiMethodOverride; @@ -81,7 +152,7 @@ export default class APIHandler { this.stripCreateFields = options.stripCreateFields || []; this.functions = { - getAll: 'getAll', + list: 'list', create: 'create', delete: 'delete', update: 'update', @@ -217,6 +288,20 @@ export default class APIHandler { `Start processChanges for ${this.type} [delete:${del.length}] [update:${update.length}], [create:${create.length}], [conflicts:${conflicts.length}]` ); + // Set retry configuration from config + const retryConfig: RetryOptions = { + maxRetries: this.config('AUTH0_MAX_RETRIES') || DEFAULT_MAX_RETRIES, + initialDelay: this.config('AUTH0_RETRY_INITIAL_DELAY_MS') || DEFAULT_INITIAL_DELAY_MS, + maxDelay: this.config('AUTH0_RETRY_MAX_DELAY_MS') || DEFAULT_MAX_DELAY_MS, + onRetry: (error: any, attempt: number, delay: number) => { + log.warn( + `Rate limit hit for [${this.type}]. Retrying attempt ${attempt}/${ + retryConfig.maxRetries + } after ${Math.round(delay / 1000)}s...` + ); + }, + }; + // Process Deleted if (del.length > 0) { const allowDelete = @@ -235,9 +320,11 @@ export default class APIHandler { await this.client.pool .addEachTask({ data: del || [], - generator: (delItem) => { - const delFunction = this.getClientFN(this.functions.delete); - return delFunction({ [this.id]: delItem[this.id] }) + generator: (delItem) => + retryWithExponentialBackoff(() => { + const delFunction = this.getClientFN(this.functions.delete); + return delFunction(delItem[this.id]); + }, retryConfig) .then(() => { this.didDelete(delItem); this.deleted += 1; @@ -246,8 +333,7 @@ export default class APIHandler { throw new Error( `Problem deleting ${this.type} ${this.objString(delItem)}\n${err}` ); - }); - }, + }), }) .promise(); } @@ -257,21 +343,22 @@ export default class APIHandler { await this.client.pool .addEachTask({ data: conflicts || [], - generator: (updateItem) => { - const updateFN = this.getClientFN(this.functions.update); - const params = { [this.id]: updateItem[this.id] }; - const updatePayload = (() => { - let data = stripFields({ ...updateItem }, this.stripUpdateFields); - return stripObfuscatedFieldsFromPayload(data, this.sensitiveFieldsToObfuscate); - })(); - return updateFN(params, updatePayload) - .then((data) => this.didUpdate(data)) + generator: (updateItem) => + retryWithExponentialBackoff(() => { + const updateFN = this.getClientFN(this.functions.update); + const params = { [this.id]: updateItem[this.id] }; + const updatePayload = (() => { + const data = stripFields({ ...updateItem }, this.stripUpdateFields); + return stripObfuscatedFieldsFromPayload(data, this.sensitiveFieldsToObfuscate); + })(); + return updateFN(params, updatePayload); + }, retryConfig) + .then((data) => this.didUpdate(data as Asset)) .catch((err) => { throw new Error( `Problem updating ${this.type} ${this.objString(updateItem)}\n${err}` ); - }); - }, + }), }) .promise(); @@ -279,26 +366,27 @@ export default class APIHandler { await this.client.pool .addEachTask({ data: create || [], - generator: (createItem) => { - const createFunction = this.getClientFN(this.functions.create); - const createPayload = (() => { - const strippedPayload = stripFields(createItem, this.stripCreateFields); - return stripObfuscatedFieldsFromPayload( - strippedPayload, - this.sensitiveFieldsToObfuscate - ); - })(); - return createFunction(createPayload) + generator: (createItem) => + retryWithExponentialBackoff(() => { + const createFunction = this.getClientFN(this.functions.create); + const createPayload = (() => { + const strippedPayload = stripFields(createItem, this.stripCreateFields); + return stripObfuscatedFieldsFromPayload( + strippedPayload, + this.sensitiveFieldsToObfuscate + ); + })(); + return createFunction(createPayload); + }, retryConfig) .then((data) => { - this.didCreate(data); + this.didCreate(data as Asset); this.created += 1; }) .catch((err) => { throw new Error( `Problem creating ${this.type} ${this.objString(createItem)}\n${err}` ); - }); - }, + }), }) .promise(); @@ -306,24 +394,25 @@ export default class APIHandler { await this.client.pool .addEachTask({ data: update || [], - generator: (updateItem) => { - const updateFN = this.getClientFN(this.functions.update); - const params = { [this.id]: updateItem[this.id] }; - const updatePayload = (() => { - let data = stripFields({ ...updateItem }, this.stripUpdateFields); - return stripObfuscatedFieldsFromPayload(data, this.sensitiveFieldsToObfuscate); - })(); - return updateFN(params, updatePayload) + generator: (updateItem) => + retryWithExponentialBackoff(() => { + const updateFN = this.getClientFN(this.functions.update); + const params = { [this.id]: updateItem[this.id] }; + const updatePayload = (() => { + const data = stripFields({ ...updateItem }, this.stripUpdateFields); + return stripObfuscatedFieldsFromPayload(data, this.sensitiveFieldsToObfuscate); + })(); + return updateFN(params, updatePayload); + }, retryConfig) .then((data) => { - this.didUpdate(data); + this.didUpdate(data as Asset); this.updated += 1; }) .catch((err) => { throw new Error( `Problem updating ${this.type} ${this.objString(updateItem)}\n${err}` ); - }); - }, + }), }) .promise(); } diff --git a/src/tools/auth0/handlers/emailProvider.ts b/src/tools/auth0/handlers/emailProvider.ts index ac8387359..08442cc7e 100644 --- a/src/tools/auth0/handlers/emailProvider.ts +++ b/src/tools/auth0/handlers/emailProvider.ts @@ -1,5 +1,5 @@ -import { EmailProviderCreate } from 'auth0'; import { isEmpty } from 'lodash'; +import { Management } from 'auth0'; import DefaultHandler, { order } from './default'; import { Asset, Assets } from '../../../types'; @@ -18,11 +18,11 @@ export default class EmailProviderHandler extends DefaultHandler { async getType(): Promise { try { - const { data } = await this.client.emails.get({ + const emailProvider = await this.client.emails.provider.get({ include_fields: true, fields: defaultFields.join(','), }); - return data; + return emailProvider; } catch (err) { if (err.statusCode === 404) return {}; throw err; @@ -48,7 +48,7 @@ export default class EmailProviderHandler extends DefaultHandler { if (isEmpty(existing.credentials)) { delete existing.credentials; } - const updated = await this.client.emails.update(existing); + const updated = await this.client.emails.provider.update(existing); this.updated += 1; this.didUpdate(updated); } @@ -56,11 +56,13 @@ export default class EmailProviderHandler extends DefaultHandler { } if (existing.name) { - const updated = await this.client.emails.update(emailProvider); + const updated = await this.client.emails.provider.update(emailProvider); this.updated += 1; this.didUpdate(updated); } else { - const created = await this.client.emails.configure(emailProvider as EmailProviderCreate); + const created = await this.client.emails.provider.create( + emailProvider as Management.CreateEmailProviderRequestContent + ); this.created += 1; this.didCreate(created); } diff --git a/src/tools/auth0/handlers/emailTemplates.ts b/src/tools/auth0/handlers/emailTemplates.ts index 0a784de36..b0e6a7d0e 100644 --- a/src/tools/auth0/handlers/emailTemplates.ts +++ b/src/tools/auth0/handlers/emailTemplates.ts @@ -27,11 +27,18 @@ export default class EmailTemplateHandler extends DefaultHandler { }); } + objString(item): string { + return super.objString({ + template: item.template, + enabled: item.enabled, + }); + } + async getType(): Promise { const emailTemplates = await Promise.all( constants.EMAIL_TEMPLATES_TYPES.map(async (templateName) => { try { - const { data: template } = await this.client.emailTemplates.get({ templateName }); + const template = await this.client.emailTemplates.get(templateName); return template; } catch (err) { if (err.statusCode === 403 && templateName === constants.EMAIL_ASYNC_APPROVAL) { @@ -44,6 +51,7 @@ export default class EmailTemplateHandler extends DefaultHandler { throw err; } } + return null; }) ); @@ -57,7 +65,7 @@ export default class EmailTemplateHandler extends DefaultHandler { const identifierField = this.identifiers[0]; const params = { templateName: emailTemplate[identifierField] }; - const { data: updated } = await this.client.emailTemplates.update(params, emailTemplate); + const updated = await this.client.emailTemplates.update(params.templateName, emailTemplate); // Remove body from the response const { body, ...excludedBody } = updated; this.didUpdate(excludedBody); @@ -65,7 +73,7 @@ export default class EmailTemplateHandler extends DefaultHandler { } catch (err) { if (err.statusCode === 404) { // Create if it does not exist - const { data: created } = await this.client.emailTemplates.create(emailTemplate); + const created = await this.client.emailTemplates.create(emailTemplate); // Remove body from the response const { body, ...excludedBody } = created; this.didCreate(excludedBody); diff --git a/src/tools/auth0/handlers/flowVaultConnections.ts b/src/tools/auth0/handlers/flowVaultConnections.ts index 6502405cb..abe1ddb93 100644 --- a/src/tools/auth0/handlers/flowVaultConnections.ts +++ b/src/tools/auth0/handlers/flowVaultConnections.ts @@ -1,21 +1,11 @@ -import { - GetFlowsVaultConnections200ResponseOneOfInner, - PatchFlowsVaultConnectionsByIdRequest, -} from 'auth0'; -import { isArray, isEmpty } from 'lodash'; +import { Management } from 'auth0'; +import { isEmpty } from 'lodash'; import DefaultHandler, { order } from './default'; -import { Asset, Assets, CalculatedChanges } from '../../../types'; +import { Asset, Assets, Auth0APIClient, CalculatedChanges } from '../../../types'; import constants from '../../constants'; import log from '../../../logger'; -export type FlowVaultConnection = { - name: string; - app_id: string; - environment: string; - setup: object; - account_name: string; - ready: string; -}; +export type FlowVaultConnection = Management.GetFlowsVaultConnectionResponseContent; export const schema = { type: 'array', @@ -34,6 +24,20 @@ export const schema = { additionalProperties: false, }; +export const getAllFlowConnections = async ( + auth0Client: Auth0APIClient +): Promise => { + const allFlowConnections: Management.FlowsVaultConnectionSummary[] = []; + + let vaultConnections = await auth0Client.flows.vault.connections.list(); + do { + allFlowConnections.push(...vaultConnections.data); + vaultConnections = await vaultConnections.getNextPage(); + } while (vaultConnections.hasNextPage()); + + return allFlowConnections; +}; + export default class FlowVaultHandler extends DefaultHandler { existing: Asset; @@ -56,7 +60,7 @@ export default class FlowVaultHandler extends DefaultHandler { return this.existing; } - this.existing = await this.getAllFlowConnections(); + this.existing = await getAllFlowConnections(this.client); return this.existing; } @@ -95,36 +99,6 @@ export default class FlowVaultHandler extends DefaultHandler { ); } - async getAllFlowConnections(): Promise { - const allFlowConnections: GetFlowsVaultConnections200ResponseOneOfInner[] = []; - // paginate without paginate helper as this is not getAll but getAllConnections - // paginate through all flow connections - let page = 0; - while (true) { - const { - data: { connections, total }, - } = await this.client.flows.getAllConnections({ - page: page, - per_page: 100, - include_totals: true, - }); - - // if we get an unexpected response, break the loop to avoid infinite loop - if (!isArray(allFlowConnections) || typeof total !== 'number') { - break; - } - - allFlowConnections.push(...connections); - page += 1; - - if (allFlowConnections.length === total) { - break; - } - } - - return allFlowConnections; - } - async createVaultConnection(conn): Promise { if ('ready' in conn) { delete conn.ready; @@ -132,7 +106,7 @@ export default class FlowVaultHandler extends DefaultHandler { if ('account_name' in conn) { delete conn.account_name; } - const { data: created } = await this.client.flows.createConnection(conn); + const created = await this.client.flows.vault.connections.create(conn); return created; } @@ -155,13 +129,13 @@ export default class FlowVaultHandler extends DefaultHandler { async updateVaultConnection(conn) { const { id, name, setup } = conn; - const params: PatchFlowsVaultConnectionsByIdRequest = { + const params: Management.UpdateFlowsVaultConnectionRequestContent = { name, }; if (!isEmpty(setup)) { params.setup = setup; } - const updated = await this.client.flows.updateConnection({ id: id }, params); + const updated = await this.client.flows.vault.connections.update(id, params); return updated; } @@ -183,7 +157,7 @@ export default class FlowVaultHandler extends DefaultHandler { } async deleteVaultConnection(conn): Promise { - await this.client.flows.deleteConnection({ id: conn.id }); + await this.client.flows.vault.connections.delete(conn.id); } async deleteVaultConnections(data: Asset[]): Promise { diff --git a/src/tools/auth0/handlers/flows.ts b/src/tools/auth0/handlers/flows.ts index 2ca1609a9..0a204a6e7 100644 --- a/src/tools/auth0/handlers/flows.ts +++ b/src/tools/auth0/handlers/flows.ts @@ -1,15 +1,12 @@ -import { isArray, isEmpty } from 'lodash'; -import { - GetFlows200ResponseOneOfInner, - GetFlowsVaultConnections200ResponseOneOfInner, - PostFlows201Response, -} from 'auth0'; +import { isEmpty } from 'lodash'; +import { Management } from 'auth0'; import dotProp from 'dot-prop'; import DefaultHandler, { order } from './default'; import { Asset, Assets, CalculatedChanges } from '../../../types'; import { paginate } from '../client'; import log from '../../../logger'; import { findKeyPathWithValue } from '../../../utils'; +import { getAllFlowConnections } from './flowVaultConnections'; export type Flow = { name: string; @@ -39,6 +36,10 @@ export default class FlowHandler extends DefaultHandler { id: 'id', stripCreateFields: ['created_at', 'updated_at', 'executed_at'], stripUpdateFields: ['created_at', 'updated_at', 'executed_at'], + functions: { + update: async ({ id }: { id: string }, bodyParams: Management.UpdateFlowRequestContent) => + this.client.flows.update(id, bodyParams), + }, }); } @@ -46,19 +47,21 @@ export default class FlowHandler extends DefaultHandler { return super.objString({ id: item.id, name: item.name }); } - async getFlows(flows: Array): Promise { + async getFlows( + flows: Array + ): Promise { const allFlows = await this.client.pool .addEachTask({ data: flows, generator: ({ id }) => - this.client.flows.get({ id: id }).then((response) => { - if (isEmpty(response?.data)) return null; - return response.data; + this.client.flows.get(id).then((response) => { + if (isEmpty(response)) return null; + return response; }), }) .promise(); - return allFlows.filter((flow): flow is PostFlows201Response => flow !== null); + return allFlows.filter((flow): flow is Management.GetFlowResponseContent => flow !== null); } async getType(): Promise { @@ -67,15 +70,14 @@ export default class FlowHandler extends DefaultHandler { } const [flows, allFlowConnections] = await Promise.all([ - paginate(this.client.flows.getAll, { + paginate(this.client.flows.list, { paginate: true, - include_totals: true, }), - this.getAllFlowConnections(), + getAllFlowConnections(this.client), ]); // get more details for each flows - const allFlows: Array = await this.getFlows(flows); + const allFlows = await this.getFlows(flows); // create a map for id to name from allFlowConnections const connectionIdMap = {}; @@ -94,7 +96,7 @@ export default class FlowHandler extends DefaultHandler { // Do nothing if not set if (!flows) return; - const allFlowConnections = await this.getAllFlowConnections(); + const allFlowConnections = await getAllFlowConnections(this.client); // create a map for name to id from allFlowConnections const connectionNameMap = {}; @@ -118,36 +120,6 @@ export default class FlowHandler extends DefaultHandler { }); } - async getAllFlowConnections(): Promise { - const allFlowConnections: GetFlowsVaultConnections200ResponseOneOfInner[] = []; - // paginate without paginate helper as this is not getAll but getAllConnections - // paginate through all flow connections - let page = 0; - while (true) { - const { - data: { connections, total }, - } = await this.client.flows.getAllConnections({ - page: page, - per_page: 100, - include_totals: true, - }); - - // if we get an unexpected response, break the loop to avoid infinite loop - if (!isArray(allFlowConnections) || typeof total !== 'number') { - break; - } - - allFlowConnections.push(...connections); - page += 1; - - if (allFlowConnections.length === total) { - break; - } - } - - return allFlowConnections; - } - async formateFlowConnectionId(flows, connectionIdMap): Promise { // replace connection_id with flow connection names await Promise.all( diff --git a/src/tools/auth0/handlers/forms.ts b/src/tools/auth0/handlers/forms.ts index 5b8425bde..b8b438003 100644 --- a/src/tools/auth0/handlers/forms.ts +++ b/src/tools/auth0/handlers/forms.ts @@ -1,8 +1,4 @@ -import { - GetFlows200ResponseOneOfInner, - GetForms200ResponseOneOfInner, - PostForms201Response, -} from 'auth0'; +import { Management } from 'auth0'; import dotProp from 'dot-prop'; import { isEmpty } from 'lodash'; import DefaultHandler, { order } from './default'; @@ -16,7 +12,7 @@ export type Form = { body: string; }; -export type FormResponse = PostForms201Response; +export type FormResponse = Management.GetFormResponseContent; export const schema = { type: 'array', @@ -41,6 +37,10 @@ export default class FormsHandler extends DefaultHandler { id: 'id', stripCreateFields: ['created_at', 'updated_at', 'submitted_at', 'embedded_at'], stripUpdateFields: ['created_at', 'updated_at', 'submitted_at', 'embedded_at'], + functions: { + update: async ({ id }: { id: string }, bodyParams: Management.UpdateFormRequestContent) => + this.client.forms.update(id, bodyParams), + }, }); } @@ -48,18 +48,20 @@ export default class FormsHandler extends DefaultHandler { return super.objString({ id: item.id, name: item.name }); } - async getForms(forms: Array): Promise { + async getForms( + forms: Array + ): Promise { const allForms = await this.client.pool .addEachTask({ data: forms, generator: ({ id }) => - this.client.forms.get({ id: id }).then((response) => { - if (isEmpty(response?.data)) return null; - return response.data; + this.client.forms.get(id).then((response) => { + if (isEmpty(response)) return null; + return response; }), }) .promise(); - return allForms.filter((form): form is PostForms201Response => form !== null); + return allForms.filter((form): form is Management.GetFormResponseContent => form !== null); } async getType(): Promise { @@ -68,13 +70,11 @@ export default class FormsHandler extends DefaultHandler { } const [forms, flows] = await Promise.all([ - paginate(this.client.forms.getAll, { + paginate(this.client.forms.list, { paginate: true, - include_totals: true, }), - paginate(this.client.flows.getAll, { + paginate(this.client.flows.list, { paginate: true, - include_totals: true, }), ]); @@ -149,7 +149,7 @@ export default class FormsHandler extends DefaultHandler { // Do nothing if not set if (!forms) return; - const flows = await paginate(this.client.flows.getAll, { + const flows = await paginate(this.client.flows.list, { paginate: true, include_totals: true, }); diff --git a/src/tools/auth0/handlers/guardianFactorProviders.ts b/src/tools/auth0/handlers/guardianFactorProviders.ts index d2e5a9d60..eaea23e78 100644 --- a/src/tools/auth0/handlers/guardianFactorProviders.ts +++ b/src/tools/auth0/handlers/guardianFactorProviders.ts @@ -43,15 +43,14 @@ export default class GuardianFactorProvidersHandler extends DefaultHandler { const data = await Promise.all( mappings.map(async (m) => { let provider; - // TODO: This is quite a change, needs to be validated for sure. if (m.name === 'phone' && m.provider === 'twilio') { - provider = await this.client.guardian.getPhoneFactorProviderTwilio(); + provider = await this.client.guardian.factors.phone.getTwilioProvider(); } else if (m.name === 'sms' && m.provider === 'twilio') { - provider = await this.client.guardian.getSmsFactorProviderTwilio(); + provider = await this.client.guardian.factors.sms.getTwilioProvider(); } else if (m.name === 'push-notification' && m.provider === 'apns') { - provider = await this.client.guardian.getPushNotificationProviderAPNS(); + provider = await this.client.guardian.factors.pushNotification.getApnsProvider(); } else if (m.name === 'push-notification' && m.provider === 'sns') { - provider = await this.client.guardian.getPushNotificationProviderSNS(); + provider = await this.client.guardian.factors.pushNotification.getSnsProvider(); } return { ...m, ...provider.data }; @@ -84,17 +83,16 @@ export default class GuardianFactorProvidersHandler extends DefaultHandler { guardianFactorProviders.map(async (factorProvider) => { const { name, provider, ...data } = factorProvider; const params = { name: factorProvider.name, provider: factorProvider.provider }; - // TODO: This is quite a change, needs to be validated for sure. if (name === 'phone' && provider === 'twilio') { - await this.client.guardian.updatePhoneFactorProviderTwilio(data); + await this.client.guardian.factors.phone.setTwilioProvider(data); } else if (name === 'sms' && provider === 'twilio') { - await this.client.guardian.setSmsFactorProviderTwilio(data); + await this.client.guardian.factors.sms.setTwilioProvider(data); } else if (name === 'push-notification' && provider === 'apns') { - await this.client.guardian.updatePushNotificationProviderAPNS(data); + await this.client.guardian.factors.pushNotification.setApnsProvider(data); } else if (name === 'push-notification' && provider === 'fcm') { - await this.client.guardian.updatePushNotificationProviderFCM(data); + await this.client.guardian.factors.pushNotification.setFcmProvider(data); } else if (name === 'push-notification' && provider === 'sns') { - await this.client.guardian.updatePushNotificationProviderSNS(data); + await this.client.guardian.factors.pushNotification.setSnsProvider(data); } this.didUpdate(params); this.updated += 1; diff --git a/src/tools/auth0/handlers/guardianFactorTemplates.ts b/src/tools/auth0/handlers/guardianFactorTemplates.ts index ffef826b5..aed973a10 100644 --- a/src/tools/auth0/handlers/guardianFactorTemplates.ts +++ b/src/tools/auth0/handlers/guardianFactorTemplates.ts @@ -1,4 +1,4 @@ -import { TemplateMessages } from 'auth0'; +import { Management } from 'auth0'; import DefaultHandler from './default'; import constants from '../../constants'; import { Assets, Asset } from '../../../types'; @@ -32,11 +32,11 @@ export default class GuardianFactorTemplatesHandler extends DefaultHandler { const data = await Promise.all( constants.GUARDIAN_FACTOR_TEMPLATES.map(async (name) => { if (name === 'sms') { - const { data: templates } = await this.client.guardian.getSmsFactorTemplates(); + const templates = await this.client.guardian.factors.sms.getTemplates(); return { name, ...templates }; } - const { data: templates } = await this.client.guardian.getPhoneFactorTemplates(); + const templates = await this.client.guardian.factors.phone.getTemplates(); return { name, ...templates }; }) ); @@ -67,11 +67,14 @@ export default class GuardianFactorTemplatesHandler extends DefaultHandler { guardianFactorTemplates.map(async (fatorTemplates) => { const { name, ...data } = fatorTemplates; const params = { name: fatorTemplates.name }; - // TODO: This is quite a change, needs to be validated for sure. if (name === 'sms') { - await this.client.guardian.setSmsFactorTemplates(data as TemplateMessages); + await this.client.guardian.factors.sms.setTemplates( + data as Management.SetGuardianFactorSmsTemplatesRequestContent + ); } else if (name === 'phone') { - await this.client.guardian.setPhoneFactorTemplates(data as TemplateMessages); + await this.client.guardian.factors.phone.setTemplates( + data as Management.SetGuardianFactorPhoneTemplatesRequestContent + ); } this.didUpdate(params); this.updated += 1; diff --git a/src/tools/auth0/handlers/guardianFactors.ts b/src/tools/auth0/handlers/guardianFactors.ts index aa2b9a153..a58e3c550 100644 --- a/src/tools/auth0/handlers/guardianFactors.ts +++ b/src/tools/auth0/handlers/guardianFactors.ts @@ -1,4 +1,4 @@ -import { Factor, FactorNameEnum } from 'auth0'; +import { Management } from 'auth0'; import DefaultHandler from './default'; import constants from '../../constants'; import { Asset, Assets } from '../../../types'; @@ -29,8 +29,8 @@ export default class GuardianFactorsHandler extends DefaultHandler { async getType(): Promise { if (this.existing) return this.existing; try { - const { data } = await this.client.guardian.getFactors(); - this.existing = data; + const factors = await this.client.guardian.factors.list(); + this.existing = factors; return this.existing; } catch (err) { if (err.statusCode === 404 || err.statusCode === 501) { @@ -53,11 +53,11 @@ export default class GuardianFactorsHandler extends DefaultHandler { // Process each factor await Promise.all( - guardianFactors.map(async (factor: Factor) => { + guardianFactors.map(async (factor: Management.GuardianFactor) => { const data = { ...factor }; - const params = { name: factor.name as FactorNameEnum }; + const params = { name: factor.name as Management.GuardianFactorNameEnum }; delete data.name; - await this.client.guardian.updateFactor(params, data); + await this.client.guardian.factors.set(params.name, data); this.didUpdate(params); this.updated += 1; }) diff --git a/src/tools/auth0/handlers/guardianPhoneFactorMessageTypes.ts b/src/tools/auth0/handlers/guardianPhoneFactorMessageTypes.ts index 639e2ec6c..80815946b 100644 --- a/src/tools/auth0/handlers/guardianPhoneFactorMessageTypes.ts +++ b/src/tools/auth0/handlers/guardianPhoneFactorMessageTypes.ts @@ -1,4 +1,4 @@ -import { GetMessageTypes200Response } from 'auth0'; +import { Management } from 'auth0'; import DefaultHandler from './default'; import constants from '../../constants'; import { Asset, Assets } from '../../../types'; @@ -47,18 +47,10 @@ export default class GuardianPhoneMessageTypesHandler extends DefaultHandler { } async getType(): Promise { - // in case client version does not support the operation - if ( - !this.client.guardian || - typeof this.client.guardian.getPhoneFactorMessageTypes !== 'function' - ) { - return null; - } - if (this.existing) return this.existing; try { - const { data } = await this.client.guardian.getPhoneFactorMessageTypes(); + const data = await this.client.guardian.factors.phone.getMessageTypes(); this.existing = data; } catch (err) { if (isFeatureUnavailableError(err)) { @@ -82,8 +74,8 @@ export default class GuardianPhoneMessageTypesHandler extends DefaultHandler { if (!guardianPhoneFactorMessageTypes || !guardianPhoneFactorMessageTypes.message_types) return; const data = guardianPhoneFactorMessageTypes; - await this.client.guardian.updatePhoneFactorMessageTypes( - data as unknown as GetMessageTypes200Response + await this.client.guardian.factors.phone.setMessageTypes( + data as unknown as Management.SetGuardianFactorPhoneMessageTypesRequestContent ); this.updated += 1; this.didUpdate(guardianPhoneFactorMessageTypes); diff --git a/src/tools/auth0/handlers/guardianPhoneFactorSelectedProvider.ts b/src/tools/auth0/handlers/guardianPhoneFactorSelectedProvider.ts index cb1197a2c..701647e26 100644 --- a/src/tools/auth0/handlers/guardianPhoneFactorSelectedProvider.ts +++ b/src/tools/auth0/handlers/guardianPhoneFactorSelectedProvider.ts @@ -1,4 +1,4 @@ -import { GetPhoneProviders200Response } from 'auth0'; +import { Management } from 'auth0'; import DefaultHandler from './default'; import constants from '../../constants'; import { Asset, Assets } from '../../../types'; @@ -44,18 +44,10 @@ export default class GuardianPhoneSelectedProviderHandler extends DefaultHandler } async getType(): Promise { - // in case client version does not support the operation - if ( - !this.client.guardian || - typeof this.client.guardian.getPhoneFactorSelectedProvider !== 'function' - ) { - return null; - } - if (this.existing) return this.existing; try { - const { data } = await this.client.guardian.getPhoneFactorSelectedProvider(); + const data = await this.client.guardian.factors.phone.getSelectedProvider(); this.existing = data; } catch (err) { if (isFeatureUnavailableError(err)) { @@ -80,8 +72,8 @@ export default class GuardianPhoneSelectedProviderHandler extends DefaultHandler return; const data = guardianPhoneFactorSelectedProvider; - await this.client.guardian.updatePhoneFactorSelectedProvider( - data as GetPhoneProviders200Response + await this.client.guardian.factors.phone.setProvider( + data as Management.SetGuardianFactorsProviderPhoneRequestContent ); this.updated += 1; this.didUpdate(guardianPhoneFactorSelectedProvider); diff --git a/src/tools/auth0/handlers/guardianPolicies.ts b/src/tools/auth0/handlers/guardianPolicies.ts index 75d5c44a8..1feadb164 100644 --- a/src/tools/auth0/handlers/guardianPolicies.ts +++ b/src/tools/auth0/handlers/guardianPolicies.ts @@ -1,3 +1,4 @@ +import { Management } from 'auth0'; import DefaultHandler from './default'; import constants from '../../constants'; import { Assets } from '../../../types'; @@ -28,15 +29,10 @@ export default class GuardianPoliciesHandler extends DefaultHandler { }); } - //TODO: standardize empty object literal with more intentional empty indicator + // TODO: standardize empty object literal with more intentional empty indicator async getType(): Promise { - // in case client version does not support the operation - if (!this.client.guardian || typeof this.client.guardian.getPolicies !== 'function') { - return {}; - } - if (this.existing) return this.existing; - const { data: policies } = await this.client.guardian.getPolicies(); + const policies = await this.client.guardian.policies.list(); this.existing = { policies }; return this.existing; } @@ -48,8 +44,8 @@ export default class GuardianPoliciesHandler extends DefaultHandler { // Do nothing if not set if (!guardianPolicies || !guardianPolicies.policies) return; - const data = guardianPolicies.policies; - await this.client.guardian.updatePolicies(data); + const data = guardianPolicies.policies as Management.SetGuardianPoliciesRequestContent; + await this.client.guardian.policies.set(data); this.updated += 1; this.didUpdate(guardianPolicies); } diff --git a/src/tools/auth0/handlers/hooks.ts b/src/tools/auth0/handlers/hooks.ts index 6bb1fccd5..c48edfb23 100644 --- a/src/tools/auth0/handlers/hooks.ts +++ b/src/tools/auth0/handlers/hooks.ts @@ -1,4 +1,4 @@ -import { Hook } from 'auth0'; +import { Management } from 'auth0'; import DefaultHandler from './default'; import constants from '../../constants'; import { Asset, Assets, CalculatedChanges } from '../../../types'; @@ -19,6 +19,8 @@ export const excludeSchema = { items: { type: 'string' }, }; +type Hook = Management.Hook; + export const schema = { type: 'array', items: { @@ -144,48 +146,42 @@ export default class HooksHandler extends DefaultHandler { await Promise.all( changes.del.map(async (data) => { - await this.client.hooks.deleteSecrets({ id: data.hookId }, data.secrets); + await this.client.hooks.secrets.delete(data.hookId, data.secrets); }) ); await Promise.all( changes.update.map(async (data) => { - await this.client.hooks.updateSecrets({ id: data.hookId }, data.secrets); + await this.client.hooks.secrets.update(data.hookId, data.secrets); }) ); await Promise.all( changes.create.map(async (data) => { - await this.client.hooks.addSecrets({ id: data.hookId }, data.secrets); + await this.client.hooks.secrets.create(data.hookId, data.secrets); }) ); } - //@ts-ignore because hooks use a special reload argument + // @ts-ignore because hooks use a special reload argument async getType(reload: boolean): Promise { if (this.existing && !reload) { return this.existing; } - // in case client version does not support hooks - if (!this.client.hooks || typeof this.client.hooks.getAll !== 'function') { - return []; - } - try { - const hooks = await paginate(this.client.hooks.getAll, { + const hooks = await paginate(this.client.hooks.list, { paginate: true, - include_totals: true, }); // hooks.getAll does not return code and secrets, we have to fetch hooks one-by-one this.existing = await Promise.all( hooks.map((hook: { id: string }) => this.client.hooks - .get({ id: hook.id }) - .then(({ data: hookWithCode }) => - this.client.hooks - .getSecrets({ id: hook.id }) + .get(hook.id) + .then((hookWithCode) => + this.client.hooks.secrets + .get(hook.id) .then(({ data: secrets }) => ({ ...hookWithCode, secrets })) ) ) @@ -232,7 +228,7 @@ export default class HooksHandler extends DefaultHandler { const err = new Error( `Only one active hook allowed for "${type}" extensibility point. Conflicting hooks: ${conflict}` ); - //@ts-ignore need to investigate if appending status actually works here + // @ts-ignore need to investigate if appending status actually works here err.status = 409; throw err; } diff --git a/src/tools/auth0/handlers/index.ts b/src/tools/auth0/handlers/index.ts index cb133bbca..13d14b48c 100644 --- a/src/tools/auth0/handlers/index.ts +++ b/src/tools/auth0/handlers/index.ts @@ -19,6 +19,7 @@ import * as guardianPhoneFactorMessageTypes from './guardianPhoneFactorMessageTy import * as roles from './roles'; import * as branding from './branding'; import * as phoneProviders from './phoneProvider'; +import * as phoneTemplates from './phoneTemplates'; import * as prompts from './prompts'; import * as actions from './actions'; import * as triggers from './triggers'; @@ -34,6 +35,7 @@ import * as selfServiceProfiles from './selfServiceProfiles'; import * as networkACLs from './networkACLs'; import * as userAttributeProfiles from './userAttributeProfiles'; import * as connectionProfiles from './connectionProfiles'; +import * as tokenExchangeProfiles from './tokenExchangeProfiles'; import { AssetTypes } from '../../../types'; import APIHandler from './default'; @@ -60,6 +62,7 @@ const auth0ApiHandlers: { [key in AssetTypes]: any } = { roles, branding, phoneProviders, + phoneTemplates, //@ts-ignore because prompts have not been universally implemented yet prompts, actions, @@ -76,6 +79,7 @@ const auth0ApiHandlers: { [key in AssetTypes]: any } = { networkACLs, userAttributeProfiles, connectionProfiles, + tokenExchangeProfiles, }; export default auth0ApiHandlers as { diff --git a/src/tools/auth0/handlers/logStreams.ts b/src/tools/auth0/handlers/logStreams.ts index 8f5de4cdc..f5589b5ba 100644 --- a/src/tools/auth0/handlers/logStreams.ts +++ b/src/tools/auth0/handlers/logStreams.ts @@ -69,6 +69,9 @@ export default class LogStreamsHandler extends DefaultAPIHandler { 'sink.splunkToken', 'sink.datadogApiKey', ], + functions: { + update: async (params, payload) => this.client.logStreams.update(params?.id, payload), + }, }); } @@ -81,8 +84,8 @@ export default class LogStreamsHandler extends DefaultAPIHandler { return this.existing; } - const logStreams = await this.client.logStreams.getAll().then(({ data: logStreams }) => - logStreams.map((logStream) => { + const logStreams = await this.client.logStreams.list().then((logStreamsResponse) => + logStreamsResponse.map((logStream) => { if (logStream.status === 'suspended') delete (logStream as any).status; return logStream; }) @@ -99,9 +102,9 @@ export default class LogStreamsHandler extends DefaultAPIHandler { if (!logStreams) return; - const changes = await this.calcChanges(assets).then((changes) => ({ - ...changes, - update: changes.update.map((update: LogStream) => { + const changes = await this.calcChanges(assets).then((changesResponse) => ({ + ...changesResponse, + update: changesResponse.update.map((update: LogStream) => { if (update.type === 'eventbridge' || update.type === 'eventgrid') { delete update.sink; } diff --git a/src/tools/auth0/handlers/networkACLs.ts b/src/tools/auth0/handlers/networkACLs.ts index 13792dd90..0090679e4 100644 --- a/src/tools/auth0/handlers/networkACLs.ts +++ b/src/tools/auth0/handlers/networkACLs.ts @@ -1,11 +1,11 @@ -import { GetNetworkAclsById200Response } from 'auth0'; +import { Management } from 'auth0'; import DefaultAPIHandler from './default'; import { Asset, Assets, CalculatedChanges } from '../../../types'; import { paginate } from '../client'; import log from '../../../logger'; // Define NetworkACL type -export type NetworkACL = GetNetworkAclsById200Response; +export type NetworkACL = Management.GetNetworkAclsResponseContent; // Define action types const BlockAction = { @@ -217,15 +217,22 @@ export default class NetworkACLsHandler extends DefaultAPIHandler { }); } + objString(acl: NetworkACL): string { + return super.objString({ + description: acl.description, + active: acl.active, + priority: acl.priority, + }); + } + async getType(): Promise { if (this.existing) { return this.existing; } try { - const networkACLs = await paginate(this.client.networkAcls.getAll, { + const networkACLs = await paginate(this.client.networkAcls.list, { paginate: true, - include_totals: true, }); this.existing = networkACLs; @@ -277,9 +284,9 @@ export default class NetworkACLsHandler extends DefaultAPIHandler { ); } - async createNetworkACL(acl: NetworkACL): Promise { - const { data: created } = await this.client.networkAcls.create(acl); - return created; + async createNetworkACL(acl: NetworkACL): Promise { + await this.client.networkAcls.create(acl as Management.CreateNetworkAclRequestContent); + return acl; } async createNetworkACLs(creates: CalculatedChanges['create']) { @@ -301,7 +308,12 @@ export default class NetworkACLsHandler extends DefaultAPIHandler { async updateNetworkACL(acl: NetworkACL) { const { id, ...updateParams } = acl; - const updated = await this.client.networkAcls.update({ id }, updateParams); + + if (!id) { + throw new Error(`Missing id for ${this.type} ${this.objString(acl)}`); + } + + const updated = await this.client.networkAcls.update(id, updateParams); return updated; } @@ -323,7 +335,10 @@ export default class NetworkACLsHandler extends DefaultAPIHandler { } async deleteNetworkACL(acl: NetworkACL): Promise { - await this.client.networkAcls.delete({ id: acl.id }); + if (!acl.id) { + throw new Error(`Missing id for ${this.type} ${this.objString(acl)}`); + } + await this.client.networkAcls.delete(acl.id); } async deleteNetworkACLs(data: Asset[]): Promise { diff --git a/src/tools/auth0/handlers/organizations.ts b/src/tools/auth0/handlers/organizations.ts index 7977fa9ea..77b030c9f 100644 --- a/src/tools/auth0/handlers/organizations.ts +++ b/src/tools/auth0/handlers/organizations.ts @@ -1,24 +1,14 @@ -import _, { isArray } from 'lodash'; -import { - Client, - ClientGrant, - Connection, - CreateOrganizationDiscoveryDomainRequestContent, - CreateOrganizationDiscoveryDomainResponseContent, - GetOrganizationClientGrants200ResponseOneOfInner, - GetOrganizationDiscoveryDomainResponseContent, - GetOrganizations200ResponseOneOfInner, - OrganizationDiscoveryDomain, - OrganizationDiscoveryDomainStatus, - PostEnabledConnectionsRequest, - UpdateOrganizationDiscoveryDomainResponseContent, -} from 'auth0'; +import { omit } from 'lodash'; +import { Management } from 'auth0'; import DefaultHandler, { order } from './default'; import { calculateChanges } from '../../calculateChanges'; import log from '../../../logger'; import { Asset, Assets, CalculatedChanges } from '../../../types'; import { paginate } from '../client'; import { convertClientIdToName } from '../../../utils'; +import { Client } from './clients'; +import { Connection } from './connections'; +import { ClientGrant } from './clientGrants'; export const schema = { type: 'array', @@ -92,11 +82,13 @@ export const schema = { }, }; +type Organization = Management.Organization; + type FormattedClientGrants = { // eslint-disable-next-line camelcase - grant_id: string; + grant_id: string | undefined; // eslint-disable-next-line camelcase - client_id: string; + client_id: string | undefined; }; export default class OrganizationsHandler extends DefaultHandler { @@ -113,7 +105,7 @@ export default class OrganizationsHandler extends DefaultHandler { } async deleteOrganization(org): Promise { - await this.client.organizations.delete({ id: org.id }); + await this.client.organizations.delete(org.id); } async deleteOrganizations(data: Asset[]): Promise { @@ -155,7 +147,7 @@ export default class OrganizationsHandler extends DefaultHandler { if (typeof org.connections !== 'undefined' && org.connections.length > 0) { await Promise.all( org.connections.map((conn) => - this.client.organizations.addEnabledConnection({ id: created.id }, conn) + this.client.organizations.enabledConnections.add(created.id, conn) ) ); } @@ -175,7 +167,9 @@ export default class OrganizationsHandler extends DefaultHandler { await this.client.pool .addEachTask({ data: org.discovery_domains, - generator: (discoveryDomain: CreateOrganizationDiscoveryDomainRequestContent) => + generator: ( + discoveryDomain: Management.CreateOrganizationDiscoveryDomainRequestContent + ) => this.createOrganizationDiscoveryDomain(created.id, { domain: discoveryDomain?.domain, status: discoveryDomain?.status, @@ -227,7 +221,7 @@ export default class OrganizationsHandler extends DefaultHandler { delete org.client_grants; delete org.discovery_domains; - await this.client.organizations.update(params, org); + await this.client.organizations.update(params.id, org); // organization connections const connectionsToRemove = existingConnections.filter( @@ -249,15 +243,12 @@ export default class OrganizationsHandler extends DefaultHandler { // Handle updates first await Promise.all( connectionsToUpdate.map((conn) => - this.client.organizations - .updateEnabledConnection( - { connectionId: conn.connection_id, ...params }, - { - assign_membership_on_login: conn.assign_membership_on_login, - show_as_button: conn.show_as_button, - is_signup_enabled: conn.is_signup_enabled, - } - ) + this.client.organizations.enabledConnections + .update(params.id, conn.connection_id, { + assign_membership_on_login: conn.assign_membership_on_login, + show_as_button: conn.show_as_button, + is_signup_enabled: conn.is_signup_enabled, + }) .catch(() => { throw new Error( `Problem updating Enabled Connection ${conn.connection_id} for organizations ${params.id}` @@ -268,13 +259,13 @@ export default class OrganizationsHandler extends DefaultHandler { await Promise.all( connectionsToAdd.map((conn) => - this.client.organizations - .addEnabledConnection( - params, - _.omit( + this.client.organizations.enabledConnections + .add( + params.id, + omit( conn, 'connection' - ) as PostEnabledConnectionsRequest + ) as Management.AddOrganizationConnectionRequestContent ) .catch(() => { throw new Error( @@ -286,8 +277,8 @@ export default class OrganizationsHandler extends DefaultHandler { await Promise.all( connectionsToRemove.map((conn) => - this.client.organizations - .deleteEnabledConnection({ connectionId: conn.connection_id, ...params }) + this.client.organizations.enabledConnections + .delete(params.id, conn.connection_id) .catch(() => { throw new Error( `Problem removing Enabled Connection ${conn.connection_id} for organizations ${params.id}` @@ -420,13 +411,11 @@ export default class OrganizationsHandler extends DefaultHandler { async getFormattedClientGrants(): Promise { const [clients, clientGrants] = await Promise.all([ - paginate(this.client.clients.getAll, { + paginate(this.client.clients.list, { paginate: true, - include_totals: true, }), - paginate(this.client.clientGrants.getAll, { + paginate(this.client.clientGrants.list, { paginate: true, - include_totals: true, }), ]); @@ -438,6 +427,7 @@ export default class OrganizationsHandler extends DefaultHandler { if (found) grant.client_id = found.name; return grant; }); + return formattedClientGrantsMapping; } @@ -463,43 +453,36 @@ export default class OrganizationsHandler extends DefaultHandler { return this.existing; } - if (!this.client.organizations || typeof this.client.organizations.getAll !== 'function') { - return []; - } - try { const [organizations, clients] = await Promise.all([ - paginate(this.client.organizations.getAll, { + paginate(this.client.organizations.list, { checkpoint: true, - include_totals: true, }), - paginate(this.client.clients.getAll, { + paginate(this.client.clients.list, { paginate: true, - include_totals: true, }), ]); for (let index = 0; index < organizations.length; index++) { - // Get enabled connections for each organization - const { data: connections } = await this.client.organizations.getEnabledConnections({ - id: organizations[index].id, - }); - organizations[index].connections = connections; - - // Get client grants for each organization - const organizationClientGrants = await this.getOrganizationClientGrants( - organizations[index].id - ); - organizations[index].client_grants = organizationClientGrants?.map((clientGrant) => ({ - client_id: convertClientIdToName(clientGrant.client_id, clients), + const org = organizations[index]; + if (!org?.id) { + throw new Error(`Organization ${index} is missing an ID`); + } + + const connections = await this.getOrganizationEnabledConnections(org.id); + + org.connections = connections; + + const organizationClientGrants = await this.getOrganizationClientGrants(org.id); + + org.client_grants = organizationClientGrants?.map((clientGrant) => ({ + client_id: convertClientIdToName(clientGrant.client_id as string, clients), })); // Get discovery domains for each organization - const organizationDiscoveryDomains = await this.getAllOrganizationDiscoveryDomains( - organizations[index].id - ); + const organizationDiscoveryDomains = await this.getAllOrganizationDiscoveryDomains(org.id); if (organizationDiscoveryDomains) { - organizations[index].discovery_domains = organizationDiscoveryDomains; + org.discovery_domains = organizationDiscoveryDomains; } } @@ -522,9 +505,8 @@ export default class OrganizationsHandler extends DefaultHandler { // Gets organizations from destination tenant const existing = await this.getType(); - const existingConnections = await paginate(this.client.connections.getAll, { + const existingConnections = await paginate(this.client.connections.list, { checkpoint: true, - include_totals: true, }); // We need to get the connection ids for the names configured so we can link them together @@ -582,35 +564,34 @@ export default class OrganizationsHandler extends DefaultHandler { ); } - async getOrganizationClientGrants( + async getOrganizationEnabledConnections( organizationId: string - ): Promise { - // paginate without paginate helper as this is not getAll but getOrganizationClientGrants - // paginate through all oranizaion client grants for oranizaion id - const allOrganizationClientGrants: GetOrganizationClientGrants200ResponseOneOfInner[] = []; - let page = 0; - while (true) { - const { - data: { client_grants: organizationClientGrants, total }, - } = await this.client.organizations.getOrganizationClientGrants({ - id: organizationId, - page: page, - per_page: 100, - include_totals: true, - }); - - // if we get an unexpected response, break the loop to avoid infinite loop - if (!isArray(organizationClientGrants) || typeof total !== 'number') { - break; - } + ): Promise { + const allOrganizationConnections: Management.OrganizationConnection[] = []; - allOrganizationClientGrants.push(...organizationClientGrants); - page += 1; + let organizationConnections = await this.client.organizations.enabledConnections.list( + organizationId + ); + do { + allOrganizationConnections.push(...organizationConnections.data); + organizationConnections = await organizationConnections.getNextPage(); + } while (organizationConnections.hasNextPage()); - if (allOrganizationClientGrants.length === total) { - break; - } - } + return allOrganizationConnections; + } + + async getOrganizationClientGrants( + organizationId: string + ): Promise { + const allOrganizationClientGrants: Management.OrganizationClientGrant[] = []; + + let organizationClientGrants = await this.client.organizations.clientGrants.list( + organizationId + ); + do { + allOrganizationClientGrants.push(...organizationClientGrants.data); + organizationClientGrants = await organizationClientGrants.getNextPage(); + } while (organizationClientGrants.hasNextPage()); return allOrganizationClientGrants; } @@ -618,57 +599,37 @@ export default class OrganizationsHandler extends DefaultHandler { async createOrganizationClientGrants( organizationId: string, grantId: string - ): Promise { + ): Promise { log.debug(`Creating organization client grant ${grantId} for organization ${organizationId}`); - const { data: organizationClientGrants } = - await this.client.organizations.postOrganizationClientGrants( - { - id: organizationId, - }, - { - grant_id: grantId, - } - ); + const organizationClientGrants = await this.client.organizations.clientGrants.create( + organizationId, + { + grant_id: grantId, + } + ); return organizationClientGrants; } async deleteOrganizationClientGrants(organizationId: string, grantId: string): Promise { log.debug(`Deleting organization client grant ${grantId} for organization ${organizationId}`); - await this.client.organizations.deleteClientGrantsByGrantId({ - id: organizationId, - grant_id: grantId, - }); + await this.client.organizations.clientGrants.delete(organizationId, grantId); } async getAllOrganizationDiscoveryDomains( organizationId: string - ): Promise { + ): Promise { // paginate using checkpoint pagination for getAllDiscoveryDomains - const allDiscoveryDomains: OrganizationDiscoveryDomain[] = []; - - const requestArgs: any = { id: organizationId, take: 50 }; - let next: string | undefined; + const allDiscoveryDomains: Management.OrganizationDiscoveryDomain[] = []; try { + let orgDiscoveryDomain = await this.client.organizations.discoveryDomains.list( + organizationId + ); do { - if (next) { - requestArgs.from = next; - } else { - delete requestArgs.from; - } - - const rsp = await this.client.pool - .addSingleTask({ - data: requestArgs, - generator: (args) => this.client.organizations.getAllDiscoveryDomains(args), - }) - .promise(); - const discoveryDomains = Array.isArray(rsp.data) ? rsp.data : rsp.data?.domains || []; - - allDiscoveryDomains.push(...discoveryDomains); - next = rsp.data?.next; - } while (next); + allDiscoveryDomains.push(...orgDiscoveryDomain.data); + orgDiscoveryDomain = await orgDiscoveryDomain.getNextPage(); + } while (orgDiscoveryDomain.hasNextPage()); return allDiscoveryDomains; } catch (err) { @@ -688,38 +649,39 @@ export default class OrganizationsHandler extends DefaultHandler { async getOrganizationDiscoveryDomain( organizationId: string, discoveryDomainId: string - ): Promise { - const { data } = await this.client.organizations.getDiscoveryDomain({ - id: organizationId, - discovery_domain_id: discoveryDomainId, - }); - return data; + ): Promise { + const orgDiscoveryDomain = await this.client.organizations.discoveryDomains.get( + organizationId, + discoveryDomainId + ); + return orgDiscoveryDomain; } async createOrganizationDiscoveryDomain( organizationId: string, - discoveryDomain: CreateOrganizationDiscoveryDomainRequestContent - ): Promise { + discoveryDomain: Management.CreateOrganizationDiscoveryDomainRequestContent + ): Promise { log.debug( `Creating discovery domain ${discoveryDomain.domain} for organization ${organizationId}` ); - const { data } = await this.client.pool + const orgDiscoveryDomain = await this.client.pool .addSingleTask({ data: { id: organizationId, }, - generator: (args) => this.client.organizations.createDiscoveryDomain(args, discoveryDomain), + generator: (args) => + this.client.organizations.discoveryDomains.create(args.id, discoveryDomain), }) .promise(); - return data; + return orgDiscoveryDomain; } async updateOrganizationDiscoveryDomain( organizationId: string, discoveryDomainId: string, discoveryDomain: string, - status: OrganizationDiscoveryDomainStatus - ): Promise { + status: Management.OrganizationDiscoveryDomainStatus + ): Promise { log.debug(`Updating discovery domain ${discoveryDomain} for organization ${organizationId}`); // stripUpdateFields does not support in sub modules @@ -730,19 +692,19 @@ export default class OrganizationsHandler extends DefaultHandler { )}` ); - const { data } = await this.client.pool + const discoveryDomainUpdated = await this.client.pool .addSingleTask({ data: { id: organizationId, - discovery_domain_id: discoveryDomainId, + discoveryDomainId: discoveryDomainId, }, generator: (args) => - this.client.organizations.updateDiscoveryDomain(args, { - status, + this.client.organizations.discoveryDomains.update(args.id, args.discoveryDomainId, { + status: status, }), }) .promise(); - return data; + return discoveryDomainUpdated; } async deleteOrganizationDiscoveryDomain( @@ -755,9 +717,10 @@ export default class OrganizationsHandler extends DefaultHandler { .addSingleTask({ data: { id: organizationId, - discovery_domain_id: discoveryDomainId, + discoveryDomainId: discoveryDomainId, }, - generator: (args) => this.client.organizations.deleteDiscoveryDomain(args), + generator: (args) => + this.client.organizations.discoveryDomains.delete(args.id, args.discoveryDomainId), }) .promise(); } diff --git a/src/tools/auth0/handlers/pages.ts b/src/tools/auth0/handlers/pages.ts index 745ce7be2..f0cb8a47d 100644 --- a/src/tools/auth0/handlers/pages.ts +++ b/src/tools/auth0/handlers/pages.ts @@ -1,8 +1,8 @@ -import { Client } from 'auth0'; import DefaultHandler from './default'; import constants from '../../constants'; import { Asset, Assets } from '../../../types'; import { paginate } from '../client'; +import { Client } from './clients'; export const supportedPages = constants.PAGE_NAMES.filter((p) => p.includes('.json')).map((p) => p.replace('.json', '') @@ -15,6 +15,7 @@ export const pageNameMap = { }; export type Page = { + // eslint-disable-next-line camelcase show_log_link?: boolean; name: string; enabled?: boolean; @@ -52,9 +53,8 @@ export default class PagesHandler extends DefaultHandler { } async updateLoginPage(page): Promise { - const globalClient = await paginate(this.client.clients.getAll, { + const globalClient = await paginate(this.client.clients.list, { paginate: true, - include_totals: true, is_global: true, }); @@ -62,13 +62,14 @@ export default class PagesHandler extends DefaultHandler { throw new Error('Unable to find global client id when trying to update the login page'); } - await this.client.clients.update( - { client_id: globalClient[0].client_id }, - { - custom_login_page: page.html, - custom_login_page_on: page.enabled, - } - ); + if (!globalClient[0].client_id) { + throw new Error('Unable to find global client id when trying to update the login page'); + } + + await this.client.clients.update(globalClient[0].client_id, { + custom_login_page: page.html, + custom_login_page_on: page.enabled, + }); this.updated += 1; this.didUpdate(page); } @@ -88,7 +89,7 @@ export default class PagesHandler extends DefaultHandler { }, {}); if (Object.keys(update).length) { - await this.client.tenants.updateSettings(update); + await this.client.tenants.settings.update(update); } toUpdate.forEach((page) => { @@ -105,7 +106,7 @@ export default class PagesHandler extends DefaultHandler { }[] = []; // Login page is handled via the global client - const globalClient = await paginate(this.client.clients.getAll, { + const globalClient = await paginate(this.client.clients.list, { paginate: true, include_totals: true, is_global: true, @@ -122,7 +123,7 @@ export default class PagesHandler extends DefaultHandler { }); } - const { data: tenantSettings } = await this.client.tenants.getSettings(); + const tenantSettings = await this.client.tenants.settings.get(); Object.entries(pageNameMap).forEach(([key, name]) => { const page = tenantSettings[name]; diff --git a/src/tools/auth0/handlers/phoneProvider.ts b/src/tools/auth0/handlers/phoneProvider.ts index 2c60baeb4..da6eb4470 100644 --- a/src/tools/auth0/handlers/phoneProvider.ts +++ b/src/tools/auth0/handlers/phoneProvider.ts @@ -1,9 +1,4 @@ -import { - CreatePhoneProviderRequest, - DeletePhoneProviderRequest, - GetBrandingPhoneProviders200ResponseProvidersInner, - UpdatePhoneProviderOperationRequest, -} from 'auth0'; +import { Management } from 'auth0'; import DefaultHandler, { order } from './default'; import { Assets } from '../../../types'; import log from '../../../logger'; @@ -106,7 +101,7 @@ export const schema = { }, }; -export type PhoneProvider = GetBrandingPhoneProviders200ResponseProvidersInner; +export type PhoneProvider = Management.GetBrandingPhoneProviderResponseContent; export default class PhoneProviderHandler extends DefaultHandler { existing: PhoneProvider[] | null; @@ -119,7 +114,7 @@ export default class PhoneProviderHandler extends DefaultHandler { } objString(provider: PhoneProvider): string { - return super.objString({ name: provider.name, disabled: provider.disabled }); //Que + return super.objString({ name: provider.name, disabled: provider.disabled }); } async getType(): Promise { @@ -131,7 +126,7 @@ export default class PhoneProviderHandler extends DefaultHandler { } async getPhoneProviders(): Promise { - const { data: response } = await this.client.branding.getAllPhoneProviders(); + const response = await this.client.branding.phone.providers.list(); return response.providers ?? []; } @@ -162,9 +157,11 @@ export default class PhoneProviderHandler extends DefaultHandler { } const currentProvider = currentProviders[0]; - await this.client.branding.deletePhoneProvider({ - id: currentProvider.id, - }); + if (!currentProvider.id) { + throw new Error('Unable to find phone provider id when trying to delete'); + } + + await this.client.branding.phone.providers.delete(currentProvider.id); this.deleted += 1; this.didDelete(currentProvider); @@ -192,16 +189,16 @@ export default class PhoneProviderHandler extends DefaultHandler { if (currentProviders === null || currentProviders.length === 0) { // if provider does not exist, create it this.created += 1; - await this.client.branding.configurePhoneProvider( - providerReqPayload as CreatePhoneProviderRequest + await this.client.branding.phone.providers.create( + providerReqPayload as Management.CreateBrandingPhoneProviderRequestContent ); } else { const currentProvider = currentProviders[0]; + if (!currentProvider.id) { + throw new Error('Unable to find phone provider id when trying to delete'); + } // if provider exists, overwrite it - await this.client.branding.updatePhoneProvider( - { id: currentProvider.id } as UpdatePhoneProviderOperationRequest, - providerReqPayload - ); + await this.client.branding.phone.providers.update(currentProvider.id, providerReqPayload); this.updated += 1; this.didUpdate(phoneProviders[0]); diff --git a/src/tools/auth0/handlers/phoneTemplates.ts b/src/tools/auth0/handlers/phoneTemplates.ts new file mode 100644 index 000000000..3527b29ba --- /dev/null +++ b/src/tools/auth0/handlers/phoneTemplates.ts @@ -0,0 +1,220 @@ +import { Management } from 'auth0'; +import DefaultHandler, { order } from './default'; +import { Asset, Assets, CalculatedChanges } from '../../../types'; +import log from '../../../logger'; + +export type PhoneTemplate = Management.PhoneTemplate; + +export const schema = { + type: 'array', + description: 'List of phone notification templates', + items: { + type: 'object', + properties: { + type: { + type: 'string', + description: 'Type of phone notification template', + enum: ['otp_verify', 'otp_enroll', 'change_password', 'blocked_account', 'password_breach'], + }, + disabled: { + type: 'boolean', + description: 'Whether the template is enabled (false) or disabled (true).', + }, + content: { + type: 'object', + description: 'Content of the phone template', + properties: { + syntax: { + type: 'string', + description: 'Syntax used for the template content', + }, + from: { + type: 'string', + description: + 'Default phone number to be used as "from" when sending a phone notification', + }, + body: { + type: 'object', + description: 'Body content of the phone template', + properties: { + text: { + type: 'string', + description: 'Content of the phone template for text notifications', + }, + voice: { + type: 'string', + description: 'Content of the phone template for voice notifications', + }, + }, + }, + }, + }, + }, + }, +}; + +export default class PhoneTemplatesHandler extends DefaultHandler { + existing: PhoneTemplate[]; + + constructor(options: DefaultHandler) { + super({ + ...options, + type: 'phoneTemplates', + identifiers: ['type'], + stripCreateFields: ['channel', 'customizable', 'tenant'], + stripUpdateFields: ['channel', 'customizable', 'tenant', 'type'], + }); + } + + objString(template): string { + return super.objString({ type: template.type, disabled: template.disabled }); + } + + async getType(): Promise { + if (this.existing) { + return this.existing; + } + + const response = await this.client.branding.phone.templates.list(); + this.existing = response.templates ?? []; + + return this.existing; + } + + @order('65') + async processChanges(assets: Assets): Promise { + const { phoneTemplates } = assets; + + if (!phoneTemplates) return; + + const { del, update, create } = await this.calcChanges(assets); + + log.debug( + `Start processChanges for phone templates [delete:${del.length}] [update:${update.length}], [create:${create.length}]` + ); + + const changes = [{ del: del }, { create: create }, { update: update }]; + + await Promise.all( + changes.map(async (change) => { + switch (true) { + case change.del && change.del.length > 0: + await this.deletePhoneTemplates(change.del || []); + break; + case change.create && change.create.length > 0: + await this.createPhoneTemplates(change.create); + break; + case change.update && change.update.length > 0: + if (change.update) await this.updatePhoneTemplates(change.update); + break; + default: + break; + } + }) + ); + } + + async createPhoneTemplate(template): Promise { + const created = await this.client.branding.phone.templates.create(template); + return created; + } + + async createPhoneTemplates(creates: CalculatedChanges['create']): Promise { + await this.client.pool + .addEachTask({ + data: creates || [], + generator: (item) => + this.createPhoneTemplate(item) + .then((data) => { + this.didCreate(data); + this.created += 1; + }) + .catch((err) => { + throw new Error(`Problem creating ${this.type} ${this.objString(item)}\n${err}`); + }), + }) + .promise(); + } + + async updatePhoneTemplate(template): Promise { + const { type } = template; + + // Find the existing template to get its id + const existing = this.existing?.find((t) => t.type === type); + if (!existing?.id) { + log.warn( + `Skipping update for phone template type '${type}' as unable to find existing template ID` + ); + return template; + } + + // stripUpdateFields does not support in sub modules + const stripUpdateFields = ['content.syntax']; + log.debug(`Stripping ${this.type} create-only fields ${JSON.stringify(stripUpdateFields)}`); + + const updatePayload: Management.UpdatePhoneTemplateRequestContent = { + content: { + from: template.content?.from, + body: { + text: template.content?.body?.text, + voice: template.content?.body?.voice, + }, + }, + disabled: template.disabled, + }; + + const updated = await this.client.branding.phone.templates.update(existing.id, updatePayload); + return updated; + } + + async updatePhoneTemplates(updates: CalculatedChanges['update']): Promise { + await this.client.pool + .addEachTask({ + data: updates || [], + generator: (item) => + this.updatePhoneTemplate(item) + .then((data) => { + this.didUpdate(data); + this.updated += 1; + }) + .catch((err) => { + throw new Error(`Problem updating ${this.type} ${this.objString(item)}\n${err}`); + }), + }) + .promise(); + } + + async deletePhoneTemplate(template): Promise { + if (!template.id) { + throw new Error( + `Unable to find phone template id for type ${template.type} when trying to delete` + ); + } + await this.client.branding.phone.templates.delete(template.id); + } + + async deletePhoneTemplates(data: Asset[]): Promise { + if ( + this.config('AUTH0_ALLOW_DELETE') === 'true' || + this.config('AUTH0_ALLOW_DELETE') === true + ) { + await this.client.pool + .addEachTask({ + data: data || [], + generator: (item) => + this.deletePhoneTemplate(item) + .then(() => { + this.didDelete(item); + this.deleted += 1; + }) + .catch((err) => { + throw new Error(`Problem deleting ${this.type} ${this.objString(item)}\n${err}`); + }), + }) + .promise(); + } else { + log.warn(`Detected the following phone templates should be deleted. Doing so may be destructive.\nYou can enable deletes by setting 'AUTH0_ALLOW_DELETE' to true in the config + \n${data.map((i) => this.objString(i)).join('\n')}`); + } + } +} diff --git a/src/tools/auth0/handlers/prompts.ts b/src/tools/auth0/handlers/prompts.ts index 14a04a2b3..5c1f37b2e 100644 --- a/src/tools/auth0/handlers/prompts.ts +++ b/src/tools/auth0/handlers/prompts.ts @@ -1,15 +1,9 @@ import { isEmpty } from 'lodash'; -import { - GetPartialsPromptEnum, - GetAllRendering200ResponseOneOfInner, - GetRenderingScreenEnum, - PatchRenderingRequest, - PatchRenderingRequestRenderingModeEnum, - PutPartialsRequest, -} from 'auth0'; +import { Management } from 'auth0'; import DefaultHandler from './default'; import { Assets, Language, languages } from '../../../types'; import log from '../../../logger'; +import { paginate } from '../client'; const promptTypes = [ 'login', @@ -46,6 +40,7 @@ const promptTypes = [ 'common', 'captcha', 'passkeys', + 'brute-force-protection', ] as const; export type PromptTypes = (typeof promptTypes)[number]; @@ -112,6 +107,9 @@ const screenTypes = [ 'login-passwordless-sms-otp', 'passkey-enrollment', 'passkey-enrollment-local', + 'brute-force-protection-unblock', + 'brute-force-protection-unblock-success', + 'brute-force-protection-unblock-failure', ] as const; export type ScreenTypes = (typeof screenTypes)[number]; @@ -305,7 +303,7 @@ export type AllPromptsByLanguage = Partial<{ [key in Language]: Partial; }>; -export type ScreenRenderer = Partial; +export type ScreenRenderer = Management.AculResponseContent; export type Prompts = Partial< PromptSettings & { @@ -339,10 +337,9 @@ export default class PromptsHandler extends DefaultHandler { } async getType(): Promise { - const { data: promptsSettings } = await this.client.prompts.get(); + const promptsSettings = await this.client.prompts.getSettings(); const customText = await this.getCustomTextSettings(); - const partials = await this.getCustomPromptsPartials(); const prompts: Prompts = { @@ -352,8 +349,11 @@ export default class PromptsHandler extends DefaultHandler { }; try { - const { data } = await this.client.prompts.getAllRenderingSettings(); - prompts.screenRenderers = data; + const screenRenderers = await paginate(this.client.prompts.rendering.list, { + paginate: true, + }); + + prompts.screenRenderers = screenRenderers ?? []; } catch (error) { log.warn(`Unable to fetch screen renderers: ${error}`); } @@ -362,12 +362,10 @@ export default class PromptsHandler extends DefaultHandler { } async getCustomTextSettings(): Promise { - const supportedLanguages = await this.client.tenants - .getSettings() - .then(({ data: { enabled_locales } }) => { - if (enabled_locales === undefined) return []; // In rare cases, private cloud tenants may not have `enabled_locales` defined - return enabled_locales; - }); + const supportedLanguages = await this.client.tenants.settings.get().then((res) => { + if (res.enabled_locales === undefined) return []; // In rare cases, private cloud tenants may not have `enabled_locales` defined + return res.enabled_locales; + }); return this.client.pool .addEachTask({ @@ -376,24 +374,19 @@ export default class PromptsHandler extends DefaultHandler { .map((language) => promptTypes.map((promptType) => ({ promptType, language }))) .reduce((acc, val) => acc.concat(val), []) || [], generator: ({ promptType, language }) => - this.client.prompts - .getCustomTextByLanguage({ - prompt: promptType, + this.client.prompts.customText.get(promptType, language).then((customTextData) => { + if (isEmpty(customTextData)) return null; + return { language, - }) - .then(({ data: customTextData }) => { - if (isEmpty(customTextData)) return null; - return { - language, - [promptType]: { - ...customTextData, - }, - }; - }), + [promptType]: { + ...customTextData, + }, + }; + }), }) .promise() - .then((customTextData) => - customTextData + .then((customTextResponse) => + customTextResponse .filter((customTextData) => customTextData !== null) .reduce((acc: AllPromptsByLanguage, customTextItem) => { if (customTextItem?.language === undefined) return acc; @@ -450,10 +443,10 @@ export default class PromptsHandler extends DefaultHandler { async getCustomPartial({ prompt, }: { - prompt: GetPartialsPromptEnum; + prompt: Management.PartialGroupsEnum; }): Promise { if (!this.IsFeatureSupported) return {}; - return this.withErrorHandling(async () => this.client.prompts.getPartials({ prompt })); + return this.withErrorHandling(async () => this.client.prompts.partials.get(prompt)); } async getCustomPromptsPartials(): Promise { @@ -462,10 +455,10 @@ export default class PromptsHandler extends DefaultHandler { data: customPartialsPromptTypes, generator: (promptType) => this.getCustomPartial({ - prompt: promptType as GetPartialsPromptEnum, + prompt: promptType as Management.PartialGroupsEnum, }).then((partialsData: CustomPromptPartials) => { - if (isEmpty(partialsData?.data)) return null; - return { promptType, partialsData: partialsData.data }; + if (isEmpty(partialsData)) return null; + return { promptType, partialsData }; }), }) .promise(); @@ -493,7 +486,7 @@ export default class PromptsHandler extends DefaultHandler { const { partials, customText, screenRenderers, ...promptSettings } = prompts; if (!isEmpty(promptSettings)) { - await this.client.prompts.update(promptSettings); + await this.client.prompts.updateSettings(promptSettings); } await this.updateCustomTextSettings(customText); @@ -529,7 +522,7 @@ export default class PromptsHandler extends DefaultHandler { }); }), generator: ({ prompt, language, body }) => - this.client.prompts.updateCustomTextByLanguage({ prompt, language }, body), + this.client.prompts.customText.set(prompt, language, body), }) .promise(); } @@ -538,13 +531,11 @@ export default class PromptsHandler extends DefaultHandler { prompt, body, }: { - prompt: CustomPartialsPromptTypes; - body: CustomPromptPartialsScreens; + prompt: Management.PartialGroupsEnum; + body: Management.SetPartialsRequestContent; }): Promise { if (!this.IsFeatureSupported) return; - await this.withErrorHandling(async () => - this.client.prompts.updatePartials({ prompt } as PutPartialsRequest, body) - ); + await this.withErrorHandling(async () => this.client.prompts.partials.set(prompt, body)); } async updateCustomPromptsPartials(partials: Prompts['partials']): Promise { @@ -554,7 +545,7 @@ export default class PromptsHandler extends DefaultHandler { if (!partials) return; await this.client.pool .addEachTask({ - data: Object.keys(partials).map((prompt: CustomPartialsPromptTypes) => { + data: Object.keys(partials).map((prompt: Management.PartialGroupsEnum) => { const body = partials[prompt] || {}; return { body, @@ -567,22 +558,29 @@ export default class PromptsHandler extends DefaultHandler { } async updateScreenRenderer(screenRenderer: ScreenRenderer): Promise { - const { prompt, screen, rendering_mode, tenant, default_head_tags_disabled, ...updatePrams } = - screenRenderer; + const { prompt, screen, ...updatePrams } = screenRenderer; if (!prompt || !screen) return; - const updatePayload = { - ...updatePrams, - rendering_mode, - default_head_tags_disabled: default_head_tags_disabled || undefined, - }; + let updatePayload: Management.UpdateAculRequestContent; + + if (screenRenderer.rendering_mode === Management.AculRenderingModeEnum.Standard) { + updatePayload = { + rendering_mode: Management.AculRenderingModeEnum.Standard, + head_tags: screenRenderer.head_tags as Management.AculHeadTag[], + }; + } else { + updatePayload = { + ...updatePrams, + rendering_mode: Management.AculRenderingModeEnum.Advanced, + default_head_tags_disabled: screenRenderer.default_head_tags_disabled || undefined, + head_tags: screenRenderer.head_tags as Management.AculHeadTag[], + }; + } try { - await this.client.prompts.updateRendering( - { - prompt: prompt as GetPartialsPromptEnum, - screen: screen as GetRenderingScreenEnum, - }, + await this.client.prompts.rendering.update( + prompt as Management.PromptGroupNameEnum, + screen as Management.ScreenGroupNameEnum, { ...updatePayload, } diff --git a/src/tools/auth0/handlers/resourceServers.ts b/src/tools/auth0/handlers/resourceServers.ts index 8eb3a1e49..c8e588b92 100644 --- a/src/tools/auth0/handlers/resourceServers.ts +++ b/src/tools/auth0/handlers/resourceServers.ts @@ -1,10 +1,4 @@ -import { - ApiResponse, - ResourceServer, - ResourceServerProofOfPossessionMechanismEnum, - ResourceServerSubjectTypeAuthorizationClientPolicyEnum, - ResourceServerSubjectTypeAuthorizationUserPolicyEnum, -} from 'auth0'; +import { Management } from 'auth0'; import ValidationError from '../../validationError'; import constants from '../../constants'; @@ -18,6 +12,8 @@ export const excludeSchema = { items: { type: 'string' }, }; +export type ResourceServer = Management.ResourceServer; + export const schema = { type: 'array', items: { @@ -42,7 +38,7 @@ export const schema = { properties: { mechanism: { type: 'string', - enum: Object.values(ResourceServerProofOfPossessionMechanismEnum), + enum: Object.values(Management.ResourceServerProofOfPossessionMechanismEnum), }, required: { type: 'boolean' }, }, @@ -57,7 +53,9 @@ export const schema = { properties: { policy: { type: 'string', - enum: Object.values(ResourceServerSubjectTypeAuthorizationUserPolicyEnum), + enum: Object.values( + Management.ResourceServerSubjectTypeAuthorizationUserPolicyEnum + ), }, }, }, @@ -67,7 +65,9 @@ export const schema = { properties: { policy: { type: 'string', - enum: Object.values(ResourceServerSubjectTypeAuthorizationClientPolicyEnum), + enum: Object.values( + Management.ResourceServerSubjectTypeAuthorizationClientPolicyEnum + ), }, }, }, @@ -108,9 +108,8 @@ export default class ResourceServersHandler extends DefaultHandler { async getType(): Promise { if (this.existing) return this.existing; - let resourceServers = await paginate(this.client.resourceServers.getAll, { + let resourceServers = await paginate(this.client.resourceServers.list, { paginate: true, - include_totals: true, }); resourceServers = resourceServers.filter( @@ -165,8 +164,8 @@ export default class ResourceServersHandler extends DefaultHandler { let existing = await this.getType(); // Filter excluded - resourceServers = resourceServers.filter((r) => !excluded.includes(r.name)); - existing = existing.filter((r) => !excluded.includes(r.name)); + resourceServers = resourceServers.filter((r) => r.name && !excluded.includes(r.name)); + existing = existing.filter((r) => r.name && !excluded.includes(r.name)); return calculateChanges({ handler: this, @@ -195,13 +194,36 @@ export default class ResourceServersHandler extends DefaultHandler { await super.validate(assets); } - async updateResourceServer(args, update: ResourceServer): Promise> { + async processChanges(assets: Assets): Promise { + const { resourceServers } = assets; + + // Do nothing if not set + if (!resourceServers) return; + + const changes = await this.calcChanges(assets); + + await super.processChanges(assets, { + ...changes, + }); + } + + async updateResourceServer( + args: { id: string }, + update: ResourceServer + ): Promise { // Exclude name from update as it cannot be modified for system resource servers like Auth0 My Account API if (update.is_system === true || update.name === 'Auth0 My Account API') { - const { name, is_system: _isSystem, ...updateFields } = update; - return this.client.resourceServers.update(args, updateFields); + const updateFields: Management.UpdateResourceServerRequestContent = { + token_lifetime: update.token_lifetime, + proof_of_possession: update.proof_of_possession, + skip_consent_for_verifiable_first_party_clients: + update.skip_consent_for_verifiable_first_party_clients, + subject_type_authorization: update.subject_type_authorization, + }; + + return this.client.resourceServers.update(args?.id, updateFields); } - return this.client.resourceServers.update(args, update); + return this.client.resourceServers.update(args?.id, update); } } diff --git a/src/tools/auth0/handlers/roles.ts b/src/tools/auth0/handlers/roles.ts index d40f55dd2..64b9d0bf7 100644 --- a/src/tools/auth0/handlers/roles.ts +++ b/src/tools/auth0/handlers/roles.ts @@ -1,5 +1,4 @@ -import { GetOrganizationMemberRoles200ResponseOneOfInner, Permission, ResourceServer } from 'auth0'; -import { isArray } from 'lodash'; +import { Management } from 'auth0'; import DefaultHandler, { order } from './default'; import { calculateChanges } from '../../calculateChanges'; import log from '../../../logger'; @@ -29,6 +28,7 @@ export const schema = { }, }; +type Role = Management.GetRoleResponseContent; export default class RolesHandler extends DefaultHandler { existing: Asset[]; @@ -44,10 +44,10 @@ export default class RolesHandler extends DefaultHandler { const role = { ...data }; delete role.permissions; - const { data: created } = await this.client.roles.create(role); + const created = await this.client.roles.create(role); - if (typeof data.permissions !== 'undefined' && data.permissions.length > 0) { - await this.client.roles.addPermissions({ id: created.id }, { permissions: data.permissions }); + if (created.id && typeof data.permissions !== 'undefined' && data.permissions.length > 0) { + await this.client.roles.permissions.add(created.id, { permissions: data.permissions }); } return created; @@ -71,7 +71,7 @@ export default class RolesHandler extends DefaultHandler { } async deleteRole(data) { - await this.client.roles.delete({ id: data.id }); + await this.client.roles.delete(data.id); } async deleteRoles(dels: CalculatedChanges['del']): Promise { @@ -110,14 +110,16 @@ export default class RolesHandler extends DefaultHandler { delete data.permissions; delete data.id; - await this.client.roles.update(params, data); + await this.client.roles.update(params.id, data); if (typeof existingRole.permissions !== 'undefined' && existingRole.permissions.length > 0) { - await this.client.roles.deletePermissions(params, { permissions: existingRole.permissions }); + await this.client.roles.permissions.delete(params.id, { + permissions: existingRole.permissions, + }); } if (typeof newPermissions !== 'undefined' && newPermissions.length > 0) { - await this.client.roles.addPermissions(params, { permissions: newPermissions }); + await this.client.roles.permissions.add(params.id, { permissions: newPermissions }); } return params; @@ -145,29 +147,20 @@ export default class RolesHandler extends DefaultHandler { return this.existing; } - // in case client version does not support roles - if (!this.client.roles || typeof this.client.roles.getAll !== 'function') { - return []; - } - try { - const roles = await paginate( - this.client.roles.getAll, - { - paginate: true, - include_totals: true, - } - ); + const roles = await paginate(this.client.roles.list, { + paginate: true, + include_totals: true, + }); for (let index = 0; index < roles.length; index++) { - // paginate without paginate helper as this is not getAll but getPermissions - // paginate through all permissions for each role - const allPermission: Permission[] = []; + const allPermission: Management.PermissionsResponsePayload[] = []; + /* let page = 0; while (true) { const { data: { permissions, total }, - } = await this.client.roles.getPermissions({ + } = await this.client.roles.permissions.list({ include_totals: true, id: roles[index].id, page: page, @@ -184,6 +177,14 @@ export default class RolesHandler extends DefaultHandler { break; } } + */ + + const rolesId = roles[index].id as string; + let permissions = await this.client.roles.permissions.list(rolesId, { per_page: 100 }); + do { + allPermission.push(...permissions.data); + permissions = await permissions.getNextPage(); + } while (permissions.hasNextPage()); const strippedPerms = await Promise.all( allPermission.map(async (permission) => { @@ -235,7 +236,7 @@ export default class RolesHandler extends DefaultHandler { if (change.del) await this.deleteRoles(change.del); break; case change.create && change.create.length > 0: - await this.createRoles(changes.create); //TODO: fix this tho change.create + await this.createRoles(changes.create); break; case change.update && change.update.length > 0: if (change.update) await this.updateRoles(change.update, existing); diff --git a/src/tools/auth0/handlers/rules.ts b/src/tools/auth0/handlers/rules.ts index b88df00c8..6d365e5c9 100644 --- a/src/tools/auth0/handlers/rules.ts +++ b/src/tools/auth0/handlers/rules.ts @@ -1,4 +1,4 @@ -import { Rule } from 'auth0'; +import { Management } from 'auth0'; import ValidationError from '../../validationError'; import { convertJsonToString, stripFields, duplicateItems, isDeprecatedError } from '../../utils'; import DefaultHandler from './default'; @@ -51,6 +51,8 @@ export const schema = { }, }; +type Rule = Management.Rule; + export default class RulesHandler extends DefaultHandler { existing: Asset[]; @@ -66,9 +68,8 @@ export default class RulesHandler extends DefaultHandler { try { if (this.existing) return this.existing; - const rules = await paginate(this.client.rules.getAll, { + const rules = await paginate(this.client.rules.list, { paginate: true, - include_totals: true, }); this.existing = rules; return this.existing; @@ -124,7 +125,7 @@ export default class RulesHandler extends DefaultHandler { const existingMaxOrder = Math.max(...existing.map((r) => r.order)); let nextOrderNo = Math.max(futureMaxOrder, existingMaxOrder); - //@ts-ignore because we know reOrder is Asset[] + // @ts-ignore because we know reOrder is Asset[] const reOrder: Asset[] = futureRules.reduce((accum: Asset[], r: Asset) => { if (existing === null) return accum; const conflict = existing.find((f) => r.order === f.order && r.name !== f.name); @@ -222,7 +223,7 @@ export default class RulesHandler extends DefaultHandler { data: changes.reOrder, generator: (rule) => this.client.rules - .update({ id: rule.id }, stripFields(rule, this.stripUpdateFields)) + .update(rule.id, stripFields(rule, this.stripUpdateFields)) .then(() => { const updated = { name: rule.name, diff --git a/src/tools/auth0/handlers/rulesConfigs.ts b/src/tools/auth0/handlers/rulesConfigs.ts index 170e914b8..45f5755b5 100644 --- a/src/tools/auth0/handlers/rulesConfigs.ts +++ b/src/tools/auth0/handlers/rulesConfigs.ts @@ -30,7 +30,7 @@ export default class RulesConfigsHandler extends DefaultHandler { async getType(): Promise { try { - const { data } = await this.client.rulesConfigs.getAll(); + const data = await this.client.rulesConfigs.list(); return data; } catch (err) { if (isDeprecatedError(err)) return null; diff --git a/src/tools/auth0/handlers/scimHandler.ts b/src/tools/auth0/handlers/scimHandler.ts index bf3acb89a..560488672 100644 --- a/src/tools/auth0/handlers/scimHandler.ts +++ b/src/tools/auth0/handlers/scimHandler.ts @@ -1,5 +1,5 @@ import { PromisePoolExecutor } from 'promise-pool-executor'; -import { ConnectionCreate } from 'auth0'; +import { Management } from 'auth0'; import { Asset, Auth0APIClient } from '../../../types'; import log from '../../../logger'; import { ConfigFunction } from '../../../configFactory'; @@ -94,13 +94,17 @@ export default class ScimHandler { this.idMap.set(connection.id, { strategy: connection.strategy }); return this.getScimConfiguration({ id: connection.id }) .then((response) => { - const scimConfiguration = response?.data; + const scimConfiguration = response; if (scimConfiguration) { + // eslint-disable-next-line camelcase const { mapping, user_id_attribute, connection_id } = scimConfiguration; - this.idMap.set(connection_id, { - ...this.idMap.get(connection_id)!, - scimConfiguration: { mapping, user_id_attribute }, - }); + // eslint-disable-next-line camelcase + if (connection_id) { + this.idMap.set(connection_id, { + ...this.idMap.get(connection_id)!, + scimConfiguration: { mapping, user_id_attribute }, + }); + } } }) .catch((error) => { @@ -225,7 +229,7 @@ export default class ScimHandler { return this.withErrorHandling( async () => - this.connectionsManager.createScimConfiguration({ id }, { user_id_attribute, mapping }), + this.connectionsManager.scimConfiguration.create(id, { user_id_attribute, mapping }), 'create', id ); @@ -234,11 +238,13 @@ export default class ScimHandler { /** * Retrieves `SCIM` configuration of an enterprise connection. */ - async getScimConfiguration({ id }: ScimRequestParams): Promise { + async getScimConfiguration({ + id, + }: ScimRequestParams): Promise { log.debug(`Getting SCIM configuration from connection ${id}`); return this.withErrorHandling( - async () => this.connectionsManager.getScimConfiguration({ id }), + async () => this.connectionsManager.scimConfiguration.get(id), 'get', id ); @@ -256,7 +262,7 @@ export default class ScimHandler { return this.withErrorHandling( async () => - this.connectionsManager.updateScimConfiguration({ id }, { user_id_attribute, mapping }), + this.connectionsManager.scimConfiguration.update(id, { user_id_attribute, mapping }), 'patch', id ); @@ -269,7 +275,7 @@ export default class ScimHandler { log.debug(`Deleting SCIM configuration on connection ${id}`); return this.withErrorHandling( - async () => this.connectionsManager.deleteScimConfiguration({ id }), + async () => this.connectionsManager.scimConfiguration.delete(id), 'delete', id ); @@ -282,7 +288,7 @@ export default class ScimHandler { delete bodyParams.scim_configuration; // First, update `connections`. - const updated = await this.connectionsManager.update(requestParams, bodyParams); + const updated = await this.connectionsManager.update(requestParams.id, bodyParams); const idMapEntry = this.idMap.get(requestParams.id); // Now, update `scim_configuration` inside the updated connection. @@ -319,9 +325,11 @@ export default class ScimHandler { delete bodyParams.scim_configuration; // First, create the new `connection`. - const { data } = await this.connectionsManager.create(bodyParams as ConnectionCreate); + const data = await this.connectionsManager.create( + bodyParams as Management.CreateConnectionRequestContent + ); - if (scimBodyParams && this.scimScopes.create) { + if (data?.id && scimBodyParams && this.scimScopes.create) { // Now, create the `scim_configuration` for newly created `connection`. await this.createScimConfiguration({ id: data.id }, scimBodyParams); } diff --git a/src/tools/auth0/handlers/selfServiceProfiles.ts b/src/tools/auth0/handlers/selfServiceProfiles.ts index e07121166..2866ac550 100644 --- a/src/tools/auth0/handlers/selfServiceProfiles.ts +++ b/src/tools/auth0/handlers/selfServiceProfiles.ts @@ -1,23 +1,28 @@ -import { - GetSelfServiceProfileCustomTextLanguageEnum, - GetSelfServiceProfileCustomTextPageEnum, - SsProfile, - UserAttributeProfile, -} from 'auth0'; +import { Management } from 'auth0'; import { isEmpty } from 'lodash'; import { Asset, Assets, Auth0APIClient, CalculatedChanges } from '../../../types'; import log from '../../../logger'; import DefaultAPIHandler, { order } from './default'; import { calculateChanges } from '../../calculateChanges'; import { paginate } from '../client'; -import { getUserAttributeProfiles } from './userAttributeProfiles'; +import { getUserAttributeProfiles, UserAttributeProfile } from './userAttributeProfiles'; + +const SelfServiceProfileCustomTextLanguageEnum = { + en: 'en', +} as const; + +const SelfServiceProfileCustomTextPageEnum = { + getStarted: 'get-started', +} as const; type customTextType = { - [GetSelfServiceProfileCustomTextLanguageEnum.en]: { - [GetSelfServiceProfileCustomTextPageEnum.get_started]: Object; + [SelfServiceProfileCustomTextLanguageEnum.en]: { + [SelfServiceProfileCustomTextPageEnum.getStarted]: Object; }; }; +type SsProfile = Management.SelfServiceProfile; + export type SsProfileWithCustomText = Omit & { customText?: customTextType; }; @@ -73,10 +78,10 @@ export const schema = { customText: { type: 'object', properties: { - [GetSelfServiceProfileCustomTextLanguageEnum.en]: { + [SelfServiceProfileCustomTextLanguageEnum.en]: { type: 'object', properties: { - [GetSelfServiceProfileCustomTextPageEnum.get_started]: { + [SelfServiceProfileCustomTextPageEnum.getStarted]: { type: 'object', }, }, @@ -104,13 +109,17 @@ export default class SelfServiceProfileHandler extends DefaultAPIHandler { }); } + objString(item): string { + return super.objString({ + name: item.name, + }); + } + async getType() { if (this.existing) return this.existing; - const selfServiceProfiles = await paginate(this.client.selfServiceProfiles.getAll, { + const selfServiceProfiles = await paginate(this.client.selfServiceProfiles.list, { paginate: true, - include_totals: true, - is_global: false, }); const selfServiceProfileWithCustomText: SsProfileWithCustomText[] = await Promise.all( @@ -118,16 +127,17 @@ export default class SelfServiceProfileHandler extends DefaultAPIHandler { /** * Fetches the custom text for the "get_started" in "en" page of a self-service profile. */ - const { data: getStartedText } = await this.client.selfServiceProfiles.getCustomText({ - id: sp.id, - language: GetSelfServiceProfileCustomTextLanguageEnum.en, - page: GetSelfServiceProfileCustomTextPageEnum.get_started, - }); + + const getStartedText = await this.client.selfServiceProfiles.customText.list( + sp.id as string, + SelfServiceProfileCustomTextLanguageEnum.en, + SelfServiceProfileCustomTextPageEnum.getStarted + ); if (!isEmpty(getStartedText)) { const customText = { - [GetSelfServiceProfileCustomTextLanguageEnum.en]: { - [GetSelfServiceProfileCustomTextPageEnum.get_started]: getStartedText, + [SelfServiceProfileCustomTextLanguageEnum.en]: { + [SelfServiceProfileCustomTextPageEnum.getStarted]: getStartedText, }, }; return { @@ -229,16 +239,14 @@ export default class SelfServiceProfileHandler extends DefaultAPIHandler { async updateCustomText(ssProfileId: string, customText: customTextType): Promise { try { - await this.client.selfServiceProfiles.updateCustomText( + await this.client.selfServiceProfiles.customText.set( + ssProfileId, + SelfServiceProfileCustomTextLanguageEnum.en, + SelfServiceProfileCustomTextPageEnum.getStarted, { - id: ssProfileId, - language: GetSelfServiceProfileCustomTextLanguageEnum.en, - page: GetSelfServiceProfileCustomTextPageEnum.get_started, - }, - { - ...customText[GetSelfServiceProfileCustomTextLanguageEnum.en][ - GetSelfServiceProfileCustomTextPageEnum.get_started - ], + ...(customText[SelfServiceProfileCustomTextLanguageEnum.en][ + SelfServiceProfileCustomTextPageEnum.getStarted + ] as Record), } ); log.debug(`Updated custom text for ${this.type} ${ssProfileId}`); @@ -267,9 +275,11 @@ export default class SelfServiceProfileHandler extends DefaultAPIHandler { async createSelfServiceProfile(profile: SsProfileWithCustomText): Promise { const { customText, ...ssProfile } = profile; - const { data: created } = await this.client.selfServiceProfiles.create(ssProfile as SsProfile); + const created = await this.client.selfServiceProfiles.create( + ssProfile as Management.CreateSelfServiceProfileRequestContent + ); - if (!isEmpty(customText)) { + if (!isEmpty(customText) && created.id) { await this.updateCustomText(created.id, customText); } @@ -295,9 +305,9 @@ export default class SelfServiceProfileHandler extends DefaultAPIHandler { async updateSelfServiceProfile(profile: SsProfileWithCustomText): Promise { const { customText, id, ...ssProfile } = profile; - const { data: updated } = await this.client.selfServiceProfiles.update({ id }, ssProfile); + const updated = await this.client.selfServiceProfiles.update(id as string, ssProfile); - if (!isEmpty(customText)) { + if (!isEmpty(customText) && updated.id) { await this.updateCustomText(updated.id, customText); } return updated; @@ -329,7 +339,7 @@ export default class SelfServiceProfileHandler extends DefaultAPIHandler { } async deleteSelfServiceProfile(profile: SsProfileWithCustomText): Promise { - await this.client.selfServiceProfiles.delete({ id: profile.id }); + await this.client.selfServiceProfiles.delete(profile.id as string); } async getUserAttributeProfiles( diff --git a/src/tools/auth0/handlers/tenant.ts b/src/tools/auth0/handlers/tenant.ts index f4ef2316a..ec4912e91 100644 --- a/src/tools/auth0/handlers/tenant.ts +++ b/src/tools/auth0/handlers/tenant.ts @@ -1,9 +1,4 @@ -import { - TenantSettings, - TenantSettingsFlags, - TenantSettingsUpdate, - TenantSettingsUpdateFlags, -} from 'auth0'; +import { Management } from 'auth0'; import ValidationError from '../../validationError'; import DefaultHandler, { order } from './default'; import { supportedPages, pageNameMap } from './pages'; @@ -56,7 +51,10 @@ export const schema = { }, }; -export type Tenant = TenantSettings; +// export type Tenant = TenantSettings; + +export type Tenant = Management.GetTenantSettingsResponseContent; +type TenantSettingsFlags = Management.TenantSettingsFlags; const blockPageKeys = [ ...Object.keys(pageNameMap), @@ -102,7 +100,7 @@ export const allowedTenantFlags = [ ]; export const removeUnallowedTenantFlags = ( - proposedFlags: TenantSettingsFlags + proposedFlags: TenantSettingsFlags | undefined ): TenantSettingsFlags => { if (proposedFlags === undefined) return {} as unknown as TenantSettingsFlags; @@ -147,7 +145,7 @@ export default class TenantHandler extends DefaultHandler { } async getType(): Promise { - const { data: tenant } = await this.client.tenants.getSettings(); + const tenant = await this.client.tenants.settings.get(); tenant.flags = removeUnallowedTenantFlags(tenant.flags); @@ -184,10 +182,10 @@ export default class TenantHandler extends DefaultHandler { // Do nothing if not set if (!tenant) return; - const updatedTenant: TenantSettingsUpdate = { + const updatedTenant: Management.UpdateTenantSettingsRequestContent = { ...tenant, flags: tenant.flags - ? (removeUnallowedTenantFlags(tenant.flags) as TenantSettingsUpdateFlags) + ? (removeUnallowedTenantFlags(tenant.flags) as TenantSettingsFlags) : undefined, }; @@ -198,7 +196,7 @@ export default class TenantHandler extends DefaultHandler { } if (updatedTenant && Object.keys(updatedTenant).length > 0) { - await this.client.tenants.updateSettings(updatedTenant); + await this.client.tenants.settings.update(updatedTenant); this.updated += 1; this.didUpdate(updatedTenant); } diff --git a/src/tools/auth0/handlers/themes.ts b/src/tools/auth0/handlers/themes.ts index a186c8b42..bc3cff91b 100644 --- a/src/tools/auth0/handlers/themes.ts +++ b/src/tools/auth0/handlers/themes.ts @@ -1,109 +1,8 @@ -import { PostBrandingTheme200Response } from 'auth0'; +import { Management } from 'auth0'; import { Assets } from '../../../types'; import log from '../../../logger'; import DefaultHandler, { order } from './default'; -export type Theme = PostBrandingTheme200Response; -export default class ThemesHandler extends DefaultHandler { - existing: Theme[] | null; - - constructor(options: DefaultHandler) { - super({ - ...options, - type: 'themes', - id: 'themeId', - }); - } - - objString(theme: Theme): string { - return theme.displayName || JSON.stringify(theme); - } - - async getType(): Promise { - if (!this.existing) { - this.existing = await this.getThemes(); - } - - return this.existing; - } - - @order('60') // Run after custom domains. - async processChanges(assets: Assets): Promise { - const { themes } = assets; - - // Non existing section means themes doesn't need to be processed - if (!themes) { - return; - } - - // Empty array means themes should be deleted - if (themes.length === 0) { - return this.deleteThemes(); - } - - return this.updateThemes(themes); - } - - async deleteThemes(): Promise { - if (!this.config('AUTH0_ALLOW_DELETE')) { - return; - } - - // if theme exists we need to delete it - const currentThemes = await this.getThemes(); - if (currentThemes === null || currentThemes.length === 0) { - return; - } - - const currentTheme = currentThemes[0]; - await this.client.branding.deleteTheme({ themeId: currentTheme.themeId }); - - this.deleted += 1; - this.didDelete(currentTheme); - } - - async updateThemes(themes: Theme[]): Promise { - if (themes.length > 1) { - log.warn('Only one theme is supported per tenant'); - } - - const currentThemes = await this.getThemes(); - - const themeReqPayload = ((): Omit => { - // Removing themeId from update and create payloads, otherwise API will error - // Theme ID may be required to handle if `--export_ids=true` - const payload = themes[0]; - //@ts-ignore to quell non-optional themeId property, but we know that it's ok to delete - delete payload.themeId; - return payload; - })(); - - if (currentThemes === null || currentThemes.length === 0) { - await this.client.branding.createTheme(themeReqPayload); - } else { - const currentTheme = currentThemes[0]; - // if theme exists, overwrite it otherwise create it - await this.client.branding.updateTheme({ themeId: currentTheme.themeId }, themeReqPayload); - } - - this.updated += 1; - this.didUpdate(themes[0]); - } - - async getThemes(): Promise { - try { - const { data: theme } = await this.client.branding.getDefaultTheme(); - return [theme]; - } catch (err) { - if (err.statusCode === 404) return []; - if (err.statusCode === 400) return null; - - // Errors other than 404 (theme doesn't exist) or 400 (no-code not enabled) shouldn't be expected - throw err; - } - } -} - /** * Schema */ @@ -519,3 +418,104 @@ export const schema = { type: 'object', }, }; + +export type Theme = Management.GetBrandingThemeResponseContent; +export default class ThemesHandler extends DefaultHandler { + existing: Theme[] | null; + + constructor(options: DefaultHandler) { + super({ + ...options, + type: 'themes', + id: 'themeId', + }); + } + + objString(theme: Theme): string { + return theme.displayName || JSON.stringify(theme); + } + + async getType(): Promise { + if (!this.existing) { + this.existing = await this.getThemes(); + } + + return this.existing; + } + + @order('60') // Run after custom domains. + async processChanges(assets: Assets): Promise { + const { themes } = assets; + + // Non existing section means themes doesn't need to be processed + if (!themes) { + return; + } + + // Empty array means themes should be deleted + if (themes.length === 0) { + return this.deleteThemes(); + } + + return this.updateThemes(themes); + } + + async deleteThemes(): Promise { + if (!this.config('AUTH0_ALLOW_DELETE')) { + return; + } + + // if theme exists we need to delete it + const currentThemes = await this.getThemes(); + if (currentThemes === null || currentThemes.length === 0) { + return; + } + + const currentTheme = currentThemes[0]; + await this.client.branding.themes.delete(currentTheme.themeId); + + this.deleted += 1; + this.didDelete(currentTheme); + } + + async updateThemes(themes: Theme[]): Promise { + if (themes.length > 1) { + log.warn('Only one theme is supported per tenant'); + } + + const currentThemes = await this.getThemes(); + + const themeReqPayload = ((): Omit => { + // Removing themeId from update and create payloads, otherwise API will error + // Theme ID may be required to handle if `--export_ids=true` + const payload = themes[0]; + // @ts-ignore to quell non-optional themeId property, but we know that it's ok to delete + delete payload.themeId; + return payload; + })(); + + if (currentThemes === null || currentThemes.length === 0) { + await this.client.branding.themes.create(themeReqPayload); + } else { + const currentTheme = currentThemes[0]; + // if theme exists, overwrite it otherwise create it + await this.client.branding.themes.update(currentTheme.themeId, themeReqPayload); + } + + this.updated += 1; + this.didUpdate(themes[0]); + } + + async getThemes(): Promise { + try { + const theme = await this.client.branding.themes.getDefault(); + return [theme]; + } catch (err) { + if (err.statusCode === 404) return []; + if (err.statusCode === 400) return null; + + // Errors other than 404 (theme doesn't exist) or 400 (no-code not enabled) shouldn't be expected + throw err; + } + } +} diff --git a/src/tools/auth0/handlers/tokenExchangeProfiles.ts b/src/tools/auth0/handlers/tokenExchangeProfiles.ts new file mode 100644 index 000000000..84577b911 --- /dev/null +++ b/src/tools/auth0/handlers/tokenExchangeProfiles.ts @@ -0,0 +1,280 @@ +import { Management } from 'auth0'; +import DefaultHandler, { order } from './default'; +import { Asset, Assets } from '../../../types'; +import { paginate } from '../client'; +import log from '../../../logger'; + +// Define TokenExchangeProfile type +export type TokenExchangeProfile = Management.TokenExchangeProfileResponseContent; + +export const schema = { + type: 'array', + items: { + type: 'object', + properties: { + name: { + type: 'string', + description: 'The name of the token exchange profile', + }, + id: { + type: 'string', + description: 'The unique identifier of the token exchange profile', + }, + subject_token_type: { + type: 'string', + description: 'The URI representing the subject token type', + }, + action: { + type: 'string', + description: 'The name of the action associated with this profile', + }, + type: { + type: 'string', + enum: ['custom_authentication'], + description: 'The type of token exchange profile', + }, + created_at: { + type: 'string', + format: 'date-time', + description: 'The timestamp when the profile was created', + }, + updated_at: { + type: 'string', + format: 'date-time', + description: 'The timestamp when the profile was last updated', + }, + }, + required: ['name', 'subject_token_type', 'action', 'type'], + }, +}; + +export default class TokenExchangeProfilesHandler extends DefaultHandler { + existing: TokenExchangeProfile[]; + + private actions: Asset[] | null; + + constructor(config: DefaultHandler) { + super({ + ...config, + type: 'tokenExchangeProfiles', + id: 'id', + identifiers: ['id', 'name'], + // Only name and subject_token_type can be updated + stripUpdateFields: ['id', 'created_at', 'updated_at', 'action_id', 'type'], + stripCreateFields: ['id', 'created_at', 'updated_at'], + }); + } + + private sanitizeForExport(profile: TokenExchangeProfile, actions: Asset[]): TokenExchangeProfile { + if (profile.action_id) { + const action = actions?.find((a) => a.id === profile.action_id); + if (action) { + const { action_id, ...rest } = profile; + return { ...rest, action: action.name }; + } else { + log.warn( + `Token exchange profile "${profile.name}" references action with ID "${profile.action_id}" which was not found` + ); + } + } + return profile; + } + + private sanitizeForAPI(profile: TokenExchangeProfile, actions: Asset[]): TokenExchangeProfile { + if (profile.action) { + const foundAction = actions?.find((a) => a.name === profile.action); + if (foundAction) { + const { action, ...rest } = profile; + return { ...rest, action_id: foundAction.id }; + } else { + throw new Error( + `Token exchange profile "${profile.name}" references action "${profile.action}" which was not found` + ); + } + } + + if (!profile.action_id) { + throw new Error( + `Token exchange profile "${profile.name}" is missing action reference. ` + + `Expected "action" (name) or "action_id" (ID) field.` + ); + } + + return profile; + } + + async getActions(): Promise { + if (this.actions) return this.actions; + + this.actions = await paginate(this.client.actions.list, { + paginate: true, + }); + + return this.actions; + } + + async getType(): Promise { + if (this.existing) return this.existing; + + try { + // Fetch all token exchange profiles + const profiles = await paginate( + this.client.tokenExchangeProfiles.list, + { + paginate: true, + } + ); + + // Fetch all actions to map action_id to action name + const actions = await this.getActions(); + + // Map action_id to action name for each profile + this.existing = profiles.map((profile) => this.sanitizeForExport(profile, actions)); + + return this.existing; + } catch (err) { + if (err.statusCode === 403) { + log.warn( + 'Token Exchange Profiles feature is not available on this tenant. Please contact Auth0 support to enable this feature.' + ); + return []; + } + throw err; + } + } + + @order('65') + async processChanges(assets: Assets): Promise { + const { tokenExchangeProfiles } = assets; + + // Do nothing if not set + if (!tokenExchangeProfiles) return; + + // Fetch actions to resolve action names to IDs + const actions = await this.getActions(); + + // Map action names to action_ids before processing + const sanitizedProfiles = tokenExchangeProfiles.map((profile) => + this.sanitizeForAPI(profile as TokenExchangeProfile, actions) + ); + + // Create modified assets with sanitized profiles + const modifiedAssets = { + ...assets, + tokenExchangeProfiles: sanitizedProfiles as TokenExchangeProfile[], + }; + + // Calculate changes + const { del, update, create, conflicts } = await this.calcChanges(modifiedAssets); + + log.debug( + `Start processChanges for tokenExchangeProfiles [delete:${del.length}] [update:${update.length}], [create:${create.length}], [conflicts:${conflicts.length}]` + ); + + // Process changes in order: delete, create, update + const changes = [{ del }, { create }, { update }]; + + await Promise.all( + changes.map(async (change) => { + switch (true) { + case change.del && change.del.length > 0: + await this.deleteTokenExchangeProfiles(change.del || []); + break; + case change.create && change.create.length > 0: + await this.createTokenExchangeProfiles(change.create); + break; + case change.update && change.update.length > 0: + if (change.update) await this.updateTokenExchangeProfiles(change.update); + break; + default: + break; + } + }) + ); + } + + async createTokenExchangeProfile(profile: TokenExchangeProfile): Promise { + const { id, created_at, updated_at, ...createParams } = profile; + const created = await this.client.tokenExchangeProfiles.create( + createParams as Management.CreateTokenExchangeProfileRequestContent + ); + return created; + } + + async createTokenExchangeProfiles(creates: TokenExchangeProfile[]): Promise { + await this.client.pool + .addEachTask({ + data: creates || [], + generator: (item: TokenExchangeProfile) => + this.createTokenExchangeProfile(item) + .then((data) => { + this.didCreate(data); + this.created += 1; + }) + .catch((err) => { + throw new Error(`Problem creating ${this.type} ${this.objString(item)}\n${err}`); + }), + }) + .promise(); + } + + async updateTokenExchangeProfile(profile: TokenExchangeProfile): Promise { + const { id, created_at, updated_at, action_id, type, ...updateParams } = profile; + + if (!id) { + throw new Error(`Cannot update token exchange profile "${profile.name}" - missing id`); + } + + await this.client.tokenExchangeProfiles.update(id, updateParams); + } + + async updateTokenExchangeProfiles(updates: TokenExchangeProfile[]): Promise { + await this.client.pool + .addEachTask({ + data: updates || [], + generator: (item: TokenExchangeProfile) => + this.updateTokenExchangeProfile(item) + .then(() => { + this.didUpdate(item); + this.updated += 1; + }) + .catch((err) => { + throw new Error(`Problem updating ${this.type} ${this.objString(item)}\n${err}`); + }), + }) + .promise(); + } + + async deleteTokenExchangeProfile(profile: TokenExchangeProfile): Promise { + if (!profile.id) { + throw new Error(`Cannot delete token exchange profile "${profile.name}" - missing id`); + } + + await this.client.tokenExchangeProfiles.delete(profile.id); + } + + async deleteTokenExchangeProfiles(data: TokenExchangeProfile[]): Promise { + if ( + this.config('AUTH0_ALLOW_DELETE') === 'true' || + this.config('AUTH0_ALLOW_DELETE') === true + ) { + await this.client.pool + .addEachTask({ + data: data || [], + generator: (item: TokenExchangeProfile) => + this.deleteTokenExchangeProfile(item) + .then(() => { + this.didDelete(item); + this.deleted += 1; + }) + .catch((err) => { + throw new Error(`Problem deleting ${this.type} ${this.objString(item)}\n${err}`); + }), + }) + .promise(); + } else { + log.warn(`Detected the following tokenExchangeProfile should be deleted. Doing so may be destructive.\nYou can enable deletes by setting 'AUTH0_ALLOW_DELETE' to true in the config + \n${data.map((i) => this.objString(i)).join('\n')}`); + } + } +} diff --git a/src/tools/auth0/handlers/triggers.ts b/src/tools/auth0/handlers/triggers.ts index 6395d60a6..cfa347efd 100644 --- a/src/tools/auth0/handlers/triggers.ts +++ b/src/tools/auth0/handlers/triggers.ts @@ -1,4 +1,5 @@ import _ from 'lodash'; +import { Management } from 'auth0'; import DefaultHandler, { order } from './default'; import constants from '../../constants'; import log from '../../../logger'; @@ -49,30 +50,24 @@ export default class TriggersHandler extends DefaultHandler { return this.existing; } - // in case client version does not support actions - if (!this.client.actions || typeof this.client.actions.getAllTriggers !== 'function') { - return []; - } - const triggerBindings = {}; try { - const res = await this.client.actions.getAllTriggers(); - const triggers: string[] = _(res.data.triggers).map('id').uniq().value(); + const res: Management.ListActionTriggersResponseContent = + await this.client.actions.triggers.list(); + const triggers: string[] = _(res?.triggers).map('id').uniq().value(); for (let i = 0; i < triggers.length; i++) { const triggerId = triggers[i]; let bindings; try { - const { data } = await this.client.actions.getTriggerBindings({ - triggerId: triggerId, - }); + const { data } = await this.client.actions.triggers.bindings.list(triggerId); - bindings = data?.bindings; + bindings = data; } catch (err) { log.warn(`${err.message} (trigger: ${triggerId}). Skipping this trigger and continuing.`); - continue; + bindings = null; } if (bindings && bindings.length > 0) { @@ -119,7 +114,7 @@ export default class TriggersHandler extends DefaultHandler { display_name: binding.display_name, })); - await this.client.actions.updateTriggerBindings({ triggerId: name }, { bindings }); + await this.client.actions.triggers.bindings.updateMany(name, { bindings }); this.didUpdate({ trigger_id: name }); this.updated += 1; }) diff --git a/src/tools/auth0/handlers/userAttributeProfiles.ts b/src/tools/auth0/handlers/userAttributeProfiles.ts index 62b099d68..c37691ed4 100644 --- a/src/tools/auth0/handlers/userAttributeProfiles.ts +++ b/src/tools/auth0/handlers/userAttributeProfiles.ts @@ -1,4 +1,4 @@ -import { UserAttributeProfile } from 'auth0'; +import { Management } from 'auth0'; import DefaultAPIHandler, { order } from './default'; import { Assets, Auth0APIClient } from '../../../types'; @@ -55,6 +55,8 @@ const strategyOverrides = { ), }; +export type UserAttributeProfile = Management.UserAttributeProfile; + export const schema = { type: 'array', items: { @@ -198,7 +200,7 @@ export const getUserAttributeProfiles = async ( ): Promise => { try { const userAttributeProfiles = await paginate( - auth0Client.userAttributeProfiles.getAll, + auth0Client.userAttributeProfiles.list, { checkpoint: true, include_totals: true, @@ -232,6 +234,10 @@ export default class UserAttributeProfilesHandler extends DefaultAPIHandler { id: 'id', identifiers: ['id', 'name'], stripUpdateFields: ['id'], + functions: { + update: async (params, payload) => + this.client.userAttributeProfiles.update(params?.id, payload), + }, }); } diff --git a/src/tools/auth0/index.ts b/src/tools/auth0/index.ts index 0078cb85b..a192dee92 100644 --- a/src/tools/auth0/index.ts +++ b/src/tools/auth0/index.ts @@ -75,6 +75,13 @@ export default class Auth0 { // eslint-disable-line try { const stageFn: StageFunction = Object.getPrototypeOf(handler)[stage]; + if (typeof stageFn !== 'function') { + throw new Error( + `Handler ${ + handler.type + } does not have a ${stage} method or it is not a function (got ${typeof stageFn})` + ); + } this.assets = { ...this.assets, ...((await stageFn.apply(handler, [this.assets])) || {}), diff --git a/src/tools/constants.ts b/src/tools/constants.ts index b15ec5526..bc80f9826 100644 --- a/src/tools/constants.ts +++ b/src/tools/constants.ts @@ -1,4 +1,4 @@ -import { GetEmailTemplatesByTemplateNameTemplateNameEnum } from 'auth0'; +import { Management } from 'auth0'; const PAGE_GUARDIAN_MULTIFACTOR = 'guardian_multifactor'; const PAGE_PASSWORD_RESET = 'password_reset'; @@ -59,7 +59,7 @@ const constants = { 'password_reset', 'user_invitation', 'async_approval', - ] as GetEmailTemplatesByTemplateNameTemplateNameEnum[], + ] as Management.EmailTemplateNameEnum[], ACTIONS_TRIGGERS: [ 'post-login', 'credentials-exchange', @@ -68,6 +68,7 @@ const constants = { 'post-change-password', 'send-phone-message', 'password-reset-post-challenge', + 'custom-token-exchange', ], EMAIL_TEMPLATES_DIRECTORY: 'emails', EMAIL_VERIFY, @@ -96,6 +97,7 @@ const constants = { CLIENTS_GRANTS_DIRECTORY: 'grants', BRANDING_DIRECTORY: 'branding', PHONE_PROVIDER_DIRECTORY: 'phone-providers', + PHONE_TEMPLATES_DIRECTORY: 'phone-templates', BRANDING_TEMPLATES_DIRECTORY: 'templates', BRANDING_TEMPLATES_YAML_DIRECTORY: 'branding_templates', CLIENTS_CLIENT_NAME: 'clients', @@ -216,6 +218,7 @@ const constants = { NETWORK_ACLS_DIRECTORY: 'network-acls', USER_ATTRIBUTE_PROFILES_DIRECTORY: 'user-attribute-profiles', CONNECTION_PROFILES_DIRECTORY: 'connection-profiles', + TOKEN_EXCHANGE_PROFILES_DIRECTORY: 'token-exchange-profiles', }; export default constants; diff --git a/src/tools/index.ts b/src/tools/index.ts index 7575f16ee..ca67cbc38 100644 --- a/src/tools/index.ts +++ b/src/tools/index.ts @@ -7,7 +7,15 @@ import { wrapArrayReplaceMarkersInQuotes, } from './utils'; -export default { +// Explicit type to avoid non-portable type inference +const tools: { + constants: typeof constants; + deploy: typeof deploy; + keywordReplace: typeof keywordReplace; + loadFileAndReplaceKeywords: typeof loadFileAndReplaceKeywords; + wrapArrayReplaceMarkersInQuotes: typeof wrapArrayReplaceMarkersInQuotes; + Auth0: typeof Auth0; +} = { constants, deploy, keywordReplace, @@ -16,6 +24,8 @@ export default { Auth0, }; +export default tools; + export { constants, deploy, diff --git a/src/tools/utils.ts b/src/tools/utils.ts index 457321078..e89fa5445 100644 --- a/src/tools/utils.ts +++ b/src/tools/utils.ts @@ -40,8 +40,12 @@ export function keywordStringReplace(input: string, mappings: KeywordMappings): return input; } -export function keywordReplace(input: string, mappings: KeywordMappings): string { +export function keywordReplace(input: string | undefined, mappings: KeywordMappings): string { // Replace keywords with mappings within input. + if (input === undefined) { + return 'undefined'; + } + if (mappings && Object.keys(mappings).length > 0) { input = keywordArrayReplace(input, mappings); input = keywordStringReplace(input, mappings); diff --git a/src/types.ts b/src/types.ts index e1081a353..61197d6d3 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,10 +1,4 @@ -import { - CustomDomain, - GetConnectionsStrategyEnum, - ManagementClient, - ResourceServer, - UserAttributeProfile, -} from 'auth0'; +import { Management, ManagementClient } from 'auth0'; import { PromisePoolExecutor } from 'promise-pool-executor'; import { Action } from './tools/auth0/handlers/actions'; import { Prompts } from './tools/auth0/handlers/prompts'; @@ -19,8 +13,11 @@ import { Flow } from './tools/auth0/handlers/flows'; import { FlowVaultConnection } from './tools/auth0/handlers/flowVaultConnections'; import { SsProfileWithCustomText } from './tools/auth0/handlers/selfServiceProfiles'; import { PhoneProvider } from './tools/auth0/handlers/phoneProvider'; +import { PhoneTemplate } from './tools/auth0/handlers/phoneTemplates'; import { NetworkACL } from './tools/auth0/handlers/networkACLs'; +import { UserAttributeProfile } from './tools/auth0/handlers/userAttributeProfiles'; import { AttackProtection } from './tools/auth0/handlers/attackProtection'; +import { TokenExchangeProfile } from './tools/auth0/handlers/tokenExchangeProfiles'; type SharedPaginationParams = { checkpoint?: boolean; @@ -29,7 +26,7 @@ type SharedPaginationParams = { is_first_party?: boolean; include_totals?: boolean; id?: string; - strategy?: GetConnectionsStrategyEnum[]; + strategy?: Management.ConnectionStrategyEnum[]; }; export type CheckpointPaginationParams = SharedPaginationParams & { @@ -72,6 +69,9 @@ export type Config = { AUTH0_BASE_PATH?: string; AUTH0_AUDIENCE?: string; AUTH0_API_MAX_RETRIES?: number; + AUTH0_MAX_RETRIES?: number; + AUTH0_RETRY_INITIAL_DELAY_MS?: number; + AUTH0_RETRY_MAX_DELAY_MS?: number; AUTH0_KEYWORD_REPLACE_MAPPINGS?: KeywordMappings; AUTH0_EXPORT_IDENTIFIERS?: boolean; AUTH0_CONNECTIONS_DIRECTORY?: string; @@ -103,10 +103,11 @@ export type Assets = Partial<{ }) | null; phoneProviders: PhoneProvider[] | null; + phoneTemplates: PhoneTemplate[] | null; clients: Client[] | null; clientGrants: ClientGrant[] | null; connections: Asset[] | null; - customDomains: CustomDomain[] | null; + customDomains: Management.CustomDomain[] | null; databases: Asset[] | null; emailProvider: Asset | null; emailTemplates: Asset[] | null; @@ -114,24 +115,24 @@ export type Assets = Partial<{ guardianFactors: Asset[] | null; guardianFactorTemplates: Asset[] | null; guardianPhoneFactorMessageTypes: { - message_types: Asset[]; //TODO: eliminate this intermediate level for consistency + message_types: Asset[]; // TODO: eliminate this intermediate level for consistency } | null; guardianPhoneFactorSelectedProvider: Asset | null; guardianPolicies: { - policies: string[]; //TODO: eliminate this intermediate level for consistency + policies: string[]; // TODO: eliminate this intermediate level for consistency } | null; hooks: Asset[] | null; logStreams: LogStream[] | null; organizations: Asset[] | null; pages: Page[] | null; prompts: Prompts | null; - resourceServers: ResourceServer[] | null; + resourceServers: Management.ResourceServer[] | null; roles: Asset[] | null; rules: Asset[] | null; rulesConfigs: Asset[] | null; tenant: Tenant | null; triggers: Asset[] | null; - //non-resource types + // non-resource types exclude?: { [key: string]: string[]; }; @@ -145,6 +146,7 @@ export type Assets = Partial<{ userAttributeProfiles: UserAttributeProfile[] | null; userAttributeProfilesWithId: UserAttributeProfile[] | null; connectionProfiles: Asset[] | null; + tokenExchangeProfiles: TokenExchangeProfile[] | null; }>; export type CalculatedChanges = { @@ -180,6 +182,7 @@ export type AssetTypes = | 'attackProtection' | 'branding' | 'phoneProviders' + | 'phoneTemplates' | 'logStreams' | 'prompts' | 'customDomains' @@ -190,7 +193,8 @@ export type AssetTypes = | 'selfServiceProfiles' | 'networkACLs' | 'userAttributeProfiles' - | 'connectionProfiles'; + | 'connectionProfiles' + | 'tokenExchangeProfiles'; export type KeywordMappings = { [key: string]: (string | number)[] | string | number }; diff --git a/src/utils.ts b/src/utils.ts index 5e1efd361..7217c28ae 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -75,7 +75,7 @@ export function toConfigFn(data: Config): (arg0: keyof Config) => any { return (key) => data[key]; } -export function stripIdentifiers(auth0: Auth0, assets: Assets) { +export function stripIdentifiers(auth0: Auth0, assets: Assets): Assets { const updated = { ...assets }; // Some of the object identifiers are required to perform updates. @@ -106,7 +106,8 @@ export function stripIdentifiers(auth0: Auth0, assets: Assets) { return updated; } -export function sanitize(str: string): string { +export function sanitize(str: string | undefined): string { + if (!str) return 'undefined'; return sanitizeName(str, { replacement: '-' }); } @@ -192,7 +193,12 @@ export function clearClientArrays(client: Asset): Asset { return client; } -export function convertClientIdToName(clientId: string, knownClients: Asset[] = []): string { +export function convertClientIdToName( + clientId: string | undefined, + knownClients: Asset[] = [] +): string { + if (!clientId) return 'undefined_clientId'; + try { const found = knownClients.find((c) => c.client_id === clientId); return (found && found.name) || clientId; diff --git a/test/context/context.test.js b/test/context/context.test.js index dd4560bf0..1e4371270 100644 --- a/test/context/context.test.js +++ b/test/context/context.test.js @@ -175,23 +175,6 @@ describe('#context loader validation', async () => { expect(loaded2).to.be.an.instanceof(yamlContext); }); - it('should include the deploy cli version in the user agent header', async () => { - /* Create empty directory */ - const dir = path.resolve(testDataDir, 'context'); - cleanThenMkdir(dir); - - const yaml = path.join(dir, 'empty.yaml'); - fs.writeFileSync(yaml, ''); - - const loaded = await setupContext({ ...config, AUTH0_INPUT_FILE: yaml }, 'import'); - expect(loaded).to.be.an.instanceof(yamlContext); - - const userAgent = loaded.mgmtClient.configuration.headers['User-agent']; - - expect(userAgent).to.contain('deploy-cli'); - expect(userAgent).to.contain('node.js'); - }); - it('should warn about deprecated exclusion params', async () => { /* Create empty directory */ const dir = path.resolve(testDataDir, 'context'); diff --git a/test/context/directory/actions.test.js b/test/context/directory/actions.test.js index 2b468c58c..1aecd64ef 100644 --- a/test/context/directory/actions.test.js +++ b/test/context/directory/actions.test.js @@ -156,7 +156,7 @@ describe('#directory context actions', () => { const dir = path.join(repoDir, constants.ACTIONS_DIRECTORY); fs.writeFileSync(dir, 'junk'); - const context = new Context({ AUTH0_INPUT_FILE: repoDir }); + const context = new Context({ AUTH0_INPUT_FILE: repoDir }, mockMgmtClient()); const errorMessage = `Expected ${dir} to be a folder but got a file?`; await expect(context.loadAssetsFromLocal()) .to.be.eventually.rejectedWith(Error) diff --git a/test/context/directory/clientGrants.test.js b/test/context/directory/clientGrants.test.js index 14892c847..dcbf8069e 100644 --- a/test/context/directory/clientGrants.test.js +++ b/test/context/directory/clientGrants.test.js @@ -124,7 +124,7 @@ describe('#directory context clientGrants', () => { { ...mockMgmtClient(), clients: { - getAll: (params) => + list: (params) => mockPagedData(params, 'clients', [ { client_id: 'client-id-1', @@ -137,7 +137,7 @@ describe('#directory context clientGrants', () => { ]), }, resourceServers: { - getAll: (params) => + list: (params) => mockPagedData(params, 'resource_servers', [ { id: 'resource-server-1', @@ -203,12 +203,12 @@ describe('#directory context clientGrants', () => { { ...mockMgmtClient(), clients: { - getAll: () => { + list: () => { throw new 'This should not be called'(); }, }, resourceServers: { - getAll: () => { + list: () => { throw new 'This should not be called'(); }, }, diff --git a/test/context/directory/context.test.js b/test/context/directory/context.test.js index d31493281..b59b603e5 100644 --- a/test/context/directory/context.test.js +++ b/test/context/directory/context.test.js @@ -3,7 +3,7 @@ import fs from 'fs-extra'; import { expect } from 'chai'; import Context from '../../../src/context/directory'; -import { cleanThenMkdir, testDataDir } from '../../utils'; +import { cleanThenMkdir, testDataDir, mockMgmtClient } from '../../utils'; import handlers from '../../../src/context/directory/handlers'; describe('#directory context validation', () => { @@ -12,7 +12,7 @@ describe('#directory context validation', () => { const dir = path.resolve(testDataDir, 'directory', 'empty'); cleanThenMkdir(dir); - const context = new Context({ AUTH0_INPUT_FILE: dir }); + const context = new Context({ AUTH0_INPUT_FILE: dir }, mockMgmtClient()); await context.loadAssetsFromLocal(); expect(Object.keys(context.assets).length).to.equal(Object.keys(handlers).length + 1); @@ -46,7 +46,7 @@ describe('#directory context validation', () => { AUTH0_EXCLUDED_RESOURCE_SERVERS: ['api'], AUTH0_EXCLUDED_DEFAULTS: ['emailProvider'], }; - const context = new Context(config); + const context = new Context(config, mockMgmtClient()); await context.loadAssetsFromLocal(); expect(context.assets.exclude.rules).to.deep.equal(['rule']); @@ -68,17 +68,23 @@ describe('#directory context validation', () => { cleanThenMkdir(dir); fs.writeFileSync(path.join(dir, 'tenant.json'), JSON.stringify(tenantConfig)); - const contextWithExclusion = new Context({ - AUTH0_INPUT_FILE: dir, - AUTH0_EXCLUDED: ['tenant'], - }); + const contextWithExclusion = new Context( + { + AUTH0_INPUT_FILE: dir, + AUTH0_EXCLUDED: ['tenant'], + }, + mockMgmtClient() + ); await contextWithExclusion.loadAssetsFromLocal(); expect(contextWithExclusion.assets.tenant).to.equal(undefined); - const contextWithoutExclusion = new Context({ - AUTH0_INPUT_FILE: dir, - AUTH0_EXCLUDED: [], // Not excluding tenant resource - }); + const contextWithoutExclusion = new Context( + { + AUTH0_INPUT_FILE: dir, + AUTH0_EXCLUDED: [], // Not excluding tenant resource + }, + mockMgmtClient() + ); await contextWithoutExclusion.loadAssetsFromLocal(); expect(contextWithoutExclusion.assets.tenant).to.deep.equal(tenantConfig); }); @@ -94,10 +100,13 @@ describe('#directory context validation', () => { cleanThenMkdir(dir); fs.writeFileSync(path.join(dir, 'tenant.json'), JSON.stringify(tenantConfig)); - const contextWithInclusion = new Context({ - AUTH0_INPUT_FILE: dir, - AUTH0_INCLUDED_ONLY: ['tenant'], - }); + const contextWithInclusion = new Context( + { + AUTH0_INPUT_FILE: dir, + AUTH0_INCLUDED_ONLY: ['tenant'], + }, + mockMgmtClient() + ); await contextWithInclusion.loadAssetsFromLocal(); expect(contextWithInclusion.assets.tenant).to.deep.equal(tenantConfig); expect(contextWithInclusion.assets.actions).to.equal(undefined); // Arbitrary sample resources @@ -106,7 +115,7 @@ describe('#directory context validation', () => { it('should error on bad directory', async () => { const dir = path.resolve(testDataDir, 'directory', 'doesNotExist'); - const context = new Context({ AUTH0_INPUT_FILE: dir }); + const context = new Context({ AUTH0_INPUT_FILE: dir }, mockMgmtClient()); const errorMessage = `Not sure what to do with, ${dir} as it is not a directory...`; await expect(context.loadAssetsFromLocal()) .to.be.eventually.rejectedWith(Error) @@ -126,7 +135,7 @@ describe('#directory context validation', () => { cleanThenMkdir(dir); fs.symlinkSync(file, link); - const context = new Context({ AUTH0_INPUT_FILE: link }); + const context = new Context({ AUTH0_INPUT_FILE: link }, mockMgmtClient()); const errorMessage = `Not sure what to do with, ${link} as it is not a directory...`; await expect(context.loadAssetsFromLocal()) .to.be.eventually.rejectedWith(Error) @@ -157,27 +166,21 @@ describe('#directory context validation', () => { }, { tenants: { - getSettings: async () => - new Promise((res) => { - res({ - data: { + settings: { + get: async () => + new Promise((res) => { + res({ friendly_name: 'Production Tenant', enabled_locales: ['en', 'es'], - }, - }); - }), + }); + }), + }, }, prompts: { _getRestClient: (endpoint) => ({ get: (...options) => Promise.resolve({ endpoint, method: 'get', options }), }), }, - actions: { - getSettings: async () => - new Promise((res) => { - res([]); - }), - }, } ); await context.dump(); diff --git a/test/context/directory/emailTemplates.test.js b/test/context/directory/emailTemplates.test.js index b38ca5f3c..c68857864 100644 --- a/test/context/directory/emailTemplates.test.js +++ b/test/context/directory/emailTemplates.test.js @@ -80,7 +80,7 @@ describe('#directory context email templates', () => { const dir = path.join(repoDir, constants.EMAIL_TEMPLATES_DIRECTORY); fs.writeFileSync(dir, 'junk'); - const context = new Context({ AUTH0_INPUT_FILE: repoDir }); + const context = new Context({ AUTH0_INPUT_FILE: repoDir }, mockMgmtClient()); const errorMessage = `Expected ${dir} to be a folder but got a file?`; await expect(context.loadAssetsFromLocal()) .to.be.eventually.rejectedWith(Error) diff --git a/test/context/directory/hooks.test.js b/test/context/directory/hooks.test.js index 227eb1ccc..92c98b3de 100644 --- a/test/context/directory/hooks.test.js +++ b/test/context/directory/hooks.test.js @@ -68,7 +68,7 @@ describe('#directory context hooks', () => { const dir = path.join(repoDir, constants.HOOKS_DIRECTORY); fs.writeFileSync(dir, 'junk'); - const context = new Context({ AUTH0_INPUT_FILE: repoDir }); + const context = new Context({ AUTH0_INPUT_FILE: repoDir }, mockMgmtClient()); const errorMessage = `Expected ${dir} to be a folder but got a file?`; await expect(context.loadAssetsFromLocal()) .to.be.eventually.rejectedWith(Error) diff --git a/test/context/directory/pages.test.js b/test/context/directory/pages.test.js index e73534234..a694e9b68 100644 --- a/test/context/directory/pages.test.js +++ b/test/context/directory/pages.test.js @@ -95,7 +95,7 @@ describe('#directory context pages', () => { const dir = path.join(repoDir, constants.PAGES_DIRECTORY); fs.writeFileSync(dir, 'junk'); - const context = new Context({ AUTH0_INPUT_FILE: repoDir }); + const context = new Context({ AUTH0_INPUT_FILE: repoDir }, mockMgmtClient()); const errorMessage = `Expected ${dir} to be a folder but got a file?`; await expect(context.loadAssetsFromLocal()) .to.be.eventually.rejectedWith(Error) diff --git a/test/context/directory/phoneTemplates.test.ts b/test/context/directory/phoneTemplates.test.ts new file mode 100644 index 000000000..87d13e564 --- /dev/null +++ b/test/context/directory/phoneTemplates.test.ts @@ -0,0 +1,253 @@ +import path from 'path'; +import { expect } from 'chai'; +import { constants } from '../../../src/tools'; + +import Context from '../../../src/context/directory'; +import { testDataDir, cleanThenMkdir, mockMgmtClient } from '../../utils'; +import handler from '../../../src/context/directory/handlers/phoneTemplates'; +import { loadJSON } from '../../../src/utils'; +import fs from 'fs-extra'; + +describe('#directory context phone templates', () => { + it('should process phoneTemplates', async () => { + const repoDir = path.join(testDataDir, 'directory', 'phoneTemplates'); + cleanThenMkdir(repoDir); + + const phoneTemplatesDir = path.join(repoDir, constants.PHONE_TEMPLATES_DIRECTORY); + cleanThenMkdir(phoneTemplatesDir); + + // Create individual template files + fs.writeFileSync( + path.join(phoneTemplatesDir, 'otp_verify.json'), + JSON.stringify({ + type: 'otp_verify', + disabled: false, + content: { + from: '+15551234567', + body: { + text: '##OTP_VERIFICATION_TEXT## {{ code }}', + voice: '##OTP_VERIFICATION_TEXT## {{ code }}', + }, + }, + }) + ); + + fs.writeFileSync( + path.join(phoneTemplatesDir, 'otp_enroll.json'), + JSON.stringify({ + type: 'otp_enroll', + disabled: false, + content: { + from: '+15551234567', + body: { + text: '##OTP_ENROLL_TEXT## {{ code }}', + }, + }, + }) + ); + + const config = { AUTH0_INPUT_FILE: repoDir, AUTH0_KEYWORD_REPLACE_MAPPINGS: { env: 'test' } }; + const context = new Context(config, mockMgmtClient()); + await context.loadAssetsFromLocal(); + + // Sort by type for consistent comparison since file order is not deterministic + const sortedTemplates = [...context.assets.phoneTemplates].sort((a, b) => + a.type.localeCompare(b.type) + ); + + expect(sortedTemplates).to.deep.equal([ + { + type: 'otp_enroll', + disabled: false, + content: { + from: '+15551234567', + body: { + text: '##OTP_ENROLL_TEXT## {{ code }}', + }, + }, + }, + { + type: 'otp_verify', + disabled: false, + content: { + from: '+15551234567', + body: { + text: '##OTP_VERIFICATION_TEXT## {{ code }}', + voice: '##OTP_VERIFICATION_TEXT## {{ code }}', + }, + }, + }, + ]); + }); + + it('should return null when phone-templates directory does not exist', async () => { + const repoDir = path.join(testDataDir, 'directory', 'phoneTemplatesEmpty'); + cleanThenMkdir(repoDir); + + const config = { AUTH0_INPUT_FILE: repoDir }; + const context = new Context(config, mockMgmtClient()); + await context.loadAssetsFromLocal(); + + expect(context.assets.phoneTemplates).to.equal(null); + }); + + it('should dump phone templates', async () => { + const dir = path.join(testDataDir, 'directory', 'phoneTemplatesDump'); + cleanThenMkdir(dir); + const context = new Context({ AUTH0_INPUT_FILE: dir }, mockMgmtClient()); + + context.assets.phoneTemplates = [ + { + id: 'pntm_1234567890', + type: 'otp_verify', + disabled: false, + channel: 'sms', + customizable: true, + tenant: 'test-tenant', + content: { + syntax: 'liquid', + from: '+15551234567', + body: { + text: '##OTP_VERIFICATION_TEXT## {{ code }}', + voice: '##OTP_VERIFICATION_TEXT## {{ code }}', + }, + }, + }, + { + id: 'pntm_0987654321', + type: 'otp_enroll', + disabled: false, + channel: 'sms', + customizable: true, + tenant: 'test-tenant', + content: { + syntax: 'liquid', + from: '+15551234567', + body: { + text: '##OTP_ENROLL_TEXT## {{ code }}', + }, + }, + }, + ]; + + await handler.dump(context); + + const phoneTemplatesFolder = path.join(dir, constants.PHONE_TEMPLATES_DIRECTORY); + + // Check otp_verify.json - should have read-only fields stripped + const otpVerify = loadJSON(path.join(phoneTemplatesFolder, 'otp_verify.json')); + expect(otpVerify).to.deep.equal({ + type: 'otp_verify', + disabled: false, + content: { + syntax: 'liquid', + from: '+15551234567', + body: { + text: '##OTP_VERIFICATION_TEXT## {{ code }}', + voice: '##OTP_VERIFICATION_TEXT## {{ code }}', + }, + }, + }); + expect(otpVerify).to.not.have.property('id'); + expect(otpVerify).to.not.have.property('channel'); + expect(otpVerify).to.not.have.property('customizable'); + expect(otpVerify).to.not.have.property('tenant'); + + // Check otp_enroll.json + const otpEnroll = loadJSON(path.join(phoneTemplatesFolder, 'otp_enroll.json')); + expect(otpEnroll).to.deep.equal({ + type: 'otp_enroll', + disabled: false, + content: { + syntax: 'liquid', + from: '+15551234567', + body: { + text: '##OTP_ENROLL_TEXT## {{ code }}', + }, + }, + }); + }); + + it('should not dump when phoneTemplates is null', async () => { + const dir = path.join(testDataDir, 'directory', 'phoneTemplatesNullDump'); + cleanThenMkdir(dir); + const context = new Context({ AUTH0_INPUT_FILE: dir }, mockMgmtClient()); + + context.assets.phoneTemplates = null; + + await handler.dump(context); + + const phoneTemplatesFolder = path.join(dir, constants.PHONE_TEMPLATES_DIRECTORY); + expect(fs.existsSync(phoneTemplatesFolder)).to.equal(false); + }); + + it('should preserve keyword markers when dumping with AUTH0_PRESERVE_KEYWORDS', async () => { + const dir = path.join(testDataDir, 'directory', 'phoneTemplatesPreserve'); + const phoneTemplatesDir = path.join(dir, constants.PHONE_TEMPLATES_DIRECTORY); + cleanThenMkdir(phoneTemplatesDir); + + const localTemplate = { + type: 'otp_verify', + disabled: false, + content: { + syntax: 'liquid', + from: '##FROM_NUMBER##', + body: { + text: '##OTP_VERIFICATION_TEXT## {{ code }}', + voice: '##OTP_VERIFICATION_TEXT## {{ code }}', + }, + }, + }; + + fs.writeFileSync( + path.join(phoneTemplatesDir, 'otp_verify.json'), + JSON.stringify(localTemplate) + ); + + const remoteTemplates = [ + { + id: 'pntm_otp_verify', + type: 'otp_verify', + disabled: false, + content: { + syntax: 'liquid', + from: '+15551230000', + body: { + text: 'Your verification code is {{ code }}', + voice: 'Your verification code is {{ code }}', + }, + }, + }, + ]; + + const mockMgmt = { + branding: { + phone: { + templates: { + list: () => Promise.resolve({ templates: remoteTemplates }), + }, + }, + }, + } as any; + + const context = new Context( + { + AUTH0_INPUT_FILE: dir, + AUTH0_PRESERVE_KEYWORDS: true, + AUTH0_INCLUDED_ONLY: ['phoneTemplates'], + AUTH0_KEYWORD_REPLACE_MAPPINGS: { + FROM_NUMBER: '+15551230000', + OTP_VERIFICATION_TEXT: 'Your verification code is', + OTP_ENROLL_TEXT: 'Your enrollment code is', + }, + } as any, + mockMgmt + ); + + await context.dump(); + + const dumped = loadJSON(path.join(phoneTemplatesDir, 'otp_verify.json')); + + expect(dumped).to.deep.equal(localTemplate); + }); +}); diff --git a/test/context/directory/prompts.test.ts b/test/context/directory/prompts.test.ts index f6f9aff67..0d0e5477f 100644 --- a/test/context/directory/prompts.test.ts +++ b/test/context/directory/prompts.test.ts @@ -12,6 +12,7 @@ import { mockMgmtClient, createDirWithNestedDir, } from '../../utils'; +import { Config } from '../../../src/types'; const dir = path.join(testDataDir, 'directory', 'promptsDump'); const promptsDirectory = path.join(dir, constants.PROMPTS_DIRECTORY); @@ -471,7 +472,7 @@ describe('#directory context prompts', () => { it('should not dump prompts settings and prompts custom text when prompts object is null', async () => { cleanThenMkdir(dir); - const context = new Context({ AUTH0_INPUT_FILE: dir }); + const context = new Context({ AUTH0_INPUT_FILE: dir } as Config, mockMgmtClient()); context.assets.prompts = null; promptsHandler.dump(context); @@ -483,7 +484,7 @@ describe('#directory context prompts', () => { it('should not dump prompts settings and prompts custom text when prompts object is undefined', async () => { cleanThenMkdir(dir); - const context = new Context({ AUTH0_INPUT_FILE: dir }); + const context = new Context({ AUTH0_INPUT_FILE: dir } as Config, mockMgmtClient()); promptsHandler.dump(context); const dumpedFiles = getFiles(promptsDirectory, ['.json']); @@ -494,7 +495,7 @@ describe('#directory context prompts', () => { it('should dump prompts settings, prompts custom text when API responses are empty and screen renderers', async () => { cleanThenMkdir(dir); - const context = new Context({ AUTH0_INPUT_FILE: dir }); + const context = new Context({ AUTH0_INPUT_FILE: dir } as Config, mockMgmtClient()); context.assets.prompts = { universal_login_experience: 'classic', diff --git a/test/context/directory/rules.test.js b/test/context/directory/rules.test.js index 1560446c3..7d1b14907 100644 --- a/test/context/directory/rules.test.js +++ b/test/context/directory/rules.test.js @@ -57,7 +57,7 @@ describe('#directory context rules', () => { const dir = path.join(repoDir, constants.RULES_DIRECTORY); fs.writeFileSync(dir, 'junk'); - const context = new Context({ AUTH0_INPUT_FILE: repoDir }); + const context = new Context({ AUTH0_INPUT_FILE: repoDir }, mockMgmtClient()); const errorMessage = `Expected ${dir} to be a folder but got a file?`; await expect(context.loadAssetsFromLocal()) .to.be.eventually.rejectedWith(Error) diff --git a/test/context/directory/tokenExchangeProfiles.test.ts b/test/context/directory/tokenExchangeProfiles.test.ts new file mode 100644 index 000000000..aeb6e0f12 --- /dev/null +++ b/test/context/directory/tokenExchangeProfiles.test.ts @@ -0,0 +1,148 @@ +import path from 'path'; +import { expect } from 'chai'; +import fs from 'fs-extra'; +import { ManagementClient } from 'auth0'; + +import Context from '../../../src/context/directory'; +import handler from '../../../src/context/directory/handlers/tokenExchangeProfiles'; +import { constants } from '../../../src/tools'; +import { cleanThenMkdir, mockMgmtClient, testDataDir } from '../../utils'; +import { Config } from '../../../src/types'; + +describe('#directory context tokenExchangeProfiles', () => { + it('should process tokenExchangeProfiles', async () => { + const dir = path.join(testDataDir, 'directory', 'tokenExchangeProfiles-process'); + cleanThenMkdir(dir); + const tokenExchangeProfilesDir = path.join(dir, constants.TOKEN_EXCHANGE_PROFILES_DIRECTORY); + cleanThenMkdir(tokenExchangeProfilesDir); + + const profile1 = { + name: 'CIS token exchange', + subject_token_type: 'https://acme.com/cis-token', + action: 'my-action', + type: 'custom_authentication', + }; + + const profile2 = { + name: 'Partner token exchange', + subject_token_type: 'https://partner.com/auth-token', + action: 'partner-action', + type: 'custom_authentication', + }; + + fs.writeFileSync( + path.join(tokenExchangeProfilesDir, 'CIS token exchange.json'), + JSON.stringify(profile1, null, 2) + ); + fs.writeFileSync( + path.join(tokenExchangeProfilesDir, 'Partner token exchange.json'), + JSON.stringify(profile2, null, 2) + ); + + const config = { AUTH0_INPUT_FILE: dir } as Config; + const context = new Context(config, mockMgmtClient() as unknown as ManagementClient); + await context.loadAssetsFromLocal(); + + expect(context.assets.tokenExchangeProfiles).to.be.an('array'); + expect(context.assets.tokenExchangeProfiles).to.have.lengthOf(2); + expect(context.assets.tokenExchangeProfiles).to.deep.include(profile1); + expect(context.assets.tokenExchangeProfiles).to.deep.include(profile2); + }); + + it('should process empty tokenExchangeProfiles directory', async () => { + const dir = path.join(testDataDir, 'directory', 'tokenExchangeProfiles-empty'); + cleanThenMkdir(dir); + const tokenExchangeProfilesDir = path.join(dir, constants.TOKEN_EXCHANGE_PROFILES_DIRECTORY); + cleanThenMkdir(tokenExchangeProfilesDir); + + const config = { AUTH0_INPUT_FILE: dir } as Config; + const context = new Context(config, mockMgmtClient() as unknown as ManagementClient); + await context.loadAssetsFromLocal(); + + expect(context.assets.tokenExchangeProfiles).to.be.an('array'); + expect(context.assets.tokenExchangeProfiles).to.have.lengthOf(0); + }); + + it('should skip if tokenExchangeProfiles directory does not exist', async () => { + const dir = path.join(testDataDir, 'directory', 'tokenExchangeProfiles-nonexistent'); + cleanThenMkdir(dir); + + const config = { AUTH0_INPUT_FILE: dir } as Config; + const context = new Context(config, mockMgmtClient() as unknown as ManagementClient); + await context.loadAssetsFromLocal(); + + expect(context.assets.tokenExchangeProfiles).to.equal(null); + }); + + it('should dump tokenExchangeProfiles', async () => { + const repoDir = path.join(testDataDir, 'directory', 'tokenExchangeProfiles-dump'); + cleanThenMkdir(repoDir); + const context = new Context( + { AUTH0_INPUT_FILE: repoDir } as Config, + mockMgmtClient() as unknown as ManagementClient + ); + + const tokenExchangeProfiles: any[] = [ + { + id: 'tep_123', + name: 'CIS token exchange', + subject_token_type: 'https://acme.com/cis-token', + action: 'my-action', + type: 'custom_authentication', + created_at: '2024-10-01T16:09:42.725Z', + updated_at: '2024-10-01T16:09:42.725Z', + }, + { + id: 'tep_456', + name: 'Partner token exchange', + subject_token_type: 'https://partner.com/auth-token', + action: 'partner-action', + type: 'custom_authentication', + created_at: '2024-10-02T10:15:30.123Z', + updated_at: '2024-10-02T10:15:30.123Z', + }, + ]; + + context.assets.tokenExchangeProfiles = tokenExchangeProfiles; + + handler.dump(context); + + const tokenExchangeProfilesDir = path.join( + repoDir, + constants.TOKEN_EXCHANGE_PROFILES_DIRECTORY + ); + + // Check that the files were created with sanitized names + const cisFile = path.join(tokenExchangeProfilesDir, 'CIS token exchange.json'); + const partnerFile = path.join(tokenExchangeProfilesDir, 'Partner token exchange.json'); + + // Ensure the directory exists before checking files + expect(fs.existsSync(tokenExchangeProfilesDir)).to.equal(true); + + expect(fs.existsSync(cisFile)).to.equal(true); + expect(fs.existsSync(partnerFile)).to.equal(true); + + // Check file contents + const cisContent = JSON.parse(fs.readFileSync(cisFile, 'utf8')); + const partnerContent = JSON.parse(fs.readFileSync(partnerFile, 'utf8')); + + // Verify id, created_at and updated_at were removed + expect(cisContent).to.not.have.property('id'); + expect(cisContent).to.not.have.property('created_at'); + expect(cisContent).to.not.have.property('updated_at'); + expect(partnerContent).to.not.have.property('id'); + expect(partnerContent).to.not.have.property('created_at'); + expect(partnerContent).to.not.have.property('updated_at'); + + // Verify other properties were preserved + expect(cisContent.name).to.equal('CIS token exchange'); + expect(cisContent.subject_token_type).to.equal('https://acme.com/cis-token'); + expect(cisContent.action).to.equal('my-action'); + expect(cisContent.type).to.equal('custom_authentication'); + + expect(partnerContent.name).to.equal('Partner token exchange'); + expect(partnerContent.subject_token_type).to.equal('https://partner.com/auth-token'); + expect(partnerContent.action).to.equal('partner-action'); + expect(partnerContent.type).to.equal('custom_authentication'); + }); +}); diff --git a/test/context/directory/triggers.test.js b/test/context/directory/triggers.test.js index a75816709..69c383714 100644 --- a/test/context/directory/triggers.test.js +++ b/test/context/directory/triggers.test.js @@ -56,7 +56,7 @@ describe('#directory context triggers', () => { const dir = path.join(repoDir, constants.TRIGGERS_DIRECTORY); fs.writeFileSync(dir, 'junk'); - const context = new Context({ AUTH0_INPUT_FILE: repoDir }); + const context = new Context({ AUTH0_INPUT_FILE: repoDir }, mockMgmtClient()); const errorMessage = `Expected ${dir} to be a folder but got a file?`; await expect(context.loadAssetsFromLocal()) .to.be.eventually.rejectedWith(Error) diff --git a/test/context/yaml/clientGrants.test.js b/test/context/yaml/clientGrants.test.js index 90f5ebbb1..890d8198a 100644 --- a/test/context/yaml/clientGrants.test.js +++ b/test/context/yaml/clientGrants.test.js @@ -76,7 +76,7 @@ describe('#YAML context client grants', () => { it('should dump client grants and replace client ID with client name even if clients not in assets', async () => { const mockMgmt = mockMgmtClient(); - mockMgmt.clients.getAll = (params) => { + mockMgmt.clients.list = (params) => { const client = { client_id: 'client-id-1', name: 'Client 1', diff --git a/test/context/yaml/clients.test.js b/test/context/yaml/clients.test.js index 9622e5c63..b42ec82fa 100644 --- a/test/context/yaml/clients.test.js +++ b/test/context/yaml/clients.test.js @@ -262,4 +262,46 @@ describe('#YAML context clients', () => { organization_require_behavior: 'no_prompt', }); }); + + it('should process clients with token_exchange', async () => { + const dir = path.join(testDataDir, 'yaml', 'clientsWithTokenExchange'); + cleanThenMkdir(dir); + + const yaml = ` + clients: + - + name: "tokenExchangeClient" + app_type: "spa" + token_exchange: + allow_any_profile_of_type: ['custom_authentication'] + - + name: "regularClient" + app_type: "native" + `; + + const target = [ + { + name: 'tokenExchangeClient', + app_type: 'spa', + token_exchange: { + allow_any_profile_of_type: ['custom_authentication'], + }, + }, + { + name: 'regularClient', + app_type: 'native', + }, + ]; + + const yamlFile = path.join(dir, 'clients.yaml'); + fs.writeFileSync(yamlFile, yaml); + + const config = { + AUTH0_INPUT_FILE: yamlFile, + }; + const context = new Context(config, mockMgmtClient()); + await context.loadAssetsFromLocal(); + + expect(context.assets.clients).to.deep.equal(target); + }); }); diff --git a/test/context/yaml/context.test.js b/test/context/yaml/context.test.js index 8fee4b39b..e98f07a59 100644 --- a/test/context/yaml/context.test.js +++ b/test/context/yaml/context.test.js @@ -275,7 +275,7 @@ describe('#YAML context validation', () => { rules: [], hooks: [], actions: [], - triggers: [], + triggers: {}, rulesConfigs: [], roles: [ { @@ -312,7 +312,9 @@ describe('#YAML context validation', () => { flows: [], forms: [], selfServiceProfiles: [], + tokenExchangeProfiles: [], userAttributeProfiles: [], + phoneTemplates: [], }); }); @@ -405,7 +407,7 @@ describe('#YAML context validation', () => { rules: [], hooks: [], actions: [], - triggers: [], + triggers: {}, rulesConfigs: [], roles: [ { @@ -442,7 +444,9 @@ describe('#YAML context validation', () => { flows: [], forms: [], selfServiceProfiles: [], + tokenExchangeProfiles: [], userAttributeProfiles: [], + phoneTemplates: [], }); }); @@ -536,7 +540,7 @@ describe('#YAML context validation', () => { rules: [], hooks: [], actions: [], - triggers: [], + triggers: {}, rulesConfigs: [], roles: [ { @@ -573,7 +577,9 @@ describe('#YAML context validation', () => { flows: [], forms: [], selfServiceProfiles: [], + tokenExchangeProfiles: [], userAttributeProfiles: [], + phoneTemplates: [], }); }); @@ -633,18 +639,18 @@ describe('#YAML context validation', () => { }, { tenants: { - getSettings: async () => - new Promise((resolve) => { - resolve({ - data: { + settings: { + get: async () => + new Promise((resolve) => { + resolve({ friendly_name: 'Production Tenant', enabled_locales: ['en', 'es'], - }, - }); - }), + }); + }), + }, }, connections: { - getAll: (params) => + list: (params) => mockPagedData(params, 'connections', [ { name: 'connection-1', diff --git a/test/context/yaml/phoneTemplates.test.ts b/test/context/yaml/phoneTemplates.test.ts new file mode 100644 index 000000000..791efbdd2 --- /dev/null +++ b/test/context/yaml/phoneTemplates.test.ts @@ -0,0 +1,239 @@ +import path from 'path'; +import fs from 'fs-extra'; +import jsYaml from 'js-yaml'; +import { expect } from 'chai'; + +import Context from '../../../src/context/yaml'; +import handler from '../../../src/context/yaml/handlers/phoneTemplates'; +import { cleanThenMkdir, testDataDir, mockMgmtClient } from '../../utils'; + +describe('#YAML context phone templates', () => { + it('should process phone templates', async () => { + const dir = path.join(testDataDir, 'yaml', 'phoneTemplates'); + cleanThenMkdir(dir); + + const yaml = ` +phoneTemplates: + - type: otp_verify + disabled: false + content: + from: '+15551234567' + body: + text: '##OTP_VERIFICATION_TEXT## {{ code }}' + voice: '##OTP_VERIFICATION_TEXT## {{ code }}' + - type: otp_enroll + disabled: false + content: + from: '+15551234567' + body: + text: '##OTP_ENROLL_TEXT## {{ code }}' +`; + const yamlFile = path.join(dir, 'config.yaml'); + fs.writeFileSync(yamlFile, yaml); + + const target = [ + { + type: 'otp_verify', + disabled: false, + content: { + from: '+15551234567', + body: { + text: '##OTP_VERIFICATION_TEXT## {{ code }}', + voice: '##OTP_VERIFICATION_TEXT## {{ code }}', + }, + }, + }, + { + type: 'otp_enroll', + disabled: false, + content: { + from: '+15551234567', + body: { + text: '##OTP_ENROLL_TEXT## {{ code }}', + }, + }, + }, + ]; + + const config = { AUTH0_INPUT_FILE: yamlFile, AUTH0_KEYWORD_REPLACE_MAPPINGS: { ENV: 'test' } }; + const context = new Context(config, mockMgmtClient()); + await context.loadAssetsFromLocal(); + expect(context.assets.phoneTemplates).to.deep.equal(target); + }); + + it('should dump phone templates', async () => { + const context = new Context({ AUTH0_INPUT_FILE: './test.yml' }, mockMgmtClient()); + context.assets.phoneTemplates = [ + { + id: 'pntm_1234567890', + type: 'otp_verify', + disabled: false, + channel: 'sms', + customizable: true, + tenant: 'test-tenant', + content: { + syntax: 'liquid', + from: '+15551234567', + body: { + text: '##OTP_VERIFICATION_TEXT## {{ code }}', + voice: '##OTP_VERIFICATION_TEXT## {{ code }}', + }, + }, + }, + { + id: 'pntm_0987654321', + type: 'otp_enroll', + disabled: false, + channel: 'sms', + customizable: true, + tenant: 'test-tenant', + content: { + syntax: 'liquid', + from: '+15551234567', + body: { + text: '##OTP_ENROLL_TEXT## {{ code }}', + }, + }, + }, + ]; + + const dumped = await handler.dump(context); + + // Should have read-only fields stripped + expect(dumped).to.deep.equal({ + phoneTemplates: [ + { + type: 'otp_verify', + disabled: false, + content: { + syntax: 'liquid', + from: '+15551234567', + body: { + text: '##OTP_VERIFICATION_TEXT## {{ code }}', + voice: '##OTP_VERIFICATION_TEXT## {{ code }}', + }, + }, + }, + { + type: 'otp_enroll', + disabled: false, + content: { + syntax: 'liquid', + from: '+15551234567', + body: { + text: '##OTP_ENROLL_TEXT## {{ code }}', + }, + }, + }, + ], + }); + + // Verify read-only fields are stripped + dumped.phoneTemplates.forEach((template) => { + expect(template).to.not.have.property('id'); + expect(template).to.not.have.property('channel'); + expect(template).to.not.have.property('customizable'); + expect(template).to.not.have.property('tenant'); + }); + }); + + it('should return null when phoneTemplates is not defined', async () => { + const dir = path.join(testDataDir, 'yaml', 'phoneTemplatesEmpty'); + cleanThenMkdir(dir); + + const yaml = ` +clients: [] +`; + const yamlFile = path.join(dir, 'config.yaml'); + fs.writeFileSync(yamlFile, yaml); + + const config = { AUTH0_INPUT_FILE: yamlFile }; + const context = new Context(config, mockMgmtClient()); + await context.loadAssetsFromLocal(); + expect(context.assets.phoneTemplates).to.equal(null); + }); + + it('should return null when dumping null phoneTemplates', async () => { + const context = new Context({ AUTH0_INPUT_FILE: './test.yml' }, mockMgmtClient()); + context.assets.phoneTemplates = null; + + const dumped = await handler.dump(context); + expect(dumped).to.deep.equal({ phoneTemplates: null }); + }); + + it('should preserve keyword markers when dumping with AUTH0_PRESERVE_KEYWORDS', async () => { + const dir = path.join(testDataDir, 'yaml', 'phoneTemplatesPreserve'); + cleanThenMkdir(dir); + + const yamlFile = path.join(dir, 'config.yaml'); + const localYaml = ` +phoneTemplates: + - type: otp_verify + disabled: false + content: + from: '##FROM_NUMBER##' + body: + text: '##OTP_VERIFICATION_TEXT## {{ code }}' + voice: '##OTP_VERIFICATION_TEXT## {{ code }}' +`; + fs.writeFileSync(yamlFile, localYaml); + + const remoteTemplates = [ + { + id: 'pntm_otp_verify', + type: 'otp_verify', + disabled: false, + content: { + syntax: 'liquid', + from: '+15551230000', + body: { + text: 'Your verification code is {{ code }}', + voice: 'Your verification code is {{ code }}', + }, + }, + }, + ]; + + const context = new Context( + { + AUTH0_INPUT_FILE: yamlFile, + AUTH0_PRESERVE_KEYWORDS: true, + AUTH0_INCLUDED_ONLY: ['phoneTemplates'], + AUTH0_KEYWORD_REPLACE_MAPPINGS: { + FROM_NUMBER: '+15551230000', + OTP_VERIFICATION_TEXT: 'Your verification code is', + }, + } as any, + { + branding: { + phone: { + templates: { + list: () => Promise.resolve({ templates: remoteTemplates }) as any, + }, + }, + }, + } as any + ); + + await context.dump(); + + const dumpedYaml = jsYaml.load(fs.readFileSync(yamlFile, 'utf8')); + + expect(dumpedYaml).to.deep.equal({ + phoneTemplates: [ + { + type: 'otp_verify', + disabled: false, + content: { + syntax: 'liquid', + from: '##FROM_NUMBER##', + body: { + text: '##OTP_VERIFICATION_TEXT## {{ code }}', + voice: '##OTP_VERIFICATION_TEXT## {{ code }}', + }, + }, + }, + ], + }); + }); +}); diff --git a/test/context/yaml/resourceServers.test.js b/test/context/yaml/resourceServers.test.js index 70a4144a4..d8f177636 100644 --- a/test/context/yaml/resourceServers.test.js +++ b/test/context/yaml/resourceServers.test.js @@ -72,15 +72,15 @@ describe('#YAML context resource servers', () => { it('should dump resource servers with client_id conversion', async () => { const mockClient = mockMgmtClient(); mockClient.clients = { - getAll: (params) => { + list: (params) => { const clients = [ { client_id: 'client_123', name: 'Test Client' }, { client_id: 'client_456', name: 'Another Client' }, ]; if (params && params.include_totals) { - return { data: { clients, total: clients.length } }; + return { data: clients, response: { total: clients.length } }; } - return { data: clients }; + return clients; }, }; diff --git a/test/context/yaml/tokenExchangeProfiles.test.ts b/test/context/yaml/tokenExchangeProfiles.test.ts new file mode 100644 index 000000000..a59876529 --- /dev/null +++ b/test/context/yaml/tokenExchangeProfiles.test.ts @@ -0,0 +1,142 @@ +import path from 'path'; +import fs from 'fs-extra'; +import { expect } from 'chai'; +import { cloneDeep } from 'lodash'; +import { ManagementClient } from 'auth0'; + +import Context from '../../../src/context/yaml'; +import handler from '../../../src/context/yaml/handlers/tokenExchangeProfiles'; +import { cleanThenMkdir, testDataDir, mockMgmtClient } from '../../utils'; +import { Config } from '../../../src/types'; + +describe('#YAML context tokenExchangeProfiles', () => { + it('should process tokenExchangeProfiles', async () => { + const dir = path.join(testDataDir, 'yaml', 'tokenExchangeProfiles'); + cleanThenMkdir(dir); + + const yaml = ` + tokenExchangeProfiles: + - + name: 'CIS token exchange' + subject_token_type: 'https://acme.com/cis-token' + action: 'my-action' + type: 'custom_authentication' + - + name: 'Partner token exchange' + subject_token_type: 'https://partner.com/auth-token' + action: 'partner-action' + type: 'custom_authentication' + - + name: 'External token exchange' + subject_token_type: 'https://external.com/token' + action: 'external-action' + type: 'custom_authentication' + `; + + const target = [ + { + name: 'CIS token exchange', + subject_token_type: 'https://acme.com/cis-token', + action: 'my-action', + type: 'custom_authentication', + }, + { + name: 'Partner token exchange', + subject_token_type: 'https://partner.com/auth-token', + action: 'partner-action', + type: 'custom_authentication', + }, + { + name: 'External token exchange', + subject_token_type: 'https://external.com/token', + action: 'external-action', + type: 'custom_authentication', + }, + ]; + + const yamlFile = path.join(dir, 'tokenExchangeProfiles.yaml'); + fs.writeFileSync(yamlFile, yaml); + + const config = { AUTH0_INPUT_FILE: yamlFile } as Config; + const context = new Context(config, mockMgmtClient() as unknown as ManagementClient); + await context.loadAssetsFromLocal(); + expect(context.assets.tokenExchangeProfiles).to.deep.equal(target); + }); + + it('should return null when tokenExchangeProfiles is not in YAML', async () => { + const dir = path.join(testDataDir, 'yaml', 'tokenExchangeProfiles-no-section'); + cleanThenMkdir(dir); + + const yaml = ` + clients: + - name: 'Test Client' + `; + + const yamlFile = path.join(dir, 'config.yaml'); + fs.writeFileSync(yamlFile, yaml); + + const config = { AUTH0_INPUT_FILE: yamlFile } as Config; + const context = new Context(config, mockMgmtClient() as unknown as ManagementClient); + await context.loadAssetsFromLocal(); + + expect(context.assets.tokenExchangeProfiles).to.equal(null); + }); + + it('should dump tokenExchangeProfiles', async () => { + const dir = path.join(testDataDir, 'yaml', 'tokenExchangeProfiles'); + cleanThenMkdir(dir); + const context = new Context( + { AUTH0_INPUT_FILE: path.join(dir, './tokenExchangeProfiles.yml') } as Config, + mockMgmtClient() as unknown as ManagementClient + ); + + // Using any type to avoid TypeScript errors with the test data + const tokenExchangeProfiles: any[] = [ + { + id: 'tep_123', + name: 'CIS token exchange', + subject_token_type: 'https://acme.com/cis-token', + action: 'my-action', + type: 'custom_authentication', + created_at: '2024-10-01T16:09:42.725Z', + updated_at: '2024-10-01T16:09:42.725Z', + }, + { + id: 'tep_456', + name: 'Partner token exchange', + subject_token_type: 'https://partner.com/auth-token', + action: 'partner-action', + type: 'custom_authentication', + created_at: '2024-10-02T10:15:30.123Z', + updated_at: '2024-10-02T10:15:30.123Z', + }, + ]; + + context.assets.tokenExchangeProfiles = cloneDeep(tokenExchangeProfiles); + + const dumped = await handler.dump(context); + + // Create a copy without the fields that should be stripped during dump + const expectedTokenExchangeProfiles = cloneDeep(tokenExchangeProfiles).map((profile) => { + const { id, created_at: createdAt, updated_at: updatedAt, ...rest } = profile; + return rest; + }); + + expect(dumped).to.deep.equal({ tokenExchangeProfiles: expectedTokenExchangeProfiles }); + }); + + it('should handle null tokenExchangeProfiles', async () => { + const dir = path.join(testDataDir, 'yaml', 'tokenExchangeProfiles-null'); + cleanThenMkdir(dir); + const context = new Context( + { AUTH0_INPUT_FILE: path.join(dir, './tokenExchangeProfiles.yml') } as Config, + mockMgmtClient() as unknown as ManagementClient + ); + + context.assets.tokenExchangeProfiles = null as any; + + const dumped = await handler.dump(context); + + expect(dumped).to.deep.equal({ tokenExchangeProfiles: null }); + }); +}); diff --git a/test/e2e/recordings/should-deploy-while-deleting-resources-if-AUTH0_ALLOW_DELETE-is-true.json b/test/e2e/recordings/should-deploy-while-deleting-resources-if-AUTH0_ALLOW_DELETE-is-true.json index af262a60f..a94fb378a 100644 --- a/test/e2e/recordings/should-deploy-while-deleting-resources-if-AUTH0_ALLOW_DELETE-is-true.json +++ b/test/e2e/recordings/should-deploy-while-deleting-resources-if-AUTH0_ALLOW_DELETE-is-true.json @@ -1170,6 +1170,22 @@ "value": "delete:organization_client_grants", "description": "Delete Organization Client Grants" }, + { + "value": "create:token_exchange_profiles", + "description": "Create Token Exchange Profile" + }, + { + "value": "read:token_exchange_profiles", + "description": "Read Token Exchange Profiles" + }, + { + "value": "update:token_exchange_profiles", + "description": "Update Token Exchange Profile" + }, + { + "value": "delete:token_exchange_profiles", + "description": "Delete Token Exchange Profile" + }, { "value": "read:security_metrics", "description": "Read Security Metrics" @@ -1287,7 +1303,7 @@ "subject": "deprecated" } ], - "client_id": "cLFFGtjp2Xe7HWQCHfCtQxmURfSu1lDH", + "client_id": "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -1340,7 +1356,7 @@ "subject": "deprecated" } ], - "client_id": "uf1Ju9xwQ09AWpcnRnwD91W3Sv3bf76S", + "client_id": "0ltKN06qv5WnNoNz2Fu6QvyOl2o6K6nE", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -1385,7 +1401,7 @@ "subject": "deprecated" } ], - "client_id": "WYPQxuqDdeNZHLcJeuPq0AvuNFtMiUgU", + "client_id": "HC5UXDFP5lEc2vbTkPQWJ1yYeiLRkmDg", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -1439,7 +1455,7 @@ } ], "allowed_origins": [], - "client_id": "QwKFSZ87TYF89lXp66sVFpGzYGQ07OU6", + "client_id": "KjqnjAT6PWajvX3XKVkWhFVaW8sFBWyv", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -1485,7 +1501,7 @@ "subject": "deprecated" } ], - "client_id": "VvKPDeB2QHhtG4tVBNcrRUuChB0jWefu", + "client_id": "GH55Wtak9aTrj6tjRFObq1cqnu5a8mtM", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -1504,14 +1520,9 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "Test SPA", + "name": "The Default App", "allowed_clients": [], - "allowed_logout_urls": [ - "http://localhost:3000" - ], - "callbacks": [ - "http://localhost:3000" - ], + "callbacks": [], "client_metadata": {}, "is_first_party": true, "native_social_login": { @@ -1522,16 +1533,17 @@ "enabled": false } }, - "oidc_conformant": true, + "oidc_conformant": false, "refresh_token": { - "expiration_type": "expiring", + "expiration_type": "non-expiring", "leeway": 0, + "infinite_token_lifetime": true, + "infinite_idle_token_lifetime": true, "token_lifetime": 2592000, "idle_token_lifetime": 1296000, - "infinite_token_lifetime": false, - "infinite_idle_token_lifetime": false, - "rotation_type": "rotating" + "rotation_type": "non-rotating" }, + "sso": false, "sso_disabled": false, "cross_origin_authentication": false, "cross_origin_auth": false, @@ -1542,7 +1554,7 @@ "subject": "deprecated" } ], - "client_id": "xODbqyam7rjqHDsYKjU9Tuo99yaBnR5T", + "client_id": "ahrUt7DkBom8m2EAs0zLSccaylYIuVfF", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -1551,15 +1563,12 @@ "secret_encoded": false }, "client_aliases": [], - "token_endpoint_auth_method": "none", - "app_type": "spa", + "token_endpoint_auth_method": "client_secret_post", "grant_types": [ "authorization_code", "implicit", - "refresh_token" - ], - "web_origins": [ - "http://localhost:3000" + "refresh_token", + "client_credentials" ], "custom_login_page_on": true }, @@ -1567,9 +1576,14 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "auth0-deploy-cli-extension", + "name": "Test SPA", "allowed_clients": [], - "callbacks": [], + "allowed_logout_urls": [ + "http://localhost:3000" + ], + "callbacks": [ + "http://localhost:3000" + ], "client_metadata": {}, "is_first_party": true, "native_social_login": { @@ -1582,13 +1596,13 @@ }, "oidc_conformant": true, "refresh_token": { - "expiration_type": "non-expiring", + "expiration_type": "expiring", "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" + "token_lifetime": 2592000, + "idle_token_lifetime": 1296000, + "infinite_token_lifetime": false, + "infinite_idle_token_lifetime": false, + "rotation_type": "rotating" }, "sso_disabled": false, "cross_origin_authentication": false, @@ -1600,7 +1614,7 @@ "subject": "deprecated" } ], - "client_id": "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1", + "client_id": "68Ty4a89yPogS0UGdX8aYaS6td9DXYjs", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -1609,10 +1623,15 @@ "secret_encoded": false }, "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", + "token_endpoint_auth_method": "none", + "app_type": "spa", "grant_types": [ - "client_credentials" + "authorization_code", + "implicit", + "refresh_token" + ], + "web_origins": [ + "http://localhost:3000" ], "custom_login_page_on": true }, @@ -1620,7 +1639,7 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "The Default App", + "name": "auth0-deploy-cli-extension", "allowed_clients": [], "callbacks": [], "client_metadata": {}, @@ -1633,17 +1652,16 @@ "enabled": false } }, - "oidc_conformant": false, + "oidc_conformant": true, "refresh_token": { "expiration_type": "non-expiring", "leeway": 0, "infinite_token_lifetime": true, "infinite_idle_token_lifetime": true, - "token_lifetime": 2592000, - "idle_token_lifetime": 1296000, + "token_lifetime": 31557600, + "idle_token_lifetime": 2592000, "rotation_type": "non-rotating" }, - "sso": false, "sso_disabled": false, "cross_origin_authentication": false, "cross_origin_auth": false, @@ -1654,7 +1672,7 @@ "subject": "deprecated" } ], - "client_id": "xYOv2UsoAuKptIEAjkeB62Oaeg1Jn2QX", + "client_id": "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -1664,10 +1682,8 @@ }, "client_aliases": [], "token_endpoint_auth_method": "client_secret_post", + "app_type": "non_interactive", "grant_types": [ - "authorization_code", - "implicit", - "refresh_token", "client_credentials" ], "custom_login_page_on": true @@ -1680,7 +1696,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "DELETE", - "path": "/api/v2/clients/cLFFGtjp2Xe7HWQCHfCtQxmURfSu1lDH", + "path": "/api/v2/clients/lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V", "body": "", "status": 204, "response": "", @@ -1690,7 +1706,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PATCH", - "path": "/api/v2/clients/uf1Ju9xwQ09AWpcnRnwD91W3Sv3bf76S", + "path": "/api/v2/clients/0ltKN06qv5WnNoNz2Fu6QvyOl2o6K6nE", "body": { "name": "API Explorer Application", "allowed_clients": [], @@ -1768,7 +1784,7 @@ "subject": "/CN=auth0-deploy-cli-e2e.us.auth0.com" } ], - "client_id": "uf1Ju9xwQ09AWpcnRnwD91W3Sv3bf76S", + "client_id": "0ltKN06qv5WnNoNz2Fu6QvyOl2o6K6nE", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -1790,7 +1806,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PATCH", - "path": "/api/v2/clients/QwKFSZ87TYF89lXp66sVFpGzYGQ07OU6", + "path": "/api/v2/clients/KjqnjAT6PWajvX3XKVkWhFVaW8sFBWyv", "body": { "name": "Node App", "allowed_clients": [], @@ -1876,7 +1892,7 @@ } ], "allowed_origins": [], - "client_id": "QwKFSZ87TYF89lXp66sVFpGzYGQ07OU6", + "client_id": "KjqnjAT6PWajvX3XKVkWhFVaW8sFBWyv", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -1902,7 +1918,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PATCH", - "path": "/api/v2/clients/WYPQxuqDdeNZHLcJeuPq0AvuNFtMiUgU", + "path": "/api/v2/clients/HC5UXDFP5lEc2vbTkPQWJ1yYeiLRkmDg", "body": { "name": "Quickstarts API (Test Application)", "app_type": "non_interactive", @@ -1963,7 +1979,7 @@ "subject": "/CN=auth0-deploy-cli-e2e.us.auth0.com" } ], - "client_id": "WYPQxuqDdeNZHLcJeuPq0AvuNFtMiUgU", + "client_id": "HC5UXDFP5lEc2vbTkPQWJ1yYeiLRkmDg", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -1984,7 +2000,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PATCH", - "path": "/api/v2/clients/VvKPDeB2QHhtG4tVBNcrRUuChB0jWefu", + "path": "/api/v2/clients/GH55Wtak9aTrj6tjRFObq1cqnu5a8mtM", "body": { "name": "Terraform Provider", "app_type": "non_interactive", @@ -2039,7 +2055,7 @@ "subject": "/CN=auth0-deploy-cli-e2e.us.auth0.com" } ], - "client_id": "VvKPDeB2QHhtG4tVBNcrRUuChB0jWefu", + "client_id": "GH55Wtak9aTrj6tjRFObq1cqnu5a8mtM", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -2060,7 +2076,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PATCH", - "path": "/api/v2/clients/xYOv2UsoAuKptIEAjkeB62Oaeg1Jn2QX", + "path": "/api/v2/clients/ahrUt7DkBom8m2EAs0zLSccaylYIuVfF", "body": { "name": "The Default App", "allowed_clients": [], @@ -2142,7 +2158,7 @@ "subject": "/CN=auth0-deploy-cli-e2e.us.auth0.com" } ], - "client_id": "xYOv2UsoAuKptIEAjkeB62Oaeg1Jn2QX", + "client_id": "ahrUt7DkBom8m2EAs0zLSccaylYIuVfF", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -2166,17 +2182,24 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PATCH", - "path": "/api/v2/clients/gGel1LbswqDqdnqQ39oHycLldkhJZ8c1", + "path": "/api/v2/clients/68Ty4a89yPogS0UGdX8aYaS6td9DXYjs", "body": { - "name": "auth0-deploy-cli-extension", + "name": "Test SPA", "allowed_clients": [], - "app_type": "non_interactive", - "callbacks": [], + "allowed_logout_urls": [ + "http://localhost:3000" + ], + "app_type": "spa", + "callbacks": [ + "http://localhost:3000" + ], "client_aliases": [], "client_metadata": {}, "custom_login_page_on": true, "grant_types": [ - "client_credentials" + "authorization_code", + "implicit", + "refresh_token" ], "is_first_party": true, "is_token_endpoint_ip_header_trusted": false, @@ -2194,16 +2217,19 @@ }, "oidc_conformant": true, "refresh_token": { - "expiration_type": "non-expiring", + "expiration_type": "expiring", "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" + "token_lifetime": 2592000, + "idle_token_lifetime": 1296000, + "infinite_token_lifetime": false, + "infinite_idle_token_lifetime": false, + "rotation_type": "rotating" }, "sso_disabled": false, - "token_endpoint_auth_method": "client_secret_post", + "token_endpoint_auth_method": "none", + "web_origins": [ + "http://localhost:3000" + ], "cross_origin_authentication": false }, "status": 200, @@ -2211,9 +2237,14 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "auth0-deploy-cli-extension", + "name": "Test SPA", "allowed_clients": [], - "callbacks": [], + "allowed_logout_urls": [ + "http://localhost:3000" + ], + "callbacks": [ + "http://localhost:3000" + ], "client_metadata": {}, "is_first_party": true, "native_social_login": { @@ -2226,13 +2257,13 @@ }, "oidc_conformant": true, "refresh_token": { - "expiration_type": "non-expiring", + "expiration_type": "expiring", "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" + "token_lifetime": 2592000, + "idle_token_lifetime": 1296000, + "infinite_token_lifetime": false, + "infinite_idle_token_lifetime": false, + "rotation_type": "rotating" }, "sso_disabled": false, "cross_origin_authentication": false, @@ -2244,7 +2275,7 @@ "subject": "/CN=auth0-deploy-cli-e2e.us.auth0.com" } ], - "client_id": "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1", + "client_id": "68Ty4a89yPogS0UGdX8aYaS6td9DXYjs", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -2253,10 +2284,15 @@ "secret_encoded": false }, "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", + "token_endpoint_auth_method": "none", + "app_type": "spa", "grant_types": [ - "client_credentials" + "authorization_code", + "implicit", + "refresh_token" + ], + "web_origins": [ + "http://localhost:3000" ], "custom_login_page_on": true }, @@ -2266,24 +2302,17 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PATCH", - "path": "/api/v2/clients/xODbqyam7rjqHDsYKjU9Tuo99yaBnR5T", + "path": "/api/v2/clients/1TbnVO0y41cPrTLC7HvGKQswbGETjlOU", "body": { - "name": "Test SPA", + "name": "auth0-deploy-cli-extension", "allowed_clients": [], - "allowed_logout_urls": [ - "http://localhost:3000" - ], - "app_type": "spa", - "callbacks": [ - "http://localhost:3000" - ], + "app_type": "non_interactive", + "callbacks": [], "client_aliases": [], "client_metadata": {}, "custom_login_page_on": true, "grant_types": [ - "authorization_code", - "implicit", - "refresh_token" + "client_credentials" ], "is_first_party": true, "is_token_endpoint_ip_header_trusted": false, @@ -2301,19 +2330,16 @@ }, "oidc_conformant": true, "refresh_token": { - "expiration_type": "expiring", + "expiration_type": "non-expiring", "leeway": 0, - "token_lifetime": 2592000, - "idle_token_lifetime": 1296000, - "infinite_token_lifetime": false, - "infinite_idle_token_lifetime": false, - "rotation_type": "rotating" + "infinite_token_lifetime": true, + "infinite_idle_token_lifetime": true, + "token_lifetime": 31557600, + "idle_token_lifetime": 2592000, + "rotation_type": "non-rotating" }, "sso_disabled": false, - "token_endpoint_auth_method": "none", - "web_origins": [ - "http://localhost:3000" - ], + "token_endpoint_auth_method": "client_secret_post", "cross_origin_authentication": false }, "status": 200, @@ -2321,14 +2347,9 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "Test SPA", + "name": "auth0-deploy-cli-extension", "allowed_clients": [], - "allowed_logout_urls": [ - "http://localhost:3000" - ], - "callbacks": [ - "http://localhost:3000" - ], + "callbacks": [], "client_metadata": {}, "is_first_party": true, "native_social_login": { @@ -2341,13 +2362,13 @@ }, "oidc_conformant": true, "refresh_token": { - "expiration_type": "expiring", + "expiration_type": "non-expiring", "leeway": 0, - "token_lifetime": 2592000, - "idle_token_lifetime": 1296000, - "infinite_token_lifetime": false, - "infinite_idle_token_lifetime": false, - "rotation_type": "rotating" + "infinite_token_lifetime": true, + "infinite_idle_token_lifetime": true, + "token_lifetime": 31557600, + "idle_token_lifetime": 2592000, + "rotation_type": "non-rotating" }, "sso_disabled": false, "cross_origin_authentication": false, @@ -2359,7 +2380,7 @@ "subject": "/CN=auth0-deploy-cli-e2e.us.auth0.com" } ], - "client_id": "xODbqyam7rjqHDsYKjU9Tuo99yaBnR5T", + "client_id": "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -2368,15 +2389,10 @@ "secret_encoded": false }, "client_aliases": [], - "token_endpoint_auth_method": "none", - "app_type": "spa", + "token_endpoint_auth_method": "client_secret_post", + "app_type": "non_interactive", "grant_types": [ - "authorization_code", - "implicit", - "refresh_token" - ], - "web_origins": [ - "http://localhost:3000" + "client_credentials" ], "custom_login_page_on": true }, @@ -2386,7 +2402,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PUT", - "path": "/api/v2/guardian/factors/email", + "path": "/api/v2/guardian/factors/duo", "body": { "enabled": false }, @@ -2414,7 +2430,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PUT", - "path": "/api/v2/guardian/factors/duo", + "path": "/api/v2/guardian/factors/email", "body": { "enabled": false }, @@ -2428,13 +2444,13 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PUT", - "path": "/api/v2/guardian/factors/webauthn-platform", + "path": "/api/v2/guardian/factors/push-notification", "body": { - "enabled": false + "enabled": true }, "status": 200, "response": { - "enabled": false + "enabled": true }, "rawHeaders": [], "responseIsBinary": false @@ -2442,13 +2458,13 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PUT", - "path": "/api/v2/guardian/factors/push-notification", + "path": "/api/v2/guardian/factors/webauthn-roaming", "body": { - "enabled": true + "enabled": false }, "status": 200, "response": { - "enabled": true + "enabled": false }, "rawHeaders": [], "responseIsBinary": false @@ -2470,7 +2486,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PUT", - "path": "/api/v2/guardian/factors/webauthn-roaming", + "path": "/api/v2/guardian/factors/recovery-code", "body": { "enabled": false }, @@ -2484,7 +2500,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PUT", - "path": "/api/v2/guardian/factors/recovery-code", + "path": "/api/v2/guardian/factors/webauthn-platform", "body": { "enabled": false }, @@ -2562,7 +2578,54 @@ "response": { "actions": [ { - "id": "d67e0c5e-5be5-4ea1-8b75-29c65f79b7fe", + "id": "ead7d2a3-5a93-43e2-9ec3-455f3c39daf9", + "name": "Custom Phone Provider", + "supported_triggers": [ + { + "id": "custom-phone-provider", + "version": "v1" + } + ], + "created_at": "2025-12-16T10:10:30.752146844Z", + "updated_at": "2025-12-16T10:11:36.910288525Z", + "code": "/**\n* Handler to be executed while sending a phone notification\n* @param {Event} event - Details about the user and the context in which they are logging in.\n* @param {CustomPhoneProviderAPI} api - Methods and utilities to help change the behavior of sending a phone notification.\n*/\nexports.onExecuteCustomPhoneProvider = async (event, api) => {\n // Code goes here\n return;\n};", + "dependencies": [], + "runtime": "node22", + "status": "built", + "secrets": [], + "current_version": { + "id": "83a87aec-f6f7-42bb-b6ad-6fa170f652d1", + "code": "/**\n* Handler to be executed while sending a phone notification\n* @param {Event} event - Details about the user and the context in which they are logging in.\n* @param {CustomPhoneProviderAPI} api - Methods and utilities to help change the behavior of sending a phone notification.\n*/\nexports.onExecuteCustomPhoneProvider = async (event, api) => {\n // Code goes here\n return;\n};", + "runtime": "node22", + "status": "BUILT", + "number": 2, + "build_time": "2025-12-16T10:11:37.710742601Z", + "created_at": "2025-12-16T10:11:37.627490560Z", + "updated_at": "2025-12-16T10:11:37.712144713Z" + }, + "deployed_version": { + "code": "/**\n* Handler to be executed while sending a phone notification\n* @param {Event} event - Details about the user and the context in which they are logging in.\n* @param {CustomPhoneProviderAPI} api - Methods and utilities to help change the behavior of sending a phone notification.\n*/\nexports.onExecuteCustomPhoneProvider = async (event, api) => {\n // Code goes here\n return;\n};", + "dependencies": [], + "id": "83a87aec-f6f7-42bb-b6ad-6fa170f652d1", + "deployed": true, + "number": 2, + "built_at": "2025-12-16T10:11:37.710742601Z", + "secrets": [], + "status": "built", + "created_at": "2025-12-16T10:11:37.627490560Z", + "updated_at": "2025-12-16T10:11:37.712144713Z", + "runtime": "node22", + "supported_triggers": [ + { + "id": "custom-phone-provider", + "version": "v1" + } + ] + }, + "all_changes_deployed": true + }, + { + "id": "9cc78117-5697-42a8-9c1f-03bf8e5a3689", "name": "My Custom Action", "supported_triggers": [ { @@ -2570,34 +2633,34 @@ "version": "v2" } ], - "created_at": "2025-12-05T07:01:47.853050355Z", - "updated_at": "2025-12-05T07:01:47.866830407Z", + "created_at": "2025-12-16T10:12:49.378691946Z", + "updated_at": "2025-12-16T10:12:49.386633985Z", "code": "/**\n * Handler that will be called during the execution of a PostLogin flow.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\nexports.onExecutePostLogin = async (event, api) => {\n console.log('Some custom action!');\n};\n\n/**\n * Handler that will be invoked when this action is resuming after an external redirect. If your\n * onExecutePostLogin function does not perform a redirect, this function can be safely ignored.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\n// exports.onContinuePostLogin = async (event, api) => {\n// };\n", "dependencies": [], "runtime": "node18", "status": "built", "secrets": [], "current_version": { - "id": "5b00cfd8-995b-428f-a908-7b162477d1eb", + "id": "9f712c5b-390c-46d5-92f1-899d62f0e892", "code": "/**\n * Handler that will be called during the execution of a PostLogin flow.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\nexports.onExecutePostLogin = async (event, api) => {\n console.log('Some custom action!');\n};\n\n/**\n * Handler that will be invoked when this action is resuming after an external redirect. If your\n * onExecutePostLogin function does not perform a redirect, this function can be safely ignored.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\n// exports.onContinuePostLogin = async (event, api) => {\n// };\n", "runtime": "node18", "status": "BUILT", "number": 1, - "build_time": "2025-12-05T07:01:48.911433236Z", - "created_at": "2025-12-05T07:01:48.828404196Z", - "updated_at": "2025-12-05T07:01:48.912374903Z" + "build_time": "2025-12-16T10:12:50.304956456Z", + "created_at": "2025-12-16T10:12:50.209634926Z", + "updated_at": "2025-12-16T10:12:50.307080188Z" }, "deployed_version": { "code": "/**\n * Handler that will be called during the execution of a PostLogin flow.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\nexports.onExecutePostLogin = async (event, api) => {\n console.log('Some custom action!');\n};\n\n/**\n * Handler that will be invoked when this action is resuming after an external redirect. If your\n * onExecutePostLogin function does not perform a redirect, this function can be safely ignored.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\n// exports.onContinuePostLogin = async (event, api) => {\n// };\n", "dependencies": [], - "id": "5b00cfd8-995b-428f-a908-7b162477d1eb", + "id": "9f712c5b-390c-46d5-92f1-899d62f0e892", "deployed": true, "number": 1, - "built_at": "2025-12-05T07:01:48.911433236Z", + "built_at": "2025-12-16T10:12:50.304956456Z", "secrets": [], "status": "built", - "created_at": "2025-12-05T07:01:48.828404196Z", - "updated_at": "2025-12-05T07:01:48.912374903Z", + "created_at": "2025-12-16T10:12:50.209634926Z", + "updated_at": "2025-12-16T10:12:50.307080188Z", "runtime": "node18", "supported_triggers": [ { @@ -2609,16 +2672,26 @@ "all_changes_deployed": true } ], - "total": 1, + "total": 2, "per_page": 100 }, "rawHeaders": [], "responseIsBinary": false }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "DELETE", + "path": "/api/v2/actions/actions/ead7d2a3-5a93-43e2-9ec3-455f3c39daf9?force=true", + "body": "", + "status": 204, + "response": "", + "rawHeaders": [], + "responseIsBinary": false + }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PATCH", - "path": "/api/v2/actions/actions/d67e0c5e-5be5-4ea1-8b75-29c65f79b7fe", + "path": "/api/v2/actions/actions/9cc78117-5697-42a8-9c1f-03bf8e5a3689", "body": { "name": "My Custom Action", "code": "/**\n * Handler that will be called during the execution of a PostLogin flow.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\nexports.onExecutePostLogin = async (event, api) => {\n console.log('Some custom action!');\n};\n\n/**\n * Handler that will be invoked when this action is resuming after an external redirect. If your\n * onExecutePostLogin function does not perform a redirect, this function can be safely ignored.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\n// exports.onContinuePostLogin = async (event, api) => {\n// };\n", @@ -2634,7 +2707,7 @@ }, "status": 200, "response": { - "id": "d67e0c5e-5be5-4ea1-8b75-29c65f79b7fe", + "id": "9cc78117-5697-42a8-9c1f-03bf8e5a3689", "name": "My Custom Action", "supported_triggers": [ { @@ -2642,34 +2715,34 @@ "version": "v2" } ], - "created_at": "2025-12-05T07:01:47.853050355Z", - "updated_at": "2025-12-05T07:04:13.384306629Z", + "created_at": "2025-12-16T10:12:49.378691946Z", + "updated_at": "2025-12-16T10:14:50.956711889Z", "code": "/**\n * Handler that will be called during the execution of a PostLogin flow.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\nexports.onExecutePostLogin = async (event, api) => {\n console.log('Some custom action!');\n};\n\n/**\n * Handler that will be invoked when this action is resuming after an external redirect. If your\n * onExecutePostLogin function does not perform a redirect, this function can be safely ignored.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\n// exports.onContinuePostLogin = async (event, api) => {\n// };\n", "dependencies": [], "runtime": "node18", "status": "pending", "secrets": [], "current_version": { - "id": "5b00cfd8-995b-428f-a908-7b162477d1eb", + "id": "9f712c5b-390c-46d5-92f1-899d62f0e892", "code": "/**\n * Handler that will be called during the execution of a PostLogin flow.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\nexports.onExecutePostLogin = async (event, api) => {\n console.log('Some custom action!');\n};\n\n/**\n * Handler that will be invoked when this action is resuming after an external redirect. If your\n * onExecutePostLogin function does not perform a redirect, this function can be safely ignored.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\n// exports.onContinuePostLogin = async (event, api) => {\n// };\n", "runtime": "node18", "status": "BUILT", "number": 1, - "build_time": "2025-12-05T07:01:48.911433236Z", - "created_at": "2025-12-05T07:01:48.828404196Z", - "updated_at": "2025-12-05T07:01:48.912374903Z" + "build_time": "2025-12-16T10:12:50.304956456Z", + "created_at": "2025-12-16T10:12:50.209634926Z", + "updated_at": "2025-12-16T10:12:50.307080188Z" }, "deployed_version": { "code": "/**\n * Handler that will be called during the execution of a PostLogin flow.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\nexports.onExecutePostLogin = async (event, api) => {\n console.log('Some custom action!');\n};\n\n/**\n * Handler that will be invoked when this action is resuming after an external redirect. If your\n * onExecutePostLogin function does not perform a redirect, this function can be safely ignored.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\n// exports.onContinuePostLogin = async (event, api) => {\n// };\n", "dependencies": [], - "id": "5b00cfd8-995b-428f-a908-7b162477d1eb", + "id": "9f712c5b-390c-46d5-92f1-899d62f0e892", "deployed": true, "number": 1, - "built_at": "2025-12-05T07:01:48.911433236Z", + "built_at": "2025-12-16T10:12:50.304956456Z", "secrets": [], "status": "built", - "created_at": "2025-12-05T07:01:48.828404196Z", - "updated_at": "2025-12-05T07:01:48.912374903Z", + "created_at": "2025-12-16T10:12:50.209634926Z", + "updated_at": "2025-12-16T10:12:50.307080188Z", "runtime": "node18", "supported_triggers": [ { @@ -2692,7 +2765,7 @@ "response": { "actions": [ { - "id": "d67e0c5e-5be5-4ea1-8b75-29c65f79b7fe", + "id": "9cc78117-5697-42a8-9c1f-03bf8e5a3689", "name": "My Custom Action", "supported_triggers": [ { @@ -2700,34 +2773,34 @@ "version": "v2" } ], - "created_at": "2025-12-05T07:01:47.853050355Z", - "updated_at": "2025-12-05T07:04:13.384306629Z", + "created_at": "2025-12-16T10:12:49.378691946Z", + "updated_at": "2025-12-16T10:14:50.956711889Z", "code": "/**\n * Handler that will be called during the execution of a PostLogin flow.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\nexports.onExecutePostLogin = async (event, api) => {\n console.log('Some custom action!');\n};\n\n/**\n * Handler that will be invoked when this action is resuming after an external redirect. If your\n * onExecutePostLogin function does not perform a redirect, this function can be safely ignored.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\n// exports.onContinuePostLogin = async (event, api) => {\n// };\n", "dependencies": [], "runtime": "node18", "status": "built", "secrets": [], "current_version": { - "id": "5b00cfd8-995b-428f-a908-7b162477d1eb", + "id": "9f712c5b-390c-46d5-92f1-899d62f0e892", "code": "/**\n * Handler that will be called during the execution of a PostLogin flow.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\nexports.onExecutePostLogin = async (event, api) => {\n console.log('Some custom action!');\n};\n\n/**\n * Handler that will be invoked when this action is resuming after an external redirect. If your\n * onExecutePostLogin function does not perform a redirect, this function can be safely ignored.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\n// exports.onContinuePostLogin = async (event, api) => {\n// };\n", "runtime": "node18", "status": "BUILT", "number": 1, - "build_time": "2025-12-05T07:01:48.911433236Z", - "created_at": "2025-12-05T07:01:48.828404196Z", - "updated_at": "2025-12-05T07:01:48.912374903Z" + "build_time": "2025-12-16T10:12:50.304956456Z", + "created_at": "2025-12-16T10:12:50.209634926Z", + "updated_at": "2025-12-16T10:12:50.307080188Z" }, "deployed_version": { "code": "/**\n * Handler that will be called during the execution of a PostLogin flow.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\nexports.onExecutePostLogin = async (event, api) => {\n console.log('Some custom action!');\n};\n\n/**\n * Handler that will be invoked when this action is resuming after an external redirect. If your\n * onExecutePostLogin function does not perform a redirect, this function can be safely ignored.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\n// exports.onContinuePostLogin = async (event, api) => {\n// };\n", "dependencies": [], - "id": "5b00cfd8-995b-428f-a908-7b162477d1eb", + "id": "9f712c5b-390c-46d5-92f1-899d62f0e892", "deployed": true, "number": 1, - "built_at": "2025-12-05T07:01:48.911433236Z", + "built_at": "2025-12-16T10:12:50.304956456Z", "secrets": [], "status": "built", - "created_at": "2025-12-05T07:01:48.828404196Z", - "updated_at": "2025-12-05T07:01:48.912374903Z", + "created_at": "2025-12-16T10:12:50.209634926Z", + "updated_at": "2025-12-16T10:12:50.307080188Z", "runtime": "node18", "supported_triggers": [ { @@ -2748,19 +2821,19 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "POST", - "path": "/api/v2/actions/actions/d67e0c5e-5be5-4ea1-8b75-29c65f79b7fe/deploy", + "path": "/api/v2/actions/actions/9cc78117-5697-42a8-9c1f-03bf8e5a3689/deploy", "body": "", "status": 200, "response": { "code": "/**\n * Handler that will be called during the execution of a PostLogin flow.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\nexports.onExecutePostLogin = async (event, api) => {\n console.log('Some custom action!');\n};\n\n/**\n * Handler that will be invoked when this action is resuming after an external redirect. If your\n * onExecutePostLogin function does not perform a redirect, this function can be safely ignored.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\n// exports.onContinuePostLogin = async (event, api) => {\n// };\n", "dependencies": [], - "id": "fd14ba8c-b586-49eb-8056-2a222c645a67", + "id": "00b51df2-c7d4-4a31-8e03-ebcd6f5b109c", "deployed": false, "number": 2, "secrets": [], "status": "built", - "created_at": "2025-12-05T07:04:14.332306393Z", - "updated_at": "2025-12-05T07:04:14.332306393Z", + "created_at": "2025-12-16T10:14:51.735114292Z", + "updated_at": "2025-12-16T10:14:51.735114292Z", "runtime": "node18", "supported_triggers": [ { @@ -2769,7 +2842,7 @@ } ], "action": { - "id": "d67e0c5e-5be5-4ea1-8b75-29c65f79b7fe", + "id": "9cc78117-5697-42a8-9c1f-03bf8e5a3689", "name": "My Custom Action", "supported_triggers": [ { @@ -2777,14 +2850,42 @@ "version": "v2" } ], - "created_at": "2025-12-05T07:01:47.853050355Z", - "updated_at": "2025-12-05T07:04:13.375639099Z", + "created_at": "2025-12-16T10:12:49.378691946Z", + "updated_at": "2025-12-16T10:14:50.951794749Z", "all_changes_deployed": false } }, "rawHeaders": [], "responseIsBinary": false }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "PATCH", + "path": "/api/v2/attack-protection/brute-force-protection", + "body": { + "enabled": true, + "shields": [ + "block", + "user_notification" + ], + "mode": "count_per_identifier_and_ip", + "allowlist": [], + "max_attempts": 66 + }, + "status": 200, + "response": { + "enabled": true, + "shields": [ + "block", + "user_notification" + ], + "mode": "count_per_identifier_and_ip", + "allowlist": [], + "max_attempts": 66 + }, + "rawHeaders": [], + "responseIsBinary": false + }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PATCH", @@ -2825,6 +2926,10 @@ "pre-user-registration": { "max_attempts": 66, "rate": 1200 + }, + "pre-custom-token-exchange": { + "max_attempts": 10, + "rate": 600000 } } }, @@ -2859,34 +2964,6 @@ "rawHeaders": [], "responseIsBinary": false }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "PATCH", - "path": "/api/v2/attack-protection/brute-force-protection", - "body": { - "enabled": true, - "shields": [ - "block", - "user_notification" - ], - "mode": "count_per_identifier_and_ip", - "allowlist": [], - "max_attempts": 66 - }, - "status": 200, - "response": { - "enabled": true, - "shields": [ - "block", - "user_notification" - ], - "mode": "count_per_identifier_and_ip", - "allowlist": [], - "max_attempts": 66 - }, - "rawHeaders": [], - "responseIsBinary": false - }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", @@ -2914,7 +2991,7 @@ } }, "created_at": "2025-09-09T04:41:43.671Z", - "updated_at": "2025-12-05T07:01:50.211Z", + "updated_at": "2025-12-16T10:12:51.416Z", "id": "acl_wpZ6oScRU5L6QKAxMUMHmx" } ] @@ -2924,7 +3001,7 @@ }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "PUT", + "method": "PATCH", "path": "/api/v2/network-acls/acl_wpZ6oScRU5L6QKAxMUMHmx", "body": { "priority": 1, @@ -2959,7 +3036,7 @@ } }, "created_at": "2025-09-09T04:41:43.671Z", - "updated_at": "2025-12-05T07:04:15.756Z", + "updated_at": "2025-12-16T10:14:53.158Z", "id": "acl_wpZ6oScRU5L6QKAxMUMHmx" }, "rawHeaders": [], @@ -3020,61 +3097,6 @@ "rawHeaders": [], "responseIsBinary": false }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/user-attribute-profiles?take=10", - "body": "", - "status": 200, - "response": { - "user_attribute_profiles": [ - { - "id": "uap_1csDj3szFsgxGS1oTZTdFm", - "name": "test-user-attribute-profile-2", - "user_id": { - "oidc_mapping": "sub", - "saml_mapping": [ - "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier", - "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn", - "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name" - ], - "scim_mapping": "externalId" - }, - "user_attributes": { - "email": { - "label": "Email", - "description": "Email of the User", - "auth0_mapping": "email", - "profile_required": true - } - } - }, - { - "id": "uap_1csDj3sAVu6n5eTzLw6XZg", - "name": "test-user-attribute-profile", - "user_id": { - "oidc_mapping": "sub", - "saml_mapping": [ - "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier", - "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn", - "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name" - ], - "scim_mapping": "externalId" - }, - "user_attributes": { - "email": { - "label": "Email", - "description": "Email of the User", - "auth0_mapping": "email", - "profile_required": true - } - } - } - ] - }, - "rawHeaders": [], - "responseIsBinary": false - }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PATCH", @@ -3266,7 +3288,7 @@ "subject": "deprecated" } ], - "client_id": "uf1Ju9xwQ09AWpcnRnwD91W3Sv3bf76S", + "client_id": "0ltKN06qv5WnNoNz2Fu6QvyOl2o6K6nE", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -3311,7 +3333,7 @@ "subject": "deprecated" } ], - "client_id": "WYPQxuqDdeNZHLcJeuPq0AvuNFtMiUgU", + "client_id": "HC5UXDFP5lEc2vbTkPQWJ1yYeiLRkmDg", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -3365,7 +3387,7 @@ } ], "allowed_origins": [], - "client_id": "QwKFSZ87TYF89lXp66sVFpGzYGQ07OU6", + "client_id": "KjqnjAT6PWajvX3XKVkWhFVaW8sFBWyv", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -3411,7 +3433,7 @@ "subject": "deprecated" } ], - "client_id": "VvKPDeB2QHhtG4tVBNcrRUuChB0jWefu", + "client_id": "GH55Wtak9aTrj6tjRFObq1cqnu5a8mtM", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -3430,14 +3452,9 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "Test SPA", + "name": "The Default App", "allowed_clients": [], - "allowed_logout_urls": [ - "http://localhost:3000" - ], - "callbacks": [ - "http://localhost:3000" - ], + "callbacks": [], "client_metadata": {}, "is_first_party": true, "native_social_login": { @@ -3448,16 +3465,17 @@ "enabled": false } }, - "oidc_conformant": true, + "oidc_conformant": false, "refresh_token": { - "expiration_type": "expiring", + "expiration_type": "non-expiring", "leeway": 0, + "infinite_token_lifetime": true, + "infinite_idle_token_lifetime": true, "token_lifetime": 2592000, "idle_token_lifetime": 1296000, - "infinite_token_lifetime": false, - "infinite_idle_token_lifetime": false, - "rotation_type": "rotating" + "rotation_type": "non-rotating" }, + "sso": false, "sso_disabled": false, "cross_origin_authentication": false, "cross_origin_auth": false, @@ -3468,7 +3486,7 @@ "subject": "deprecated" } ], - "client_id": "xODbqyam7rjqHDsYKjU9Tuo99yaBnR5T", + "client_id": "ahrUt7DkBom8m2EAs0zLSccaylYIuVfF", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -3477,15 +3495,12 @@ "secret_encoded": false }, "client_aliases": [], - "token_endpoint_auth_method": "none", - "app_type": "spa", + "token_endpoint_auth_method": "client_secret_post", "grant_types": [ "authorization_code", "implicit", - "refresh_token" - ], - "web_origins": [ - "http://localhost:3000" + "refresh_token", + "client_credentials" ], "custom_login_page_on": true }, @@ -3493,9 +3508,14 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "auth0-deploy-cli-extension", + "name": "Test SPA", "allowed_clients": [], - "callbacks": [], + "allowed_logout_urls": [ + "http://localhost:3000" + ], + "callbacks": [ + "http://localhost:3000" + ], "client_metadata": {}, "is_first_party": true, "native_social_login": { @@ -3508,13 +3528,13 @@ }, "oidc_conformant": true, "refresh_token": { - "expiration_type": "non-expiring", + "expiration_type": "expiring", "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" + "token_lifetime": 2592000, + "idle_token_lifetime": 1296000, + "infinite_token_lifetime": false, + "infinite_idle_token_lifetime": false, + "rotation_type": "rotating" }, "sso_disabled": false, "cross_origin_authentication": false, @@ -3526,7 +3546,7 @@ "subject": "deprecated" } ], - "client_id": "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1", + "client_id": "68Ty4a89yPogS0UGdX8aYaS6td9DXYjs", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -3535,10 +3555,15 @@ "secret_encoded": false }, "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", + "token_endpoint_auth_method": "none", + "app_type": "spa", "grant_types": [ - "client_credentials" + "authorization_code", + "implicit", + "refresh_token" + ], + "web_origins": [ + "http://localhost:3000" ], "custom_login_page_on": true }, @@ -3546,7 +3571,7 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "The Default App", + "name": "auth0-deploy-cli-extension", "allowed_clients": [], "callbacks": [], "client_metadata": {}, @@ -3559,17 +3584,16 @@ "enabled": false } }, - "oidc_conformant": false, + "oidc_conformant": true, "refresh_token": { "expiration_type": "non-expiring", "leeway": 0, "infinite_token_lifetime": true, "infinite_idle_token_lifetime": true, - "token_lifetime": 2592000, - "idle_token_lifetime": 1296000, + "token_lifetime": 31557600, + "idle_token_lifetime": 2592000, "rotation_type": "non-rotating" }, - "sso": false, "sso_disabled": false, "cross_origin_authentication": false, "cross_origin_auth": false, @@ -3580,7 +3604,7 @@ "subject": "deprecated" } ], - "client_id": "xYOv2UsoAuKptIEAjkeB62Oaeg1Jn2QX", + "client_id": "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -3590,10 +3614,8 @@ }, "client_aliases": [], "token_endpoint_auth_method": "client_secret_post", + "app_type": "non_interactive", "grant_types": [ - "authorization_code", - "implicit", - "refresh_token", "client_credentials" ], "custom_login_page_on": true @@ -3643,16 +3665,13 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections?include_totals=true&strategy=auth0", + "path": "/api/v2/connections?take=50&strategy=auth0", "body": "", "status": 200, "response": { - "total": 2, - "start": 0, - "limit": 50, "connections": [ { - "id": "con_fuBNFcmY8aL3HDBT", + "id": "con_cxSOS7uLgPojtLBh", "options": { "mfa": { "active": true, @@ -3715,12 +3734,12 @@ "boo-baz-db-connection-test" ], "enabled_clients": [ - "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1", - "QwKFSZ87TYF89lXp66sVFpGzYGQ07OU6" + "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU", + "KjqnjAT6PWajvX3XKVkWhFVaW8sFBWyv" ] }, { - "id": "con_Ty3Nbl0J1Ddxat41", + "id": "con_3R2lX4rln4ArocW5", "options": { "mfa": { "active": true, @@ -3768,13 +3787,13 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections?include_totals=true&take=50&strategy=auth0", + "path": "/api/v2/connections?take=50&strategy=auth0", "body": "", "status": 200, "response": { "connections": [ { - "id": "con_fuBNFcmY8aL3HDBT", + "id": "con_cxSOS7uLgPojtLBh", "options": { "mfa": { "active": true, @@ -3837,12 +3856,12 @@ "boo-baz-db-connection-test" ], "enabled_clients": [ - "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1", - "QwKFSZ87TYF89lXp66sVFpGzYGQ07OU6" + "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU", + "KjqnjAT6PWajvX3XKVkWhFVaW8sFBWyv" ] }, { - "id": "con_Ty3Nbl0J1Ddxat41", + "id": "con_3R2lX4rln4ArocW5", "options": { "mfa": { "active": true, @@ -3890,122 +3909,13 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections?include_totals=true&strategy=auth0", + "path": "/api/v2/connections/con_3R2lX4rln4ArocW5/clients?take=50", "body": "", "status": 200, "response": { - "total": 2, - "start": 0, - "limit": 50, - "connections": [ + "clients": [ { - "id": "con_fuBNFcmY8aL3HDBT", - "options": { - "mfa": { - "active": true, - "return_enroll_settings": true - }, - "import_mode": false, - "customScripts": { - "login": "function login(email, password, callback) {\n // This script should authenticate a user against the credentials stored in\n // your database.\n // It is executed when a user attempts to log in or immediately after signing\n // up (as a verification that the user was successfully signed up).\n //\n // Everything returned by this script will be set as part of the user profile\n // and will be visible by any of the tenant admins. Avoid adding attributes\n // with values such as passwords, keys, secrets, etc.\n //\n // The `password` parameter of this function is in plain text. It must be\n // hashed/salted to match whatever is stored in your database. For example:\n //\n // var bcrypt = require('bcrypt@0.8.5');\n // bcrypt.compare(password, dbPasswordHash, function(err, res)) { ... }\n //\n // There are three ways this script can finish:\n // 1. The user's credentials are valid. The returned user profile should be in\n // the following format: https://auth0.com/docs/users/normalized/auth0/normalized-user-profile-schema\n // var profile = {\n // user_id: ..., // user_id is mandatory\n // email: ...,\n // [...]\n // };\n // callback(null, profile);\n // 2. The user's credentials are invalid\n // callback(new WrongUsernameOrPasswordError(email, \"my error message\"));\n // 3. Something went wrong while trying to reach your database\n // callback(new Error(\"my error message\"));\n //\n // A list of Node.js modules which can be referenced is available here:\n //\n // https://tehsis.github.io/webtaskio-canirequire/\n console.log('AYYYYYE');\n\n const msg =\n 'Please implement the Login script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "create": "function create(user, callback) {\n // This script should create a user entry in your existing database. It will\n // be executed when a user attempts to sign up, or when a user is created\n // through the Auth0 dashboard or API.\n // When this script has finished executing, the Login script will be\n // executed immediately afterwards, to verify that the user was created\n // successfully.\n //\n // The user object will always contain the following properties:\n // * email: the user's email\n // * password: the password entered by the user, in plain text\n // * tenant: the name of this Auth0 account\n // * client_id: the client ID of the application where the user signed up, or\n // API key if created through the API or Auth0 dashboard\n // * connection: the name of this database connection\n //\n // There are three ways this script can finish:\n // 1. A user was successfully created\n // callback(null);\n // 2. This user already exists in your database\n // callback(new ValidationError(\"user_exists\", \"my error message\"));\n // 3. Something went wrong while trying to reach your database\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Create script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "delete": "function remove(id, callback) {\n // This script remove a user from your existing database.\n // It is executed whenever a user is deleted from the API or Auth0 dashboard.\n //\n // There are two ways that this script can finish:\n // 1. The user was removed successfully:\n // callback(null);\n // 2. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Delete script for this database ' +\n 'connection at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "verify": "function verify(email, callback) {\n // This script should mark the current user's email address as verified in\n // your database.\n // It is executed whenever a user clicks the verification link sent by email.\n // These emails can be customized at https://manage.auth0.com/#/emails.\n // It is safe to assume that the user's email already exists in your database,\n // because verification emails, if enabled, are sent immediately after a\n // successful signup.\n //\n // There are two ways that this script can finish:\n // 1. The user's email was verified successfully\n // callback(null, true);\n // 2. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n //\n // If an error is returned, it will be passed to the query string of the page\n // where the user is being redirected to after clicking the verification link.\n // For example, returning `callback(new Error(\"error\"))` and redirecting to\n // https://example.com would redirect to the following URL:\n // https://example.com?email=alice%40example.com&message=error&success=false\n\n const msg =\n 'Please implement the Verify script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "get_user": "function getByEmail(email, callback) {\n // This script should retrieve a user profile from your existing database,\n // without authenticating the user.\n // It is used to check if a user exists before executing flows that do not\n // require authentication (signup and password reset).\n //\n // There are three ways this script can finish:\n // 1. A user was successfully found. The profile should be in the following\n // format: https://auth0.com/docs/users/normalized/auth0/normalized-user-profile-schema.\n // callback(null, profile);\n // 2. A user was not found\n // callback(null);\n // 3. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Get User script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "change_password": "function changePassword(email, newPassword, callback) {\n // This script should change the password stored for the current user in your\n // database. It is executed when the user clicks on the confirmation link\n // after a reset password request.\n // The content and behavior of password confirmation emails can be customized\n // here: https://manage.auth0.com/#/emails\n // The `newPassword` parameter of this function is in plain text. It must be\n // hashed/salted to match whatever is stored in your database.\n //\n // There are three ways that this script can finish:\n // 1. The user's password was updated successfully:\n // callback(null, true);\n // 2. The user's password was not updated:\n // callback(null, false);\n // 3. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n //\n // If an error is returned, it will be passed to the query string of the page\n // where the user is being redirected to after clicking the confirmation link.\n // For example, returning `callback(new Error(\"error\"))` and redirecting to\n // https://example.com would redirect to the following URL:\n // https://example.com?email=alice%40example.com&message=error&success=false\n\n const msg =\n 'Please implement the Change Password script for this database ' +\n 'connection at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n" - }, - "disable_signup": false, - "passwordPolicy": "low", - "passkey_options": { - "challenge_ui": "both", - "local_enrollment_enabled": true, - "progressive_enrollment_enabled": true - }, - "password_history": { - "size": 5, - "enable": false - }, - "strategy_version": 2, - "requires_username": true, - "password_dictionary": { - "enable": true, - "dictionary": [] - }, - "authentication_methods": { - "passkey": { - "enabled": false - }, - "password": { - "enabled": true, - "api_behavior": "required" - } - }, - "brute_force_protection": true, - "password_no_personal_info": { - "enable": true - }, - "password_complexity_options": { - "min_length": 8 - }, - "enabledDatabaseCustomization": true - }, - "strategy": "auth0", - "name": "boo-baz-db-connection-test", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "boo-baz-db-connection-test" - ], - "enabled_clients": [ - "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1", - "QwKFSZ87TYF89lXp66sVFpGzYGQ07OU6" - ] - }, - { - "id": "con_Ty3Nbl0J1Ddxat41", - "options": { - "mfa": { - "active": true, - "return_enroll_settings": true - }, - "passwordPolicy": "good", - "passkey_options": { - "challenge_ui": "both", - "local_enrollment_enabled": true, - "progressive_enrollment_enabled": true - }, - "strategy_version": 2, - "authentication_methods": { - "passkey": { - "enabled": false - }, - "password": { - "enabled": true, - "api_behavior": "required" - } - }, - "brute_force_protection": true - }, - "strategy": "auth0", - "name": "Username-Password-Authentication", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "Username-Password-Authentication" - ], - "enabled_clients": [ - "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE" - ] + "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE" } ] }, @@ -4015,119 +3925,16 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections?include_totals=true&take=50&strategy=auth0", + "path": "/api/v2/connections/con_cxSOS7uLgPojtLBh/clients?take=50", "body": "", "status": 200, "response": { - "connections": [ + "clients": [ { - "id": "con_fuBNFcmY8aL3HDBT", - "options": { - "mfa": { - "active": true, - "return_enroll_settings": true - }, - "import_mode": false, - "customScripts": { - "login": "function login(email, password, callback) {\n // This script should authenticate a user against the credentials stored in\n // your database.\n // It is executed when a user attempts to log in or immediately after signing\n // up (as a verification that the user was successfully signed up).\n //\n // Everything returned by this script will be set as part of the user profile\n // and will be visible by any of the tenant admins. Avoid adding attributes\n // with values such as passwords, keys, secrets, etc.\n //\n // The `password` parameter of this function is in plain text. It must be\n // hashed/salted to match whatever is stored in your database. For example:\n //\n // var bcrypt = require('bcrypt@0.8.5');\n // bcrypt.compare(password, dbPasswordHash, function(err, res)) { ... }\n //\n // There are three ways this script can finish:\n // 1. The user's credentials are valid. The returned user profile should be in\n // the following format: https://auth0.com/docs/users/normalized/auth0/normalized-user-profile-schema\n // var profile = {\n // user_id: ..., // user_id is mandatory\n // email: ...,\n // [...]\n // };\n // callback(null, profile);\n // 2. The user's credentials are invalid\n // callback(new WrongUsernameOrPasswordError(email, \"my error message\"));\n // 3. Something went wrong while trying to reach your database\n // callback(new Error(\"my error message\"));\n //\n // A list of Node.js modules which can be referenced is available here:\n //\n // https://tehsis.github.io/webtaskio-canirequire/\n console.log('AYYYYYE');\n\n const msg =\n 'Please implement the Login script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "create": "function create(user, callback) {\n // This script should create a user entry in your existing database. It will\n // be executed when a user attempts to sign up, or when a user is created\n // through the Auth0 dashboard or API.\n // When this script has finished executing, the Login script will be\n // executed immediately afterwards, to verify that the user was created\n // successfully.\n //\n // The user object will always contain the following properties:\n // * email: the user's email\n // * password: the password entered by the user, in plain text\n // * tenant: the name of this Auth0 account\n // * client_id: the client ID of the application where the user signed up, or\n // API key if created through the API or Auth0 dashboard\n // * connection: the name of this database connection\n //\n // There are three ways this script can finish:\n // 1. A user was successfully created\n // callback(null);\n // 2. This user already exists in your database\n // callback(new ValidationError(\"user_exists\", \"my error message\"));\n // 3. Something went wrong while trying to reach your database\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Create script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "delete": "function remove(id, callback) {\n // This script remove a user from your existing database.\n // It is executed whenever a user is deleted from the API or Auth0 dashboard.\n //\n // There are two ways that this script can finish:\n // 1. The user was removed successfully:\n // callback(null);\n // 2. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Delete script for this database ' +\n 'connection at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "verify": "function verify(email, callback) {\n // This script should mark the current user's email address as verified in\n // your database.\n // It is executed whenever a user clicks the verification link sent by email.\n // These emails can be customized at https://manage.auth0.com/#/emails.\n // It is safe to assume that the user's email already exists in your database,\n // because verification emails, if enabled, are sent immediately after a\n // successful signup.\n //\n // There are two ways that this script can finish:\n // 1. The user's email was verified successfully\n // callback(null, true);\n // 2. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n //\n // If an error is returned, it will be passed to the query string of the page\n // where the user is being redirected to after clicking the verification link.\n // For example, returning `callback(new Error(\"error\"))` and redirecting to\n // https://example.com would redirect to the following URL:\n // https://example.com?email=alice%40example.com&message=error&success=false\n\n const msg =\n 'Please implement the Verify script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "get_user": "function getByEmail(email, callback) {\n // This script should retrieve a user profile from your existing database,\n // without authenticating the user.\n // It is used to check if a user exists before executing flows that do not\n // require authentication (signup and password reset).\n //\n // There are three ways this script can finish:\n // 1. A user was successfully found. The profile should be in the following\n // format: https://auth0.com/docs/users/normalized/auth0/normalized-user-profile-schema.\n // callback(null, profile);\n // 2. A user was not found\n // callback(null);\n // 3. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Get User script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "change_password": "function changePassword(email, newPassword, callback) {\n // This script should change the password stored for the current user in your\n // database. It is executed when the user clicks on the confirmation link\n // after a reset password request.\n // The content and behavior of password confirmation emails can be customized\n // here: https://manage.auth0.com/#/emails\n // The `newPassword` parameter of this function is in plain text. It must be\n // hashed/salted to match whatever is stored in your database.\n //\n // There are three ways that this script can finish:\n // 1. The user's password was updated successfully:\n // callback(null, true);\n // 2. The user's password was not updated:\n // callback(null, false);\n // 3. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n //\n // If an error is returned, it will be passed to the query string of the page\n // where the user is being redirected to after clicking the confirmation link.\n // For example, returning `callback(new Error(\"error\"))` and redirecting to\n // https://example.com would redirect to the following URL:\n // https://example.com?email=alice%40example.com&message=error&success=false\n\n const msg =\n 'Please implement the Change Password script for this database ' +\n 'connection at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n" - }, - "disable_signup": false, - "passwordPolicy": "low", - "passkey_options": { - "challenge_ui": "both", - "local_enrollment_enabled": true, - "progressive_enrollment_enabled": true - }, - "password_history": { - "size": 5, - "enable": false - }, - "strategy_version": 2, - "requires_username": true, - "password_dictionary": { - "enable": true, - "dictionary": [] - }, - "authentication_methods": { - "passkey": { - "enabled": false - }, - "password": { - "enabled": true, - "api_behavior": "required" - } - }, - "brute_force_protection": true, - "password_no_personal_info": { - "enable": true - }, - "password_complexity_options": { - "min_length": 8 - }, - "enabledDatabaseCustomization": true - }, - "strategy": "auth0", - "name": "boo-baz-db-connection-test", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "boo-baz-db-connection-test" - ], - "enabled_clients": [ - "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1", - "QwKFSZ87TYF89lXp66sVFpGzYGQ07OU6" - ] + "client_id": "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU" }, { - "id": "con_Ty3Nbl0J1Ddxat41", - "options": { - "mfa": { - "active": true, - "return_enroll_settings": true - }, - "passwordPolicy": "good", - "passkey_options": { - "challenge_ui": "both", - "local_enrollment_enabled": true, - "progressive_enrollment_enabled": true - }, - "strategy_version": 2, - "authentication_methods": { - "passkey": { - "enabled": false - }, - "password": { - "enabled": true, - "api_behavior": "required" - } - }, - "brute_force_protection": true - }, - "strategy": "auth0", - "name": "Username-Password-Authentication", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "Username-Password-Authentication" - ], - "enabled_clients": [ - "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE" - ] + "client_id": "KjqnjAT6PWajvX3XKVkWhFVaW8sFBWyv" } ] }, @@ -4137,16 +3944,13 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections/con_fuBNFcmY8aL3HDBT/clients?take=50", + "path": "/api/v2/connections/con_3R2lX4rln4ArocW5/clients?take=50", "body": "", "status": 200, "response": { "clients": [ { - "client_id": "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1" - }, - { - "client_id": "QwKFSZ87TYF89lXp66sVFpGzYGQ07OU6" + "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE" } ] }, @@ -4156,13 +3960,16 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections/con_Ty3Nbl0J1Ddxat41/clients?take=50", + "path": "/api/v2/connections/con_cxSOS7uLgPojtLBh/clients?take=50", "body": "", "status": 200, "response": { "clients": [ { - "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE" + "client_id": "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU" + }, + { + "client_id": "KjqnjAT6PWajvX3XKVkWhFVaW8sFBWyv" } ] }, @@ -4172,11 +3979,11 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "DELETE", - "path": "/api/v2/connections/con_Ty3Nbl0J1Ddxat41", + "path": "/api/v2/connections/con_3R2lX4rln4ArocW5", "body": "", "status": 202, "response": { - "deleted_at": "2025-12-05T07:04:20.717Z" + "deleted_at": "2025-12-16T10:14:56.515Z" }, "rawHeaders": [], "responseIsBinary": false @@ -4184,11 +3991,11 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections/con_fuBNFcmY8aL3HDBT", + "path": "/api/v2/connections/con_cxSOS7uLgPojtLBh", "body": "", "status": 200, "response": { - "id": "con_fuBNFcmY8aL3HDBT", + "id": "con_cxSOS7uLgPojtLBh", "options": { "mfa": { "active": true, @@ -4248,8 +4055,8 @@ "active": false }, "enabled_clients": [ - "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1", - "QwKFSZ87TYF89lXp66sVFpGzYGQ07OU6" + "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU", + "KjqnjAT6PWajvX3XKVkWhFVaW8sFBWyv" ], "realms": [ "boo-baz-db-connection-test" @@ -4261,11 +4068,11 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PATCH", - "path": "/api/v2/connections/con_fuBNFcmY8aL3HDBT", + "path": "/api/v2/connections/con_cxSOS7uLgPojtLBh", "body": { "enabled_clients": [ - "QwKFSZ87TYF89lXp66sVFpGzYGQ07OU6", - "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1" + "KjqnjAT6PWajvX3XKVkWhFVaW8sFBWyv", + "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU" ], "is_domain_connection": false, "options": { @@ -4323,7 +4130,7 @@ }, "status": 200, "response": { - "id": "con_fuBNFcmY8aL3HDBT", + "id": "con_cxSOS7uLgPojtLBh", "options": { "mfa": { "active": true, @@ -4383,8 +4190,8 @@ "active": false }, "enabled_clients": [ - "QwKFSZ87TYF89lXp66sVFpGzYGQ07OU6", - "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1" + "KjqnjAT6PWajvX3XKVkWhFVaW8sFBWyv", + "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU" ], "realms": [ "boo-baz-db-connection-test" @@ -4396,14 +4203,14 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PATCH", - "path": "/api/v2/connections/con_fuBNFcmY8aL3HDBT/clients", + "path": "/api/v2/connections/con_cxSOS7uLgPojtLBh/clients", "body": [ { - "client_id": "QwKFSZ87TYF89lXp66sVFpGzYGQ07OU6", + "client_id": "KjqnjAT6PWajvX3XKVkWhFVaW8sFBWyv", "status": true }, { - "client_id": "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1", + "client_id": "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU", "status": true } ], @@ -4515,7 +4322,7 @@ "subject": "deprecated" } ], - "client_id": "uf1Ju9xwQ09AWpcnRnwD91W3Sv3bf76S", + "client_id": "0ltKN06qv5WnNoNz2Fu6QvyOl2o6K6nE", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -4560,7 +4367,7 @@ "subject": "deprecated" } ], - "client_id": "WYPQxuqDdeNZHLcJeuPq0AvuNFtMiUgU", + "client_id": "HC5UXDFP5lEc2vbTkPQWJ1yYeiLRkmDg", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -4614,7 +4421,7 @@ } ], "allowed_origins": [], - "client_id": "QwKFSZ87TYF89lXp66sVFpGzYGQ07OU6", + "client_id": "KjqnjAT6PWajvX3XKVkWhFVaW8sFBWyv", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -4660,7 +4467,7 @@ "subject": "deprecated" } ], - "client_id": "VvKPDeB2QHhtG4tVBNcrRUuChB0jWefu", + "client_id": "GH55Wtak9aTrj6tjRFObq1cqnu5a8mtM", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -4679,14 +4486,9 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "Test SPA", + "name": "The Default App", "allowed_clients": [], - "allowed_logout_urls": [ - "http://localhost:3000" - ], - "callbacks": [ - "http://localhost:3000" - ], + "callbacks": [], "client_metadata": {}, "is_first_party": true, "native_social_login": { @@ -4697,16 +4499,17 @@ "enabled": false } }, - "oidc_conformant": true, + "oidc_conformant": false, "refresh_token": { - "expiration_type": "expiring", + "expiration_type": "non-expiring", "leeway": 0, + "infinite_token_lifetime": true, + "infinite_idle_token_lifetime": true, "token_lifetime": 2592000, "idle_token_lifetime": 1296000, - "infinite_token_lifetime": false, - "infinite_idle_token_lifetime": false, - "rotation_type": "rotating" + "rotation_type": "non-rotating" }, + "sso": false, "sso_disabled": false, "cross_origin_authentication": false, "cross_origin_auth": false, @@ -4717,7 +4520,7 @@ "subject": "deprecated" } ], - "client_id": "xODbqyam7rjqHDsYKjU9Tuo99yaBnR5T", + "client_id": "ahrUt7DkBom8m2EAs0zLSccaylYIuVfF", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -4726,15 +4529,12 @@ "secret_encoded": false }, "client_aliases": [], - "token_endpoint_auth_method": "none", - "app_type": "spa", + "token_endpoint_auth_method": "client_secret_post", "grant_types": [ "authorization_code", "implicit", - "refresh_token" - ], - "web_origins": [ - "http://localhost:3000" + "refresh_token", + "client_credentials" ], "custom_login_page_on": true }, @@ -4742,9 +4542,14 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "auth0-deploy-cli-extension", + "name": "Test SPA", "allowed_clients": [], - "callbacks": [], + "allowed_logout_urls": [ + "http://localhost:3000" + ], + "callbacks": [ + "http://localhost:3000" + ], "client_metadata": {}, "is_first_party": true, "native_social_login": { @@ -4757,13 +4562,13 @@ }, "oidc_conformant": true, "refresh_token": { - "expiration_type": "non-expiring", + "expiration_type": "expiring", "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" + "token_lifetime": 2592000, + "idle_token_lifetime": 1296000, + "infinite_token_lifetime": false, + "infinite_idle_token_lifetime": false, + "rotation_type": "rotating" }, "sso_disabled": false, "cross_origin_authentication": false, @@ -4775,7 +4580,7 @@ "subject": "deprecated" } ], - "client_id": "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1", + "client_id": "68Ty4a89yPogS0UGdX8aYaS6td9DXYjs", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -4784,10 +4589,15 @@ "secret_encoded": false }, "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", + "token_endpoint_auth_method": "none", + "app_type": "spa", "grant_types": [ - "client_credentials" + "authorization_code", + "implicit", + "refresh_token" + ], + "web_origins": [ + "http://localhost:3000" ], "custom_login_page_on": true }, @@ -4795,7 +4605,7 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "The Default App", + "name": "auth0-deploy-cli-extension", "allowed_clients": [], "callbacks": [], "client_metadata": {}, @@ -4808,17 +4618,16 @@ "enabled": false } }, - "oidc_conformant": false, + "oidc_conformant": true, "refresh_token": { "expiration_type": "non-expiring", "leeway": 0, "infinite_token_lifetime": true, "infinite_idle_token_lifetime": true, - "token_lifetime": 2592000, - "idle_token_lifetime": 1296000, + "token_lifetime": 31557600, + "idle_token_lifetime": 2592000, "rotation_type": "non-rotating" }, - "sso": false, "sso_disabled": false, "cross_origin_authentication": false, "cross_origin_auth": false, @@ -4829,7 +4638,7 @@ "subject": "deprecated" } ], - "client_id": "xYOv2UsoAuKptIEAjkeB62Oaeg1Jn2QX", + "client_id": "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -4839,10 +4648,8 @@ }, "client_aliases": [], "token_endpoint_auth_method": "client_secret_post", + "app_type": "non_interactive", "grant_types": [ - "authorization_code", - "implicit", - "refresh_token", "client_credentials" ], "custom_login_page_on": true @@ -4892,16 +4699,13 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections?include_totals=true", + "path": "/api/v2/connections?take=50", "body": "", "status": 200, "response": { - "total": 2, - "start": 0, - "limit": 50, "connections": [ { - "id": "con_fuBNFcmY8aL3HDBT", + "id": "con_cxSOS7uLgPojtLBh", "options": { "mfa": { "active": true, @@ -4964,12 +4768,12 @@ "boo-baz-db-connection-test" ], "enabled_clients": [ - "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1", - "QwKFSZ87TYF89lXp66sVFpGzYGQ07OU6" + "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU", + "KjqnjAT6PWajvX3XKVkWhFVaW8sFBWyv" ] }, { - "id": "con_URfc5OIXMzEJtZaz", + "id": "con_lfhXlIY73LFJlMks", "options": { "email": true, "scope": [ @@ -4991,8 +4795,8 @@ "google-oauth2" ], "enabled_clients": [ - "xYOv2UsoAuKptIEAjkeB62Oaeg1Jn2QX", - "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1" + "ahrUt7DkBom8m2EAs0zLSccaylYIuVfF", + "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU" ] } ] @@ -5003,13 +4807,13 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections?include_totals=true&take=50", + "path": "/api/v2/connections?take=50", "body": "", "status": 200, "response": { "connections": [ { - "id": "con_fuBNFcmY8aL3HDBT", + "id": "con_cxSOS7uLgPojtLBh", "options": { "mfa": { "active": true, @@ -5072,12 +4876,12 @@ "boo-baz-db-connection-test" ], "enabled_clients": [ - "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1", - "QwKFSZ87TYF89lXp66sVFpGzYGQ07OU6" + "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU", + "KjqnjAT6PWajvX3XKVkWhFVaW8sFBWyv" ] }, { - "id": "con_URfc5OIXMzEJtZaz", + "id": "con_lfhXlIY73LFJlMks", "options": { "email": true, "scope": [ @@ -5099,8 +4903,8 @@ "google-oauth2" ], "enabled_clients": [ - "xYOv2UsoAuKptIEAjkeB62Oaeg1Jn2QX", - "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1" + "ahrUt7DkBom8m2EAs0zLSccaylYIuVfF", + "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU" ] } ] @@ -5111,216 +4915,16 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections?include_totals=true", + "path": "/api/v2/connections/con_lfhXlIY73LFJlMks/clients?take=50", "body": "", "status": 200, "response": { - "total": 2, - "start": 0, - "limit": 50, - "connections": [ + "clients": [ { - "id": "con_fuBNFcmY8aL3HDBT", - "options": { - "mfa": { - "active": true, - "return_enroll_settings": true - }, - "import_mode": false, - "customScripts": { - "login": "function login(email, password, callback) {\n // This script should authenticate a user against the credentials stored in\n // your database.\n // It is executed when a user attempts to log in or immediately after signing\n // up (as a verification that the user was successfully signed up).\n //\n // Everything returned by this script will be set as part of the user profile\n // and will be visible by any of the tenant admins. Avoid adding attributes\n // with values such as passwords, keys, secrets, etc.\n //\n // The `password` parameter of this function is in plain text. It must be\n // hashed/salted to match whatever is stored in your database. For example:\n //\n // var bcrypt = require('bcrypt@0.8.5');\n // bcrypt.compare(password, dbPasswordHash, function(err, res)) { ... }\n //\n // There are three ways this script can finish:\n // 1. The user's credentials are valid. The returned user profile should be in\n // the following format: https://auth0.com/docs/users/normalized/auth0/normalized-user-profile-schema\n // var profile = {\n // user_id: ..., // user_id is mandatory\n // email: ...,\n // [...]\n // };\n // callback(null, profile);\n // 2. The user's credentials are invalid\n // callback(new WrongUsernameOrPasswordError(email, \"my error message\"));\n // 3. Something went wrong while trying to reach your database\n // callback(new Error(\"my error message\"));\n //\n // A list of Node.js modules which can be referenced is available here:\n //\n // https://tehsis.github.io/webtaskio-canirequire/\n console.log('AYYYYYE');\n\n const msg =\n 'Please implement the Login script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "create": "function create(user, callback) {\n // This script should create a user entry in your existing database. It will\n // be executed when a user attempts to sign up, or when a user is created\n // through the Auth0 dashboard or API.\n // When this script has finished executing, the Login script will be\n // executed immediately afterwards, to verify that the user was created\n // successfully.\n //\n // The user object will always contain the following properties:\n // * email: the user's email\n // * password: the password entered by the user, in plain text\n // * tenant: the name of this Auth0 account\n // * client_id: the client ID of the application where the user signed up, or\n // API key if created through the API or Auth0 dashboard\n // * connection: the name of this database connection\n //\n // There are three ways this script can finish:\n // 1. A user was successfully created\n // callback(null);\n // 2. This user already exists in your database\n // callback(new ValidationError(\"user_exists\", \"my error message\"));\n // 3. Something went wrong while trying to reach your database\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Create script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "delete": "function remove(id, callback) {\n // This script remove a user from your existing database.\n // It is executed whenever a user is deleted from the API or Auth0 dashboard.\n //\n // There are two ways that this script can finish:\n // 1. The user was removed successfully:\n // callback(null);\n // 2. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Delete script for this database ' +\n 'connection at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "verify": "function verify(email, callback) {\n // This script should mark the current user's email address as verified in\n // your database.\n // It is executed whenever a user clicks the verification link sent by email.\n // These emails can be customized at https://manage.auth0.com/#/emails.\n // It is safe to assume that the user's email already exists in your database,\n // because verification emails, if enabled, are sent immediately after a\n // successful signup.\n //\n // There are two ways that this script can finish:\n // 1. The user's email was verified successfully\n // callback(null, true);\n // 2. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n //\n // If an error is returned, it will be passed to the query string of the page\n // where the user is being redirected to after clicking the verification link.\n // For example, returning `callback(new Error(\"error\"))` and redirecting to\n // https://example.com would redirect to the following URL:\n // https://example.com?email=alice%40example.com&message=error&success=false\n\n const msg =\n 'Please implement the Verify script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "get_user": "function getByEmail(email, callback) {\n // This script should retrieve a user profile from your existing database,\n // without authenticating the user.\n // It is used to check if a user exists before executing flows that do not\n // require authentication (signup and password reset).\n //\n // There are three ways this script can finish:\n // 1. A user was successfully found. The profile should be in the following\n // format: https://auth0.com/docs/users/normalized/auth0/normalized-user-profile-schema.\n // callback(null, profile);\n // 2. A user was not found\n // callback(null);\n // 3. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Get User script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "change_password": "function changePassword(email, newPassword, callback) {\n // This script should change the password stored for the current user in your\n // database. It is executed when the user clicks on the confirmation link\n // after a reset password request.\n // The content and behavior of password confirmation emails can be customized\n // here: https://manage.auth0.com/#/emails\n // The `newPassword` parameter of this function is in plain text. It must be\n // hashed/salted to match whatever is stored in your database.\n //\n // There are three ways that this script can finish:\n // 1. The user's password was updated successfully:\n // callback(null, true);\n // 2. The user's password was not updated:\n // callback(null, false);\n // 3. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n //\n // If an error is returned, it will be passed to the query string of the page\n // where the user is being redirected to after clicking the confirmation link.\n // For example, returning `callback(new Error(\"error\"))` and redirecting to\n // https://example.com would redirect to the following URL:\n // https://example.com?email=alice%40example.com&message=error&success=false\n\n const msg =\n 'Please implement the Change Password script for this database ' +\n 'connection at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n" - }, - "disable_signup": false, - "passwordPolicy": "low", - "passkey_options": { - "challenge_ui": "both", - "local_enrollment_enabled": true, - "progressive_enrollment_enabled": true - }, - "password_history": { - "size": 5, - "enable": false - }, - "strategy_version": 2, - "requires_username": true, - "password_dictionary": { - "enable": true, - "dictionary": [] - }, - "authentication_methods": { - "passkey": { - "enabled": false - }, - "password": { - "enabled": true, - "api_behavior": "required" - } - }, - "brute_force_protection": true, - "password_no_personal_info": { - "enable": true - }, - "password_complexity_options": { - "min_length": 8 - }, - "enabledDatabaseCustomization": true - }, - "strategy": "auth0", - "name": "boo-baz-db-connection-test", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "boo-baz-db-connection-test" - ], - "enabled_clients": [ - "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1", - "QwKFSZ87TYF89lXp66sVFpGzYGQ07OU6" - ] - }, - { - "id": "con_URfc5OIXMzEJtZaz", - "options": { - "email": true, - "scope": [ - "email", - "profile" - ], - "profile": true - }, - "strategy": "google-oauth2", - "name": "google-oauth2", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "google-oauth2" - ], - "enabled_clients": [ - "xYOv2UsoAuKptIEAjkeB62Oaeg1Jn2QX", - "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1" - ] - } - ] - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/connections?include_totals=true&take=50", - "body": "", - "status": 200, - "response": { - "connections": [ - { - "id": "con_fuBNFcmY8aL3HDBT", - "options": { - "mfa": { - "active": true, - "return_enroll_settings": true - }, - "import_mode": false, - "customScripts": { - "login": "function login(email, password, callback) {\n // This script should authenticate a user against the credentials stored in\n // your database.\n // It is executed when a user attempts to log in or immediately after signing\n // up (as a verification that the user was successfully signed up).\n //\n // Everything returned by this script will be set as part of the user profile\n // and will be visible by any of the tenant admins. Avoid adding attributes\n // with values such as passwords, keys, secrets, etc.\n //\n // The `password` parameter of this function is in plain text. It must be\n // hashed/salted to match whatever is stored in your database. For example:\n //\n // var bcrypt = require('bcrypt@0.8.5');\n // bcrypt.compare(password, dbPasswordHash, function(err, res)) { ... }\n //\n // There are three ways this script can finish:\n // 1. The user's credentials are valid. The returned user profile should be in\n // the following format: https://auth0.com/docs/users/normalized/auth0/normalized-user-profile-schema\n // var profile = {\n // user_id: ..., // user_id is mandatory\n // email: ...,\n // [...]\n // };\n // callback(null, profile);\n // 2. The user's credentials are invalid\n // callback(new WrongUsernameOrPasswordError(email, \"my error message\"));\n // 3. Something went wrong while trying to reach your database\n // callback(new Error(\"my error message\"));\n //\n // A list of Node.js modules which can be referenced is available here:\n //\n // https://tehsis.github.io/webtaskio-canirequire/\n console.log('AYYYYYE');\n\n const msg =\n 'Please implement the Login script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "create": "function create(user, callback) {\n // This script should create a user entry in your existing database. It will\n // be executed when a user attempts to sign up, or when a user is created\n // through the Auth0 dashboard or API.\n // When this script has finished executing, the Login script will be\n // executed immediately afterwards, to verify that the user was created\n // successfully.\n //\n // The user object will always contain the following properties:\n // * email: the user's email\n // * password: the password entered by the user, in plain text\n // * tenant: the name of this Auth0 account\n // * client_id: the client ID of the application where the user signed up, or\n // API key if created through the API or Auth0 dashboard\n // * connection: the name of this database connection\n //\n // There are three ways this script can finish:\n // 1. A user was successfully created\n // callback(null);\n // 2. This user already exists in your database\n // callback(new ValidationError(\"user_exists\", \"my error message\"));\n // 3. Something went wrong while trying to reach your database\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Create script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "delete": "function remove(id, callback) {\n // This script remove a user from your existing database.\n // It is executed whenever a user is deleted from the API or Auth0 dashboard.\n //\n // There are two ways that this script can finish:\n // 1. The user was removed successfully:\n // callback(null);\n // 2. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Delete script for this database ' +\n 'connection at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "verify": "function verify(email, callback) {\n // This script should mark the current user's email address as verified in\n // your database.\n // It is executed whenever a user clicks the verification link sent by email.\n // These emails can be customized at https://manage.auth0.com/#/emails.\n // It is safe to assume that the user's email already exists in your database,\n // because verification emails, if enabled, are sent immediately after a\n // successful signup.\n //\n // There are two ways that this script can finish:\n // 1. The user's email was verified successfully\n // callback(null, true);\n // 2. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n //\n // If an error is returned, it will be passed to the query string of the page\n // where the user is being redirected to after clicking the verification link.\n // For example, returning `callback(new Error(\"error\"))` and redirecting to\n // https://example.com would redirect to the following URL:\n // https://example.com?email=alice%40example.com&message=error&success=false\n\n const msg =\n 'Please implement the Verify script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "get_user": "function getByEmail(email, callback) {\n // This script should retrieve a user profile from your existing database,\n // without authenticating the user.\n // It is used to check if a user exists before executing flows that do not\n // require authentication (signup and password reset).\n //\n // There are three ways this script can finish:\n // 1. A user was successfully found. The profile should be in the following\n // format: https://auth0.com/docs/users/normalized/auth0/normalized-user-profile-schema.\n // callback(null, profile);\n // 2. A user was not found\n // callback(null);\n // 3. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Get User script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "change_password": "function changePassword(email, newPassword, callback) {\n // This script should change the password stored for the current user in your\n // database. It is executed when the user clicks on the confirmation link\n // after a reset password request.\n // The content and behavior of password confirmation emails can be customized\n // here: https://manage.auth0.com/#/emails\n // The `newPassword` parameter of this function is in plain text. It must be\n // hashed/salted to match whatever is stored in your database.\n //\n // There are three ways that this script can finish:\n // 1. The user's password was updated successfully:\n // callback(null, true);\n // 2. The user's password was not updated:\n // callback(null, false);\n // 3. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n //\n // If an error is returned, it will be passed to the query string of the page\n // where the user is being redirected to after clicking the confirmation link.\n // For example, returning `callback(new Error(\"error\"))` and redirecting to\n // https://example.com would redirect to the following URL:\n // https://example.com?email=alice%40example.com&message=error&success=false\n\n const msg =\n 'Please implement the Change Password script for this database ' +\n 'connection at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n" - }, - "disable_signup": false, - "passwordPolicy": "low", - "passkey_options": { - "challenge_ui": "both", - "local_enrollment_enabled": true, - "progressive_enrollment_enabled": true - }, - "password_history": { - "size": 5, - "enable": false - }, - "strategy_version": 2, - "requires_username": true, - "password_dictionary": { - "enable": true, - "dictionary": [] - }, - "authentication_methods": { - "passkey": { - "enabled": false - }, - "password": { - "enabled": true, - "api_behavior": "required" - } - }, - "brute_force_protection": true, - "password_no_personal_info": { - "enable": true - }, - "password_complexity_options": { - "min_length": 8 - }, - "enabledDatabaseCustomization": true - }, - "strategy": "auth0", - "name": "boo-baz-db-connection-test", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "boo-baz-db-connection-test" - ], - "enabled_clients": [ - "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1", - "QwKFSZ87TYF89lXp66sVFpGzYGQ07OU6" - ] + "client_id": "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU" }, { - "id": "con_URfc5OIXMzEJtZaz", - "options": { - "email": true, - "scope": [ - "email", - "profile" - ], - "profile": true - }, - "strategy": "google-oauth2", - "name": "google-oauth2", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "google-oauth2" - ], - "enabled_clients": [ - "xYOv2UsoAuKptIEAjkeB62Oaeg1Jn2QX", - "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1" - ] + "client_id": "ahrUt7DkBom8m2EAs0zLSccaylYIuVfF" } ] }, @@ -5330,16 +4934,16 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections/con_URfc5OIXMzEJtZaz/clients?take=50", + "path": "/api/v2/connections/con_lfhXlIY73LFJlMks/clients?take=50", "body": "", "status": 200, "response": { "clients": [ { - "client_id": "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1" + "client_id": "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU" }, { - "client_id": "xYOv2UsoAuKptIEAjkeB62Oaeg1Jn2QX" + "client_id": "ahrUt7DkBom8m2EAs0zLSccaylYIuVfF" } ] }, @@ -5349,11 +4953,11 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PATCH", - "path": "/api/v2/connections/con_URfc5OIXMzEJtZaz", + "path": "/api/v2/connections/con_lfhXlIY73LFJlMks", "body": { "enabled_clients": [ - "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1", - "xYOv2UsoAuKptIEAjkeB62Oaeg1Jn2QX" + "ahrUt7DkBom8m2EAs0zLSccaylYIuVfF", + "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU" ], "is_domain_connection": false, "options": { @@ -5367,7 +4971,7 @@ }, "status": 200, "response": { - "id": "con_URfc5OIXMzEJtZaz", + "id": "con_lfhXlIY73LFJlMks", "options": { "email": true, "scope": [ @@ -5386,8 +4990,8 @@ "active": false }, "enabled_clients": [ - "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1", - "xYOv2UsoAuKptIEAjkeB62Oaeg1Jn2QX" + "ahrUt7DkBom8m2EAs0zLSccaylYIuVfF", + "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU" ], "realms": [ "google-oauth2" @@ -5399,14 +5003,14 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PATCH", - "path": "/api/v2/connections/con_URfc5OIXMzEJtZaz/clients", + "path": "/api/v2/connections/con_lfhXlIY73LFJlMks/clients", "body": [ { - "client_id": "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1", + "client_id": "ahrUt7DkBom8m2EAs0zLSccaylYIuVfF", "status": true }, { - "client_id": "xYOv2UsoAuKptIEAjkeB62Oaeg1Jn2QX", + "client_id": "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU", "status": true } ], @@ -5555,7 +5159,7 @@ "subject": "deprecated" } ], - "client_id": "uf1Ju9xwQ09AWpcnRnwD91W3Sv3bf76S", + "client_id": "0ltKN06qv5WnNoNz2Fu6QvyOl2o6K6nE", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -5600,7 +5204,7 @@ "subject": "deprecated" } ], - "client_id": "WYPQxuqDdeNZHLcJeuPq0AvuNFtMiUgU", + "client_id": "HC5UXDFP5lEc2vbTkPQWJ1yYeiLRkmDg", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -5654,7 +5258,7 @@ } ], "allowed_origins": [], - "client_id": "QwKFSZ87TYF89lXp66sVFpGzYGQ07OU6", + "client_id": "KjqnjAT6PWajvX3XKVkWhFVaW8sFBWyv", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -5700,7 +5304,7 @@ "subject": "deprecated" } ], - "client_id": "VvKPDeB2QHhtG4tVBNcrRUuChB0jWefu", + "client_id": "GH55Wtak9aTrj6tjRFObq1cqnu5a8mtM", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -5719,14 +5323,9 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "Test SPA", + "name": "The Default App", "allowed_clients": [], - "allowed_logout_urls": [ - "http://localhost:3000" - ], - "callbacks": [ - "http://localhost:3000" - ], + "callbacks": [], "client_metadata": {}, "is_first_party": true, "native_social_login": { @@ -5737,16 +5336,17 @@ "enabled": false } }, - "oidc_conformant": true, + "oidc_conformant": false, "refresh_token": { - "expiration_type": "expiring", + "expiration_type": "non-expiring", "leeway": 0, + "infinite_token_lifetime": true, + "infinite_idle_token_lifetime": true, "token_lifetime": 2592000, "idle_token_lifetime": 1296000, - "infinite_token_lifetime": false, - "infinite_idle_token_lifetime": false, - "rotation_type": "rotating" + "rotation_type": "non-rotating" }, + "sso": false, "sso_disabled": false, "cross_origin_authentication": false, "cross_origin_auth": false, @@ -5757,7 +5357,7 @@ "subject": "deprecated" } ], - "client_id": "xODbqyam7rjqHDsYKjU9Tuo99yaBnR5T", + "client_id": "ahrUt7DkBom8m2EAs0zLSccaylYIuVfF", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -5766,15 +5366,12 @@ "secret_encoded": false }, "client_aliases": [], - "token_endpoint_auth_method": "none", - "app_type": "spa", + "token_endpoint_auth_method": "client_secret_post", "grant_types": [ "authorization_code", "implicit", - "refresh_token" - ], - "web_origins": [ - "http://localhost:3000" + "refresh_token", + "client_credentials" ], "custom_login_page_on": true }, @@ -5782,9 +5379,14 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "auth0-deploy-cli-extension", + "name": "Test SPA", "allowed_clients": [], - "callbacks": [], + "allowed_logout_urls": [ + "http://localhost:3000" + ], + "callbacks": [ + "http://localhost:3000" + ], "client_metadata": {}, "is_first_party": true, "native_social_login": { @@ -5797,13 +5399,13 @@ }, "oidc_conformant": true, "refresh_token": { - "expiration_type": "non-expiring", + "expiration_type": "expiring", "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" + "token_lifetime": 2592000, + "idle_token_lifetime": 1296000, + "infinite_token_lifetime": false, + "infinite_idle_token_lifetime": false, + "rotation_type": "rotating" }, "sso_disabled": false, "cross_origin_authentication": false, @@ -5815,7 +5417,7 @@ "subject": "deprecated" } ], - "client_id": "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1", + "client_id": "68Ty4a89yPogS0UGdX8aYaS6td9DXYjs", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -5824,10 +5426,15 @@ "secret_encoded": false }, "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", + "token_endpoint_auth_method": "none", + "app_type": "spa", "grant_types": [ - "client_credentials" + "authorization_code", + "implicit", + "refresh_token" + ], + "web_origins": [ + "http://localhost:3000" ], "custom_login_page_on": true }, @@ -5835,7 +5442,7 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "The Default App", + "name": "auth0-deploy-cli-extension", "allowed_clients": [], "callbacks": [], "client_metadata": {}, @@ -5848,17 +5455,16 @@ "enabled": false } }, - "oidc_conformant": false, + "oidc_conformant": true, "refresh_token": { "expiration_type": "non-expiring", "leeway": 0, "infinite_token_lifetime": true, "infinite_idle_token_lifetime": true, - "token_lifetime": 2592000, - "idle_token_lifetime": 1296000, + "token_lifetime": 31557600, + "idle_token_lifetime": 2592000, "rotation_type": "non-rotating" }, - "sso": false, "sso_disabled": false, "cross_origin_authentication": false, "cross_origin_auth": false, @@ -5869,7 +5475,7 @@ "subject": "deprecated" } ], - "client_id": "xYOv2UsoAuKptIEAjkeB62Oaeg1Jn2QX", + "client_id": "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -5879,10 +5485,8 @@ }, "client_aliases": [], "token_endpoint_auth_method": "client_secret_post", + "app_type": "non_interactive", "grant_types": [ - "authorization_code", - "implicit", - "refresh_token", "client_credentials" ], "custom_login_page_on": true @@ -5932,17 +5536,14 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/client-grants?per_page=100&page=0&include_totals=true", + "path": "/api/v2/client-grants?take=50", "body": "", "status": 200, "response": { - "total": 3, - "start": 0, - "limit": 100, "client_grants": [ { - "id": "cgr_X9WoUpI87FLuMfUp", - "client_id": "VvKPDeB2QHhtG4tVBNcrRUuChB0jWefu", + "id": "cgr_S92D2BBPB2wQXFYC", + "client_id": "GH55Wtak9aTrj6tjRFObq1cqnu5a8mtM", "audience": "https://auth0-deploy-cli-e2e.us.auth0.com/api/v2/", "scope": [ "read:client_grants", @@ -6079,8 +5680,8 @@ "subject_type": "client" }, { - "id": "cgr_pbwejzhwoujrsNE8", - "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", + "id": "cgr_UQhGxDPGii0tSQcs", + "client_id": "0ltKN06qv5WnNoNz2Fu6QvyOl2o6K6nE", "audience": "https://auth0-deploy-cli-e2e.us.auth0.com/api/v2/", "scope": [ "read:client_grants", @@ -6107,10 +5708,6 @@ "update:client_keys", "delete:client_keys", "create:client_keys", - "read:client_credentials", - "update:client_credentials", - "delete:client_credentials", - "create:client_credentials", "read:connections", "update:connections", "delete:connections", @@ -6200,19 +5797,10 @@ "read:entitlements", "read:attack_protection", "update:attack_protection", - "read:organizations_summary", - "create:authentication_methods", - "read:authentication_methods", - "update:authentication_methods", - "delete:authentication_methods", "read:organizations", "update:organizations", "create:organizations", "delete:organizations", - "read:organization_discovery_domains", - "update:organization_discovery_domains", - "create:organization_discovery_domains", - "delete:organization_discovery_domains", "create:organization_members", "read:organization_members", "delete:organization_members", @@ -6225,97 +5813,13 @@ "delete:organization_member_roles", "create:organization_invitations", "read:organization_invitations", - "delete:organization_invitations", - "read:scim_config", - "create:scim_config", - "update:scim_config", - "delete:scim_config", - "create:scim_token", - "read:scim_token", - "delete:scim_token", - "delete:phone_providers", - "create:phone_providers", - "read:phone_providers", - "update:phone_providers", - "delete:phone_templates", - "create:phone_templates", - "read:phone_templates", - "update:phone_templates", - "create:encryption_keys", - "read:encryption_keys", - "update:encryption_keys", - "delete:encryption_keys", - "read:sessions", - "update:sessions", - "delete:sessions", - "read:refresh_tokens", - "delete:refresh_tokens", - "create:self_service_profiles", - "read:self_service_profiles", - "update:self_service_profiles", - "delete:self_service_profiles", - "create:sso_access_tickets", - "delete:sso_access_tickets", - "read:forms", - "update:forms", - "delete:forms", - "create:forms", - "read:flows", - "update:flows", - "delete:flows", - "create:flows", - "read:flows_vault", - "read:flows_vault_connections", - "update:flows_vault_connections", - "delete:flows_vault_connections", - "create:flows_vault_connections", - "read:flows_executions", - "delete:flows_executions", - "read:connections_options", - "update:connections_options", - "read:self_service_profile_custom_texts", - "update:self_service_profile_custom_texts", - "create:network_acls", - "update:network_acls", - "read:network_acls", - "delete:network_acls", - "delete:vdcs_templates", - "read:vdcs_templates", - "create:vdcs_templates", - "update:vdcs_templates", - "create:custom_signing_keys", - "read:custom_signing_keys", - "update:custom_signing_keys", - "delete:custom_signing_keys", - "read:federated_connections_tokens", - "delete:federated_connections_tokens", - "create:user_attribute_profiles", - "read:user_attribute_profiles", - "update:user_attribute_profiles", - "delete:user_attribute_profiles", - "read:event_streams", - "create:event_streams", - "delete:event_streams", - "update:event_streams", - "read:event_deliveries", - "update:event_deliveries", - "create:connection_profiles", - "read:connection_profiles", - "update:connection_profiles", - "delete:connection_profiles", - "read:organization_client_grants", - "create:organization_client_grants", - "delete:organization_client_grants", - "read:security_metrics", - "read:connections_keys", - "update:connections_keys", - "create:connections_keys" + "delete:organization_invitations" ], "subject_type": "client" }, { - "id": "cgr_s9W4N1r5PKXB4V8l", - "client_id": "uf1Ju9xwQ09AWpcnRnwD91W3Sv3bf76S", + "id": "cgr_pbwejzhwoujrsNE8", + "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", "audience": "https://auth0-deploy-cli-e2e.us.auth0.com/api/v2/", "scope": [ "read:client_grants", @@ -6342,6 +5846,10 @@ "update:client_keys", "delete:client_keys", "create:client_keys", + "read:client_credentials", + "update:client_credentials", + "delete:client_credentials", + "create:client_credentials", "read:connections", "update:connections", "delete:connections", @@ -6431,10 +5939,19 @@ "read:entitlements", "read:attack_protection", "update:attack_protection", + "read:organizations_summary", + "create:authentication_methods", + "read:authentication_methods", + "update:authentication_methods", + "delete:authentication_methods", "read:organizations", "update:organizations", "create:organizations", "delete:organizations", + "read:organization_discovery_domains", + "update:organization_discovery_domains", + "create:organization_discovery_domains", + "delete:organization_discovery_domains", "create:organization_members", "read:organization_members", "delete:organization_members", @@ -6447,7 +5964,91 @@ "delete:organization_member_roles", "create:organization_invitations", "read:organization_invitations", - "delete:organization_invitations" + "delete:organization_invitations", + "read:scim_config", + "create:scim_config", + "update:scim_config", + "delete:scim_config", + "create:scim_token", + "read:scim_token", + "delete:scim_token", + "delete:phone_providers", + "create:phone_providers", + "read:phone_providers", + "update:phone_providers", + "delete:phone_templates", + "create:phone_templates", + "read:phone_templates", + "update:phone_templates", + "create:encryption_keys", + "read:encryption_keys", + "update:encryption_keys", + "delete:encryption_keys", + "read:sessions", + "update:sessions", + "delete:sessions", + "read:refresh_tokens", + "delete:refresh_tokens", + "create:self_service_profiles", + "read:self_service_profiles", + "update:self_service_profiles", + "delete:self_service_profiles", + "create:sso_access_tickets", + "delete:sso_access_tickets", + "read:forms", + "update:forms", + "delete:forms", + "create:forms", + "read:flows", + "update:flows", + "delete:flows", + "create:flows", + "read:flows_vault", + "read:flows_vault_connections", + "update:flows_vault_connections", + "delete:flows_vault_connections", + "create:flows_vault_connections", + "read:flows_executions", + "delete:flows_executions", + "read:connections_options", + "update:connections_options", + "read:self_service_profile_custom_texts", + "update:self_service_profile_custom_texts", + "create:network_acls", + "update:network_acls", + "read:network_acls", + "delete:network_acls", + "delete:vdcs_templates", + "read:vdcs_templates", + "create:vdcs_templates", + "update:vdcs_templates", + "create:custom_signing_keys", + "read:custom_signing_keys", + "update:custom_signing_keys", + "delete:custom_signing_keys", + "read:federated_connections_tokens", + "delete:federated_connections_tokens", + "create:user_attribute_profiles", + "read:user_attribute_profiles", + "update:user_attribute_profiles", + "delete:user_attribute_profiles", + "read:event_streams", + "create:event_streams", + "delete:event_streams", + "update:event_streams", + "read:event_deliveries", + "update:event_deliveries", + "create:connection_profiles", + "read:connection_profiles", + "update:connection_profiles", + "delete:connection_profiles", + "read:organization_client_grants", + "create:organization_client_grants", + "delete:organization_client_grants", + "read:security_metrics", + "read:connections_keys", + "update:connections_keys", + "create:connections_keys" ], "subject_type": "client" } @@ -6459,7 +6060,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PATCH", - "path": "/api/v2/client-grants/cgr_X9WoUpI87FLuMfUp", + "path": "/api/v2/client-grants/cgr_UQhGxDPGii0tSQcs", "body": { "scope": [ "read:client_grants", @@ -6596,8 +6197,8 @@ }, "status": 200, "response": { - "id": "cgr_X9WoUpI87FLuMfUp", - "client_id": "VvKPDeB2QHhtG4tVBNcrRUuChB0jWefu", + "id": "cgr_UQhGxDPGii0tSQcs", + "client_id": "0ltKN06qv5WnNoNz2Fu6QvyOl2o6K6nE", "audience": "https://auth0-deploy-cli-e2e.us.auth0.com/api/v2/", "scope": [ "read:client_grants", @@ -6739,7 +6340,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PATCH", - "path": "/api/v2/client-grants/cgr_s9W4N1r5PKXB4V8l", + "path": "/api/v2/client-grants/cgr_S92D2BBPB2wQXFYC", "body": { "scope": [ "read:client_grants", @@ -6876,8 +6477,8 @@ }, "status": 200, "response": { - "id": "cgr_s9W4N1r5PKXB4V8l", - "client_id": "uf1Ju9xwQ09AWpcnRnwD91W3Sv3bf76S", + "id": "cgr_S92D2BBPB2wQXFYC", + "client_id": "GH55Wtak9aTrj6tjRFObq1cqnu5a8mtM", "audience": "https://auth0-deploy-cli-e2e.us.auth0.com/api/v2/", "scope": [ "read:client_grants", @@ -7025,22 +6626,22 @@ "response": { "roles": [ { - "id": "rol_fYWtGL9q5Foq7oJD", + "id": "rol_nvXgdsT2ksrlrQpN", "name": "Admin", "description": "Can read and write things" }, { - "id": "rol_iHF8WkcFPvQFJlvd", + "id": "rol_DW7eDROpAD03JEhC", "name": "Reader", "description": "Can only read things" }, { - "id": "rol_AHn82p4ofrvBg4g5", + "id": "rol_TDHVhZp26Ti7nQt2", "name": "read_only", "description": "Read Only" }, { - "id": "rol_J3tWLDMM6zuxlUiT", + "id": "rol_6uNKN3FdNBPgcRFM", "name": "read_osnly", "description": "Readz Only" } @@ -7055,7 +6656,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/roles/rol_fYWtGL9q5Foq7oJD/permissions?per_page=100&page=0&include_totals=true", + "path": "/api/v2/roles/rol_nvXgdsT2ksrlrQpN/permissions?per_page=100&page=0&include_totals=true", "body": "", "status": 200, "response": { @@ -7070,7 +6671,22 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/roles/rol_iHF8WkcFPvQFJlvd/permissions?per_page=100&page=0&include_totals=true", + "path": "/api/v2/roles/rol_nvXgdsT2ksrlrQpN/permissions?per_page=100&page=1&include_totals=true", + "body": "", + "status": 200, + "response": { + "permissions": [], + "start": 100, + "limit": 100, + "total": 0 + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/roles/rol_DW7eDROpAD03JEhC/permissions?per_page=100&page=0&include_totals=true", "body": "", "status": 200, "response": { @@ -7085,7 +6701,22 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/roles/rol_AHn82p4ofrvBg4g5/permissions?per_page=100&page=0&include_totals=true", + "path": "/api/v2/roles/rol_DW7eDROpAD03JEhC/permissions?per_page=100&page=1&include_totals=true", + "body": "", + "status": 200, + "response": { + "permissions": [], + "start": 100, + "limit": 100, + "total": 0 + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/roles/rol_TDHVhZp26Ti7nQt2/permissions?per_page=100&page=0&include_totals=true", "body": "", "status": 200, "response": { @@ -7100,7 +6731,22 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/roles/rol_J3tWLDMM6zuxlUiT/permissions?per_page=100&page=0&include_totals=true", + "path": "/api/v2/roles/rol_TDHVhZp26Ti7nQt2/permissions?per_page=100&page=1&include_totals=true", + "body": "", + "status": 200, + "response": { + "permissions": [], + "start": 100, + "limit": 100, + "total": 0 + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/roles/rol_6uNKN3FdNBPgcRFM/permissions?per_page=100&page=0&include_totals=true", "body": "", "status": 200, "response": { @@ -7112,17 +6758,32 @@ "rawHeaders": [], "responseIsBinary": false }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/roles/rol_6uNKN3FdNBPgcRFM/permissions?per_page=100&page=1&include_totals=true", + "body": "", + "status": 200, + "response": { + "permissions": [], + "start": 100, + "limit": 100, + "total": 0 + }, + "rawHeaders": [], + "responseIsBinary": false + }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PATCH", - "path": "/api/v2/roles/rol_fYWtGL9q5Foq7oJD", + "path": "/api/v2/roles/rol_nvXgdsT2ksrlrQpN", "body": { "name": "Admin", "description": "Can read and write things" }, "status": 200, "response": { - "id": "rol_fYWtGL9q5Foq7oJD", + "id": "rol_nvXgdsT2ksrlrQpN", "name": "Admin", "description": "Can read and write things" }, @@ -7132,14 +6793,14 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PATCH", - "path": "/api/v2/roles/rol_iHF8WkcFPvQFJlvd", + "path": "/api/v2/roles/rol_DW7eDROpAD03JEhC", "body": { "name": "Reader", "description": "Can only read things" }, "status": 200, "response": { - "id": "rol_iHF8WkcFPvQFJlvd", + "id": "rol_DW7eDROpAD03JEhC", "name": "Reader", "description": "Can only read things" }, @@ -7149,14 +6810,14 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PATCH", - "path": "/api/v2/roles/rol_AHn82p4ofrvBg4g5", + "path": "/api/v2/roles/rol_TDHVhZp26Ti7nQt2", "body": { "name": "read_only", "description": "Read Only" }, "status": 200, "response": { - "id": "rol_AHn82p4ofrvBg4g5", + "id": "rol_TDHVhZp26Ti7nQt2", "name": "read_only", "description": "Read Only" }, @@ -7166,14 +6827,14 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PATCH", - "path": "/api/v2/roles/rol_J3tWLDMM6zuxlUiT", + "path": "/api/v2/roles/rol_6uNKN3FdNBPgcRFM", "body": { "name": "read_osnly", "description": "Readz Only" }, "status": 200, "response": { - "id": "rol_J3tWLDMM6zuxlUiT", + "id": "rol_6uNKN3FdNBPgcRFM", "name": "read_osnly", "description": "Readz Only" }, @@ -7209,7 +6870,7 @@ "okta" ], "created_at": "2024-11-26T11:58:18.962Z", - "updated_at": "2025-12-05T07:02:09.046Z", + "updated_at": "2025-12-16T10:13:05.041Z", "branding": { "colors": { "primary": "#19aecc" @@ -7285,7 +6946,7 @@ "okta" ], "created_at": "2024-11-26T11:58:18.962Z", - "updated_at": "2025-12-05T07:04:31.162Z", + "updated_at": "2025-12-16T10:15:07.545Z", "branding": { "colors": { "primary": "#19aecc" @@ -7452,7 +7113,7 @@ "subject": "deprecated" } ], - "client_id": "uf1Ju9xwQ09AWpcnRnwD91W3Sv3bf76S", + "client_id": "0ltKN06qv5WnNoNz2Fu6QvyOl2o6K6nE", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -7497,7 +7158,7 @@ "subject": "deprecated" } ], - "client_id": "WYPQxuqDdeNZHLcJeuPq0AvuNFtMiUgU", + "client_id": "HC5UXDFP5lEc2vbTkPQWJ1yYeiLRkmDg", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -7551,7 +7212,7 @@ } ], "allowed_origins": [], - "client_id": "QwKFSZ87TYF89lXp66sVFpGzYGQ07OU6", + "client_id": "KjqnjAT6PWajvX3XKVkWhFVaW8sFBWyv", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -7597,7 +7258,7 @@ "subject": "deprecated" } ], - "client_id": "VvKPDeB2QHhtG4tVBNcrRUuChB0jWefu", + "client_id": "GH55Wtak9aTrj6tjRFObq1cqnu5a8mtM", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -7616,14 +7277,9 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "Test SPA", + "name": "The Default App", "allowed_clients": [], - "allowed_logout_urls": [ - "http://localhost:3000" - ], - "callbacks": [ - "http://localhost:3000" - ], + "callbacks": [], "client_metadata": {}, "is_first_party": true, "native_social_login": { @@ -7634,16 +7290,17 @@ "enabled": false } }, - "oidc_conformant": true, + "oidc_conformant": false, "refresh_token": { - "expiration_type": "expiring", + "expiration_type": "non-expiring", "leeway": 0, + "infinite_token_lifetime": true, + "infinite_idle_token_lifetime": true, "token_lifetime": 2592000, "idle_token_lifetime": 1296000, - "infinite_token_lifetime": false, - "infinite_idle_token_lifetime": false, - "rotation_type": "rotating" + "rotation_type": "non-rotating" }, + "sso": false, "sso_disabled": false, "cross_origin_authentication": false, "cross_origin_auth": false, @@ -7654,7 +7311,7 @@ "subject": "deprecated" } ], - "client_id": "xODbqyam7rjqHDsYKjU9Tuo99yaBnR5T", + "client_id": "ahrUt7DkBom8m2EAs0zLSccaylYIuVfF", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -7663,15 +7320,12 @@ "secret_encoded": false }, "client_aliases": [], - "token_endpoint_auth_method": "none", - "app_type": "spa", + "token_endpoint_auth_method": "client_secret_post", "grant_types": [ "authorization_code", "implicit", - "refresh_token" - ], - "web_origins": [ - "http://localhost:3000" + "refresh_token", + "client_credentials" ], "custom_login_page_on": true }, @@ -7679,9 +7333,14 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "auth0-deploy-cli-extension", + "name": "Test SPA", "allowed_clients": [], - "callbacks": [], + "allowed_logout_urls": [ + "http://localhost:3000" + ], + "callbacks": [ + "http://localhost:3000" + ], "client_metadata": {}, "is_first_party": true, "native_social_login": { @@ -7694,13 +7353,13 @@ }, "oidc_conformant": true, "refresh_token": { - "expiration_type": "non-expiring", + "expiration_type": "expiring", "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" + "token_lifetime": 2592000, + "idle_token_lifetime": 1296000, + "infinite_token_lifetime": false, + "infinite_idle_token_lifetime": false, + "rotation_type": "rotating" }, "sso_disabled": false, "cross_origin_authentication": false, @@ -7712,7 +7371,7 @@ "subject": "deprecated" } ], - "client_id": "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1", + "client_id": "68Ty4a89yPogS0UGdX8aYaS6td9DXYjs", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -7721,10 +7380,15 @@ "secret_encoded": false }, "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", + "token_endpoint_auth_method": "none", + "app_type": "spa", "grant_types": [ - "client_credentials" + "authorization_code", + "implicit", + "refresh_token" + ], + "web_origins": [ + "http://localhost:3000" ], "custom_login_page_on": true }, @@ -7732,7 +7396,7 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "The Default App", + "name": "auth0-deploy-cli-extension", "allowed_clients": [], "callbacks": [], "client_metadata": {}, @@ -7745,17 +7409,16 @@ "enabled": false } }, - "oidc_conformant": false, + "oidc_conformant": true, "refresh_token": { "expiration_type": "non-expiring", "leeway": 0, "infinite_token_lifetime": true, "infinite_idle_token_lifetime": true, - "token_lifetime": 2592000, - "idle_token_lifetime": 1296000, + "token_lifetime": 31557600, + "idle_token_lifetime": 2592000, "rotation_type": "non-rotating" }, - "sso": false, "sso_disabled": false, "cross_origin_authentication": false, "cross_origin_auth": false, @@ -7766,7 +7429,7 @@ "subject": "deprecated" } ], - "client_id": "xYOv2UsoAuKptIEAjkeB62Oaeg1Jn2QX", + "client_id": "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -7776,10 +7439,8 @@ }, "client_aliases": [], "token_endpoint_auth_method": "client_secret_post", + "app_type": "non_interactive", "grant_types": [ - "authorization_code", - "implicit", - "refresh_token", "client_credentials" ], "custom_login_page_on": true @@ -7829,13 +7490,18 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/organizations?include_totals=true", + "path": "/api/v2/organizations?take=50", "body": "", "status": 200, "response": { "organizations": [ { - "id": "org_nSblOG7yUuWAHLOG", + "id": "org_rupfjUkVVvnPPk1y", + "name": "org2", + "display_name": "Organization2" + }, + { + "id": "org_YQGLuGuqRYrilmSQ", "name": "org1", "display_name": "Organization", "branding": { @@ -7844,16 +7510,8 @@ "primary": "#57ddff" } } - }, - { - "id": "org_vhEUeSlhgjQLTFPE", - "name": "org2", - "display_name": "Organization2" } - ], - "start": 0, - "limit": 50, - "total": 2 + ] }, "rawHeaders": [], "responseIsBinary": false @@ -7861,28 +7519,14 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/organizations?include_totals=true&take=50", + "path": "/api/v2/organizations/org_rupfjUkVVvnPPk1y/enabled_connections?page=0&per_page=50&include_totals=true", "body": "", "status": 200, "response": { - "organizations": [ - { - "id": "org_nSblOG7yUuWAHLOG", - "name": "org1", - "display_name": "Organization", - "branding": { - "colors": { - "page_background": "#fff5f5", - "primary": "#57ddff" - } - } - }, - { - "id": "org_vhEUeSlhgjQLTFPE", - "name": "org2", - "display_name": "Organization2" - } - ] + "enabled_connections": [], + "start": 0, + "limit": 0, + "total": 0 }, "rawHeaders": [], "responseIsBinary": false @@ -7890,23 +7534,43 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/organizations/org_nSblOG7yUuWAHLOG/enabled_connections", + "path": "/api/v2/organizations/org_rupfjUkVVvnPPk1y/enabled_connections?page=1&per_page=50&include_totals=true", "body": "", "status": 200, - "response": [], + "response": { + "enabled_connections": [], + "start": 0, + "limit": 0, + "total": 0 + }, "rawHeaders": [], "responseIsBinary": false }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/organizations/org_nSblOG7yUuWAHLOG/client-grants?page=0&per_page=100&include_totals=true", + "path": "/api/v2/organizations/org_rupfjUkVVvnPPk1y/client-grants?page=0&per_page=50&include_totals=true", "body": "", "status": 200, "response": { "client_grants": [], "start": 0, - "limit": 100, + "limit": 50, + "total": 0 + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/organizations/org_rupfjUkVVvnPPk1y/client-grants?page=1&per_page=50&include_totals=true", + "body": "", + "status": 200, + "response": { + "client_grants": [], + "start": 50, + "limit": 50, "total": 0 }, "rawHeaders": [], @@ -7915,7 +7579,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/organizations/org_nSblOG7yUuWAHLOG/discovery-domains?take=50", + "path": "/api/v2/organizations/org_rupfjUkVVvnPPk1y/discovery-domains?take=50", "body": "", "status": 200, "response": { @@ -7927,23 +7591,25 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/organizations/org_vhEUeSlhgjQLTFPE/enabled_connections", + "path": "/api/v2/organizations/org_rupfjUkVVvnPPk1y/discovery-domains?take=50", "body": "", "status": 200, - "response": [], + "response": { + "domains": [] + }, "rawHeaders": [], "responseIsBinary": false }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/organizations/org_vhEUeSlhgjQLTFPE/client-grants?page=0&per_page=100&include_totals=true", + "path": "/api/v2/organizations/org_YQGLuGuqRYrilmSQ/enabled_connections?page=0&per_page=50&include_totals=true", "body": "", "status": 200, "response": { - "client_grants": [], + "enabled_connections": [], "start": 0, - "limit": 100, + "limit": 0, "total": 0 }, "rawHeaders": [], @@ -7952,11 +7618,14 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/organizations/org_vhEUeSlhgjQLTFPE/discovery-domains?take=50", + "path": "/api/v2/organizations/org_YQGLuGuqRYrilmSQ/enabled_connections?page=1&per_page=50&include_totals=true", "body": "", "status": 200, "response": { - "domains": [] + "enabled_connections": [], + "start": 0, + "limit": 0, + "total": 0 }, "rawHeaders": [], "responseIsBinary": false @@ -7964,110 +7633,53 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections?include_totals=true", + "path": "/api/v2/organizations/org_YQGLuGuqRYrilmSQ/client-grants?page=0&per_page=50&include_totals=true", "body": "", "status": 200, "response": { - "total": 2, + "client_grants": [], "start": 0, "limit": 50, - "connections": [ - { - "id": "con_fuBNFcmY8aL3HDBT", - "options": { - "mfa": { - "active": true, - "return_enroll_settings": true - }, - "import_mode": false, - "customScripts": { - "login": "function login(email, password, callback) {\n // This script should authenticate a user against the credentials stored in\n // your database.\n // It is executed when a user attempts to log in or immediately after signing\n // up (as a verification that the user was successfully signed up).\n //\n // Everything returned by this script will be set as part of the user profile\n // and will be visible by any of the tenant admins. Avoid adding attributes\n // with values such as passwords, keys, secrets, etc.\n //\n // The `password` parameter of this function is in plain text. It must be\n // hashed/salted to match whatever is stored in your database. For example:\n //\n // var bcrypt = require('bcrypt@0.8.5');\n // bcrypt.compare(password, dbPasswordHash, function(err, res)) { ... }\n //\n // There are three ways this script can finish:\n // 1. The user's credentials are valid. The returned user profile should be in\n // the following format: https://auth0.com/docs/users/normalized/auth0/normalized-user-profile-schema\n // var profile = {\n // user_id: ..., // user_id is mandatory\n // email: ...,\n // [...]\n // };\n // callback(null, profile);\n // 2. The user's credentials are invalid\n // callback(new WrongUsernameOrPasswordError(email, \"my error message\"));\n // 3. Something went wrong while trying to reach your database\n // callback(new Error(\"my error message\"));\n //\n // A list of Node.js modules which can be referenced is available here:\n //\n // https://tehsis.github.io/webtaskio-canirequire/\n console.log('AYYYYYE');\n\n const msg =\n 'Please implement the Login script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "create": "function create(user, callback) {\n // This script should create a user entry in your existing database. It will\n // be executed when a user attempts to sign up, or when a user is created\n // through the Auth0 dashboard or API.\n // When this script has finished executing, the Login script will be\n // executed immediately afterwards, to verify that the user was created\n // successfully.\n //\n // The user object will always contain the following properties:\n // * email: the user's email\n // * password: the password entered by the user, in plain text\n // * tenant: the name of this Auth0 account\n // * client_id: the client ID of the application where the user signed up, or\n // API key if created through the API or Auth0 dashboard\n // * connection: the name of this database connection\n //\n // There are three ways this script can finish:\n // 1. A user was successfully created\n // callback(null);\n // 2. This user already exists in your database\n // callback(new ValidationError(\"user_exists\", \"my error message\"));\n // 3. Something went wrong while trying to reach your database\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Create script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "delete": "function remove(id, callback) {\n // This script remove a user from your existing database.\n // It is executed whenever a user is deleted from the API or Auth0 dashboard.\n //\n // There are two ways that this script can finish:\n // 1. The user was removed successfully:\n // callback(null);\n // 2. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Delete script for this database ' +\n 'connection at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "verify": "function verify(email, callback) {\n // This script should mark the current user's email address as verified in\n // your database.\n // It is executed whenever a user clicks the verification link sent by email.\n // These emails can be customized at https://manage.auth0.com/#/emails.\n // It is safe to assume that the user's email already exists in your database,\n // because verification emails, if enabled, are sent immediately after a\n // successful signup.\n //\n // There are two ways that this script can finish:\n // 1. The user's email was verified successfully\n // callback(null, true);\n // 2. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n //\n // If an error is returned, it will be passed to the query string of the page\n // where the user is being redirected to after clicking the verification link.\n // For example, returning `callback(new Error(\"error\"))` and redirecting to\n // https://example.com would redirect to the following URL:\n // https://example.com?email=alice%40example.com&message=error&success=false\n\n const msg =\n 'Please implement the Verify script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "get_user": "function getByEmail(email, callback) {\n // This script should retrieve a user profile from your existing database,\n // without authenticating the user.\n // It is used to check if a user exists before executing flows that do not\n // require authentication (signup and password reset).\n //\n // There are three ways this script can finish:\n // 1. A user was successfully found. The profile should be in the following\n // format: https://auth0.com/docs/users/normalized/auth0/normalized-user-profile-schema.\n // callback(null, profile);\n // 2. A user was not found\n // callback(null);\n // 3. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Get User script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "change_password": "function changePassword(email, newPassword, callback) {\n // This script should change the password stored for the current user in your\n // database. It is executed when the user clicks on the confirmation link\n // after a reset password request.\n // The content and behavior of password confirmation emails can be customized\n // here: https://manage.auth0.com/#/emails\n // The `newPassword` parameter of this function is in plain text. It must be\n // hashed/salted to match whatever is stored in your database.\n //\n // There are three ways that this script can finish:\n // 1. The user's password was updated successfully:\n // callback(null, true);\n // 2. The user's password was not updated:\n // callback(null, false);\n // 3. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n //\n // If an error is returned, it will be passed to the query string of the page\n // where the user is being redirected to after clicking the confirmation link.\n // For example, returning `callback(new Error(\"error\"))` and redirecting to\n // https://example.com would redirect to the following URL:\n // https://example.com?email=alice%40example.com&message=error&success=false\n\n const msg =\n 'Please implement the Change Password script for this database ' +\n 'connection at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n" - }, - "disable_signup": false, - "passwordPolicy": "low", - "passkey_options": { - "challenge_ui": "both", - "local_enrollment_enabled": true, - "progressive_enrollment_enabled": true - }, - "password_history": { - "size": 5, - "enable": false - }, - "strategy_version": 2, - "requires_username": true, - "password_dictionary": { - "enable": true, - "dictionary": [] - }, - "authentication_methods": { - "passkey": { - "enabled": false - }, - "password": { - "enabled": true, - "api_behavior": "required" - } - }, - "brute_force_protection": true, - "password_no_personal_info": { - "enable": true - }, - "password_complexity_options": { - "min_length": 8 - }, - "enabledDatabaseCustomization": true - }, - "strategy": "auth0", - "name": "boo-baz-db-connection-test", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "boo-baz-db-connection-test" - ], - "enabled_clients": [ - "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1", - "QwKFSZ87TYF89lXp66sVFpGzYGQ07OU6" - ] - }, - { - "id": "con_URfc5OIXMzEJtZaz", - "options": { - "email": true, - "scope": [ - "email", - "profile" - ], - "profile": true - }, - "strategy": "google-oauth2", - "name": "google-oauth2", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "google-oauth2" - ], - "enabled_clients": [ - "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1", - "xYOv2UsoAuKptIEAjkeB62Oaeg1Jn2QX" - ] - } - ] + "total": 0 + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/organizations/org_YQGLuGuqRYrilmSQ/client-grants?page=1&per_page=50&include_totals=true", + "body": "", + "status": 200, + "response": { + "client_grants": [], + "start": 50, + "limit": 50, + "total": 0 + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/organizations/org_YQGLuGuqRYrilmSQ/discovery-domains?take=50", + "body": "", + "status": 200, + "response": { + "domains": [] + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/organizations/org_YQGLuGuqRYrilmSQ/discovery-domains?take=50", + "body": "", + "status": 200, + "response": { + "domains": [] }, "rawHeaders": [], "responseIsBinary": false @@ -8075,13 +7687,13 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections?include_totals=true&take=50", + "path": "/api/v2/connections?take=50", "body": "", "status": 200, "response": { "connections": [ { - "id": "con_fuBNFcmY8aL3HDBT", + "id": "con_cxSOS7uLgPojtLBh", "options": { "mfa": { "active": true, @@ -8144,12 +7756,12 @@ "boo-baz-db-connection-test" ], "enabled_clients": [ - "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1", - "QwKFSZ87TYF89lXp66sVFpGzYGQ07OU6" + "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU", + "KjqnjAT6PWajvX3XKVkWhFVaW8sFBWyv" ] }, { - "id": "con_URfc5OIXMzEJtZaz", + "id": "con_lfhXlIY73LFJlMks", "options": { "email": true, "scope": [ @@ -8171,8 +7783,8 @@ "google-oauth2" ], "enabled_clients": [ - "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1", - "xYOv2UsoAuKptIEAjkeB62Oaeg1Jn2QX" + "ahrUt7DkBom8m2EAs0zLSccaylYIuVfF", + "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU" ] } ] @@ -8183,595 +7795,68 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/client-grants?per_page=100&page=0&include_totals=true", + "path": "/api/v2/clients?page=0&per_page=100&include_totals=true", "body": "", "status": 200, "response": { - "total": 3, + "total": 9, "start": 0, "limit": 100, - "client_grants": [ + "clients": [ { - "id": "cgr_X9WoUpI87FLuMfUp", - "client_id": "VvKPDeB2QHhtG4tVBNcrRUuChB0jWefu", - "audience": "https://auth0-deploy-cli-e2e.us.auth0.com/api/v2/", - "scope": [ - "read:client_grants", - "create:client_grants", - "delete:client_grants", - "update:client_grants", - "read:users", - "update:users", - "delete:users", - "create:users", - "read:users_app_metadata", - "update:users_app_metadata", - "delete:users_app_metadata", - "create:users_app_metadata", - "read:user_custom_blocks", - "create:user_custom_blocks", - "delete:user_custom_blocks", - "create:user_tickets", - "read:clients", - "update:clients", - "delete:clients", - "create:clients", - "read:client_keys", - "update:client_keys", - "delete:client_keys", - "create:client_keys", - "read:connections", - "update:connections", - "delete:connections", - "create:connections", - "read:resource_servers", - "update:resource_servers", - "delete:resource_servers", - "create:resource_servers", - "read:device_credentials", - "update:device_credentials", - "delete:device_credentials", - "create:device_credentials", - "read:rules", - "update:rules", - "delete:rules", - "create:rules", - "read:rules_configs", - "update:rules_configs", - "delete:rules_configs", - "read:hooks", - "update:hooks", - "delete:hooks", - "create:hooks", - "read:actions", - "update:actions", - "delete:actions", - "create:actions", - "read:email_provider", - "update:email_provider", - "delete:email_provider", - "create:email_provider", - "blacklist:tokens", - "read:stats", - "read:insights", - "read:tenant_settings", - "update:tenant_settings", - "read:logs", - "read:logs_users", - "read:shields", - "create:shields", - "update:shields", - "delete:shields", - "read:anomaly_blocks", - "delete:anomaly_blocks", - "update:triggers", - "read:triggers", - "read:grants", - "delete:grants", - "read:guardian_factors", - "update:guardian_factors", - "read:guardian_enrollments", - "delete:guardian_enrollments", - "create:guardian_enrollment_tickets", - "read:user_idp_tokens", - "create:passwords_checking_job", - "delete:passwords_checking_job", - "read:custom_domains", - "delete:custom_domains", - "create:custom_domains", - "update:custom_domains", - "read:email_templates", - "create:email_templates", - "update:email_templates", - "read:mfa_policies", - "update:mfa_policies", - "read:roles", - "create:roles", - "delete:roles", - "update:roles", - "read:prompts", - "update:prompts", - "read:branding", - "update:branding", - "delete:branding", - "read:log_streams", - "create:log_streams", - "delete:log_streams", - "update:log_streams", - "create:signing_keys", - "read:signing_keys", - "update:signing_keys", - "read:limits", - "update:limits", - "create:role_members", - "read:role_members", - "delete:role_members", - "read:entitlements", - "read:attack_protection", - "update:attack_protection", - "read:organizations", - "update:organizations", - "create:organizations", - "delete:organizations", - "create:organization_members", - "read:organization_members", - "delete:organization_members", - "create:organization_connections", - "read:organization_connections", - "update:organization_connections", - "delete:organization_connections", - "create:organization_member_roles", - "read:organization_member_roles", - "delete:organization_member_roles", - "create:organization_invitations", - "read:organization_invitations", - "delete:organization_invitations" + "tenant": "auth0-deploy-cli-e2e", + "global": false, + "is_token_endpoint_ip_header_trusted": false, + "name": "Deploy CLI", + "is_first_party": true, + "oidc_conformant": true, + "sso_disabled": false, + "cross_origin_auth": false, + "refresh_token": { + "expiration_type": "non-expiring", + "leeway": 0, + "infinite_token_lifetime": true, + "infinite_idle_token_lifetime": true, + "token_lifetime": 31557600, + "idle_token_lifetime": 2592000, + "rotation_type": "non-rotating" + }, + "cross_origin_authentication": true, + "allowed_clients": [], + "callbacks": [], + "native_social_login": { + "apple": { + "enabled": false + }, + "facebook": { + "enabled": false + } + }, + "signing_keys": [ + { + "cert": "[REDACTED]", + "pkcs7": "[REDACTED]", + "subject": "deprecated" + } ], - "subject_type": "client" - }, - { - "id": "cgr_pbwejzhwoujrsNE8", - "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", - "audience": "https://auth0-deploy-cli-e2e.us.auth0.com/api/v2/", - "scope": [ - "read:client_grants", - "create:client_grants", - "delete:client_grants", - "update:client_grants", - "read:users", - "update:users", - "delete:users", - "create:users", - "read:users_app_metadata", - "update:users_app_metadata", - "delete:users_app_metadata", - "create:users_app_metadata", - "read:user_custom_blocks", - "create:user_custom_blocks", - "delete:user_custom_blocks", - "create:user_tickets", - "read:clients", - "update:clients", - "delete:clients", - "create:clients", - "read:client_keys", - "update:client_keys", - "delete:client_keys", - "create:client_keys", - "read:client_credentials", - "update:client_credentials", - "delete:client_credentials", - "create:client_credentials", - "read:connections", - "update:connections", - "delete:connections", - "create:connections", - "read:resource_servers", - "update:resource_servers", - "delete:resource_servers", - "create:resource_servers", - "read:device_credentials", - "update:device_credentials", - "delete:device_credentials", - "create:device_credentials", - "read:rules", - "update:rules", - "delete:rules", - "create:rules", - "read:rules_configs", - "update:rules_configs", - "delete:rules_configs", - "read:hooks", - "update:hooks", - "delete:hooks", - "create:hooks", - "read:actions", - "update:actions", - "delete:actions", - "create:actions", - "read:email_provider", - "update:email_provider", - "delete:email_provider", - "create:email_provider", - "blacklist:tokens", - "read:stats", - "read:insights", - "read:tenant_settings", - "update:tenant_settings", - "read:logs", - "read:logs_users", - "read:shields", - "create:shields", - "update:shields", - "delete:shields", - "read:anomaly_blocks", - "delete:anomaly_blocks", - "update:triggers", - "read:triggers", - "read:grants", - "delete:grants", - "read:guardian_factors", - "update:guardian_factors", - "read:guardian_enrollments", - "delete:guardian_enrollments", - "create:guardian_enrollment_tickets", - "read:user_idp_tokens", - "create:passwords_checking_job", - "delete:passwords_checking_job", - "read:custom_domains", - "delete:custom_domains", - "create:custom_domains", - "update:custom_domains", - "read:email_templates", - "create:email_templates", - "update:email_templates", - "read:mfa_policies", - "update:mfa_policies", - "read:roles", - "create:roles", - "delete:roles", - "update:roles", - "read:prompts", - "update:prompts", - "read:branding", - "update:branding", - "delete:branding", - "read:log_streams", - "create:log_streams", - "delete:log_streams", - "update:log_streams", - "create:signing_keys", - "read:signing_keys", - "update:signing_keys", - "read:limits", - "update:limits", - "create:role_members", - "read:role_members", - "delete:role_members", - "read:entitlements", - "read:attack_protection", - "update:attack_protection", - "read:organizations_summary", - "create:authentication_methods", - "read:authentication_methods", - "update:authentication_methods", - "delete:authentication_methods", - "read:organizations", - "update:organizations", - "create:organizations", - "delete:organizations", - "read:organization_discovery_domains", - "update:organization_discovery_domains", - "create:organization_discovery_domains", - "delete:organization_discovery_domains", - "create:organization_members", - "read:organization_members", - "delete:organization_members", - "create:organization_connections", - "read:organization_connections", - "update:organization_connections", - "delete:organization_connections", - "create:organization_member_roles", - "read:organization_member_roles", - "delete:organization_member_roles", - "create:organization_invitations", - "read:organization_invitations", - "delete:organization_invitations", - "read:scim_config", - "create:scim_config", - "update:scim_config", - "delete:scim_config", - "create:scim_token", - "read:scim_token", - "delete:scim_token", - "delete:phone_providers", - "create:phone_providers", - "read:phone_providers", - "update:phone_providers", - "delete:phone_templates", - "create:phone_templates", - "read:phone_templates", - "update:phone_templates", - "create:encryption_keys", - "read:encryption_keys", - "update:encryption_keys", - "delete:encryption_keys", - "read:sessions", - "update:sessions", - "delete:sessions", - "read:refresh_tokens", - "delete:refresh_tokens", - "create:self_service_profiles", - "read:self_service_profiles", - "update:self_service_profiles", - "delete:self_service_profiles", - "create:sso_access_tickets", - "delete:sso_access_tickets", - "read:forms", - "update:forms", - "delete:forms", - "create:forms", - "read:flows", - "update:flows", - "delete:flows", - "create:flows", - "read:flows_vault", - "read:flows_vault_connections", - "update:flows_vault_connections", - "delete:flows_vault_connections", - "create:flows_vault_connections", - "read:flows_executions", - "delete:flows_executions", - "read:connections_options", - "update:connections_options", - "read:self_service_profile_custom_texts", - "update:self_service_profile_custom_texts", - "create:network_acls", - "update:network_acls", - "read:network_acls", - "delete:network_acls", - "delete:vdcs_templates", - "read:vdcs_templates", - "create:vdcs_templates", - "update:vdcs_templates", - "create:custom_signing_keys", - "read:custom_signing_keys", - "update:custom_signing_keys", - "delete:custom_signing_keys", - "read:federated_connections_tokens", - "delete:federated_connections_tokens", - "create:user_attribute_profiles", - "read:user_attribute_profiles", - "update:user_attribute_profiles", - "delete:user_attribute_profiles", - "read:event_streams", - "create:event_streams", - "delete:event_streams", - "update:event_streams", - "read:event_deliveries", - "update:event_deliveries", - "create:connection_profiles", - "read:connection_profiles", - "update:connection_profiles", - "delete:connection_profiles", - "read:organization_client_grants", - "create:organization_client_grants", - "delete:organization_client_grants", - "read:security_metrics", - "read:connections_keys", - "update:connections_keys", - "create:connections_keys" - ], - "subject_type": "client" - }, - { - "id": "cgr_s9W4N1r5PKXB4V8l", - "client_id": "uf1Ju9xwQ09AWpcnRnwD91W3Sv3bf76S", - "audience": "https://auth0-deploy-cli-e2e.us.auth0.com/api/v2/", - "scope": [ - "read:client_grants", - "create:client_grants", - "delete:client_grants", - "update:client_grants", - "read:users", - "update:users", - "delete:users", - "create:users", - "read:users_app_metadata", - "update:users_app_metadata", - "delete:users_app_metadata", - "create:users_app_metadata", - "read:user_custom_blocks", - "create:user_custom_blocks", - "delete:user_custom_blocks", - "create:user_tickets", - "read:clients", - "update:clients", - "delete:clients", - "create:clients", - "read:client_keys", - "update:client_keys", - "delete:client_keys", - "create:client_keys", - "read:connections", - "update:connections", - "delete:connections", - "create:connections", - "read:resource_servers", - "update:resource_servers", - "delete:resource_servers", - "create:resource_servers", - "read:device_credentials", - "update:device_credentials", - "delete:device_credentials", - "create:device_credentials", - "read:rules", - "update:rules", - "delete:rules", - "create:rules", - "read:rules_configs", - "update:rules_configs", - "delete:rules_configs", - "read:hooks", - "update:hooks", - "delete:hooks", - "create:hooks", - "read:actions", - "update:actions", - "delete:actions", - "create:actions", - "read:email_provider", - "update:email_provider", - "delete:email_provider", - "create:email_provider", - "blacklist:tokens", - "read:stats", - "read:insights", - "read:tenant_settings", - "update:tenant_settings", - "read:logs", - "read:logs_users", - "read:shields", - "create:shields", - "update:shields", - "delete:shields", - "read:anomaly_blocks", - "delete:anomaly_blocks", - "update:triggers", - "read:triggers", - "read:grants", - "delete:grants", - "read:guardian_factors", - "update:guardian_factors", - "read:guardian_enrollments", - "delete:guardian_enrollments", - "create:guardian_enrollment_tickets", - "read:user_idp_tokens", - "create:passwords_checking_job", - "delete:passwords_checking_job", - "read:custom_domains", - "delete:custom_domains", - "create:custom_domains", - "update:custom_domains", - "read:email_templates", - "create:email_templates", - "update:email_templates", - "read:mfa_policies", - "update:mfa_policies", - "read:roles", - "create:roles", - "delete:roles", - "update:roles", - "read:prompts", - "update:prompts", - "read:branding", - "update:branding", - "delete:branding", - "read:log_streams", - "create:log_streams", - "delete:log_streams", - "update:log_streams", - "create:signing_keys", - "read:signing_keys", - "update:signing_keys", - "read:limits", - "update:limits", - "create:role_members", - "read:role_members", - "delete:role_members", - "read:entitlements", - "read:attack_protection", - "update:attack_protection", - "read:organizations", - "update:organizations", - "create:organizations", - "delete:organizations", - "create:organization_members", - "read:organization_members", - "delete:organization_members", - "create:organization_connections", - "read:organization_connections", - "update:organization_connections", - "delete:organization_connections", - "create:organization_member_roles", - "read:organization_member_roles", - "delete:organization_member_roles", - "create:organization_invitations", - "read:organization_invitations", - "delete:organization_invitations" - ], - "subject_type": "client" - } - ] - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/clients?page=0&per_page=100&include_totals=true", - "body": "", - "status": 200, - "response": { - "total": 9, - "start": 0, - "limit": 100, - "clients": [ - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Deploy CLI", - "is_first_party": true, - "oidc_conformant": true, - "sso_disabled": false, - "cross_origin_auth": false, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, - "cross_origin_authentication": true, - "allowed_clients": [], - "callbacks": [], - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", - "grant_types": [ - "client_credentials", - "implicit", - "authorization_code", - "refresh_token" - ], - "custom_login_page_on": true + "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", + "callback_url_template": false, + "client_secret": "[REDACTED]", + "jwt_configuration": { + "alg": "RS256", + "lifetime_in_seconds": 36000, + "secret_encoded": false + }, + "client_aliases": [], + "token_endpoint_auth_method": "client_secret_post", + "app_type": "non_interactive", + "grant_types": [ + "client_credentials", + "implicit", + "authorization_code", + "refresh_token" + ], + "custom_login_page_on": true }, { "tenant": "auth0-deploy-cli-e2e", @@ -8810,7 +7895,7 @@ "subject": "deprecated" } ], - "client_id": "uf1Ju9xwQ09AWpcnRnwD91W3Sv3bf76S", + "client_id": "0ltKN06qv5WnNoNz2Fu6QvyOl2o6K6nE", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -8855,7 +7940,7 @@ "subject": "deprecated" } ], - "client_id": "WYPQxuqDdeNZHLcJeuPq0AvuNFtMiUgU", + "client_id": "HC5UXDFP5lEc2vbTkPQWJ1yYeiLRkmDg", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -8909,7 +7994,7 @@ } ], "allowed_origins": [], - "client_id": "QwKFSZ87TYF89lXp66sVFpGzYGQ07OU6", + "client_id": "KjqnjAT6PWajvX3XKVkWhFVaW8sFBWyv", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -8955,7 +8040,7 @@ "subject": "deprecated" } ], - "client_id": "VvKPDeB2QHhtG4tVBNcrRUuChB0jWefu", + "client_id": "GH55Wtak9aTrj6tjRFObq1cqnu5a8mtM", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -8970,6 +8055,62 @@ ], "custom_login_page_on": true }, + { + "tenant": "auth0-deploy-cli-e2e", + "global": false, + "is_token_endpoint_ip_header_trusted": false, + "name": "The Default App", + "allowed_clients": [], + "callbacks": [], + "client_metadata": {}, + "is_first_party": true, + "native_social_login": { + "apple": { + "enabled": false + }, + "facebook": { + "enabled": false + } + }, + "oidc_conformant": false, + "refresh_token": { + "expiration_type": "non-expiring", + "leeway": 0, + "infinite_token_lifetime": true, + "infinite_idle_token_lifetime": true, + "token_lifetime": 2592000, + "idle_token_lifetime": 1296000, + "rotation_type": "non-rotating" + }, + "sso": false, + "sso_disabled": false, + "cross_origin_authentication": false, + "cross_origin_auth": false, + "signing_keys": [ + { + "cert": "[REDACTED]", + "pkcs7": "[REDACTED]", + "subject": "deprecated" + } + ], + "client_id": "ahrUt7DkBom8m2EAs0zLSccaylYIuVfF", + "callback_url_template": false, + "client_secret": "[REDACTED]", + "jwt_configuration": { + "alg": "RS256", + "lifetime_in_seconds": 36000, + "secret_encoded": false + }, + "client_aliases": [], + "token_endpoint_auth_method": "client_secret_post", + "grant_types": [ + "authorization_code", + "implicit", + "refresh_token", + "client_credentials" + ], + "custom_login_page_on": true + }, { "tenant": "auth0-deploy-cli-e2e", "global": false, @@ -9012,7 +8153,7 @@ "subject": "deprecated" } ], - "client_id": "xODbqyam7rjqHDsYKjU9Tuo99yaBnR5T", + "client_id": "68Ty4a89yPogS0UGdX8aYaS6td9DXYjs", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -9070,7 +8211,7 @@ "subject": "deprecated" } ], - "client_id": "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1", + "client_id": "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -9084,100 +8225,568 @@ "grant_types": [ "client_credentials" ], - "custom_login_page_on": true + "custom_login_page_on": true + }, + { + "tenant": "auth0-deploy-cli-e2e", + "global": true, + "callbacks": [], + "is_first_party": true, + "name": "All Applications", + "refresh_token": { + "expiration_type": "non-expiring", + "leeway": 0, + "infinite_token_lifetime": true, + "infinite_idle_token_lifetime": true, + "token_lifetime": 2592000, + "idle_token_lifetime": 1296000, + "rotation_type": "non-rotating" + }, + "owners": [ + "mr|samlp|okta|will.vedder@auth0.com", + "mr|google-oauth2|102002633619863830825", + "mr|samlp|okta|frederik.prijck@auth0.com", + "mr|google-oauth2|109614534713742077035", + "mr|google-oauth2|116771660953104383819", + "mr|google-oauth2|112839029247827700155", + "mr|samlp|okta|ewan.harris@auth0.com" + ], + "custom_login_page": "TEST123\n", + "cross_origin_authentication": true, + "signing_keys": [ + { + "cert": "[REDACTED]", + "pkcs7": "[REDACTED]", + "subject": "deprecated" + } + ], + "client_id": "Isi93ibGHIGwmdYjsLwTOn7Gu7nwxU3V", + "client_secret": "[REDACTED]", + "custom_login_page_on": true + } + ] + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/client-grants?take=50", + "body": "", + "status": 200, + "response": { + "client_grants": [ + { + "id": "cgr_S92D2BBPB2wQXFYC", + "client_id": "GH55Wtak9aTrj6tjRFObq1cqnu5a8mtM", + "audience": "https://auth0-deploy-cli-e2e.us.auth0.com/api/v2/", + "scope": [ + "read:client_grants", + "create:client_grants", + "delete:client_grants", + "update:client_grants", + "read:users", + "update:users", + "delete:users", + "create:users", + "read:users_app_metadata", + "update:users_app_metadata", + "delete:users_app_metadata", + "create:users_app_metadata", + "read:user_custom_blocks", + "create:user_custom_blocks", + "delete:user_custom_blocks", + "create:user_tickets", + "read:clients", + "update:clients", + "delete:clients", + "create:clients", + "read:client_keys", + "update:client_keys", + "delete:client_keys", + "create:client_keys", + "read:connections", + "update:connections", + "delete:connections", + "create:connections", + "read:resource_servers", + "update:resource_servers", + "delete:resource_servers", + "create:resource_servers", + "read:device_credentials", + "update:device_credentials", + "delete:device_credentials", + "create:device_credentials", + "read:rules", + "update:rules", + "delete:rules", + "create:rules", + "read:rules_configs", + "update:rules_configs", + "delete:rules_configs", + "read:hooks", + "update:hooks", + "delete:hooks", + "create:hooks", + "read:actions", + "update:actions", + "delete:actions", + "create:actions", + "read:email_provider", + "update:email_provider", + "delete:email_provider", + "create:email_provider", + "blacklist:tokens", + "read:stats", + "read:insights", + "read:tenant_settings", + "update:tenant_settings", + "read:logs", + "read:logs_users", + "read:shields", + "create:shields", + "update:shields", + "delete:shields", + "read:anomaly_blocks", + "delete:anomaly_blocks", + "update:triggers", + "read:triggers", + "read:grants", + "delete:grants", + "read:guardian_factors", + "update:guardian_factors", + "read:guardian_enrollments", + "delete:guardian_enrollments", + "create:guardian_enrollment_tickets", + "read:user_idp_tokens", + "create:passwords_checking_job", + "delete:passwords_checking_job", + "read:custom_domains", + "delete:custom_domains", + "create:custom_domains", + "update:custom_domains", + "read:email_templates", + "create:email_templates", + "update:email_templates", + "read:mfa_policies", + "update:mfa_policies", + "read:roles", + "create:roles", + "delete:roles", + "update:roles", + "read:prompts", + "update:prompts", + "read:branding", + "update:branding", + "delete:branding", + "read:log_streams", + "create:log_streams", + "delete:log_streams", + "update:log_streams", + "create:signing_keys", + "read:signing_keys", + "update:signing_keys", + "read:limits", + "update:limits", + "create:role_members", + "read:role_members", + "delete:role_members", + "read:entitlements", + "read:attack_protection", + "update:attack_protection", + "read:organizations", + "update:organizations", + "create:organizations", + "delete:organizations", + "create:organization_members", + "read:organization_members", + "delete:organization_members", + "create:organization_connections", + "read:organization_connections", + "update:organization_connections", + "delete:organization_connections", + "create:organization_member_roles", + "read:organization_member_roles", + "delete:organization_member_roles", + "create:organization_invitations", + "read:organization_invitations", + "delete:organization_invitations" + ], + "subject_type": "client" }, { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "The Default App", - "allowed_clients": [], - "callbacks": [], - "client_metadata": {}, - "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "oidc_conformant": false, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 2592000, - "idle_token_lifetime": 1296000, - "rotation_type": "non-rotating" - }, - "sso": false, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "xYOv2UsoAuKptIEAjkeB62Oaeg1Jn2QX", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "grant_types": [ - "authorization_code", - "implicit", - "refresh_token", - "client_credentials" + "id": "cgr_UQhGxDPGii0tSQcs", + "client_id": "0ltKN06qv5WnNoNz2Fu6QvyOl2o6K6nE", + "audience": "https://auth0-deploy-cli-e2e.us.auth0.com/api/v2/", + "scope": [ + "read:client_grants", + "create:client_grants", + "delete:client_grants", + "update:client_grants", + "read:users", + "update:users", + "delete:users", + "create:users", + "read:users_app_metadata", + "update:users_app_metadata", + "delete:users_app_metadata", + "create:users_app_metadata", + "read:user_custom_blocks", + "create:user_custom_blocks", + "delete:user_custom_blocks", + "create:user_tickets", + "read:clients", + "update:clients", + "delete:clients", + "create:clients", + "read:client_keys", + "update:client_keys", + "delete:client_keys", + "create:client_keys", + "read:connections", + "update:connections", + "delete:connections", + "create:connections", + "read:resource_servers", + "update:resource_servers", + "delete:resource_servers", + "create:resource_servers", + "read:device_credentials", + "update:device_credentials", + "delete:device_credentials", + "create:device_credentials", + "read:rules", + "update:rules", + "delete:rules", + "create:rules", + "read:rules_configs", + "update:rules_configs", + "delete:rules_configs", + "read:hooks", + "update:hooks", + "delete:hooks", + "create:hooks", + "read:actions", + "update:actions", + "delete:actions", + "create:actions", + "read:email_provider", + "update:email_provider", + "delete:email_provider", + "create:email_provider", + "blacklist:tokens", + "read:stats", + "read:insights", + "read:tenant_settings", + "update:tenant_settings", + "read:logs", + "read:logs_users", + "read:shields", + "create:shields", + "update:shields", + "delete:shields", + "read:anomaly_blocks", + "delete:anomaly_blocks", + "update:triggers", + "read:triggers", + "read:grants", + "delete:grants", + "read:guardian_factors", + "update:guardian_factors", + "read:guardian_enrollments", + "delete:guardian_enrollments", + "create:guardian_enrollment_tickets", + "read:user_idp_tokens", + "create:passwords_checking_job", + "delete:passwords_checking_job", + "read:custom_domains", + "delete:custom_domains", + "create:custom_domains", + "update:custom_domains", + "read:email_templates", + "create:email_templates", + "update:email_templates", + "read:mfa_policies", + "update:mfa_policies", + "read:roles", + "create:roles", + "delete:roles", + "update:roles", + "read:prompts", + "update:prompts", + "read:branding", + "update:branding", + "delete:branding", + "read:log_streams", + "create:log_streams", + "delete:log_streams", + "update:log_streams", + "create:signing_keys", + "read:signing_keys", + "update:signing_keys", + "read:limits", + "update:limits", + "create:role_members", + "read:role_members", + "delete:role_members", + "read:entitlements", + "read:attack_protection", + "update:attack_protection", + "read:organizations", + "update:organizations", + "create:organizations", + "delete:organizations", + "create:organization_members", + "read:organization_members", + "delete:organization_members", + "create:organization_connections", + "read:organization_connections", + "update:organization_connections", + "delete:organization_connections", + "create:organization_member_roles", + "read:organization_member_roles", + "delete:organization_member_roles", + "create:organization_invitations", + "read:organization_invitations", + "delete:organization_invitations" ], - "custom_login_page_on": true + "subject_type": "client" }, { - "tenant": "auth0-deploy-cli-e2e", - "global": true, - "callbacks": [], - "is_first_party": true, - "name": "All Applications", - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 2592000, - "idle_token_lifetime": 1296000, - "rotation_type": "non-rotating" - }, - "owners": [ - "mr|samlp|okta|will.vedder@auth0.com", - "mr|google-oauth2|102002633619863830825", - "mr|samlp|okta|frederik.prijck@auth0.com", - "mr|google-oauth2|109614534713742077035", - "mr|google-oauth2|116771660953104383819", - "mr|google-oauth2|112839029247827700155", - "mr|samlp|okta|ewan.harris@auth0.com" - ], - "custom_login_page": "TEST123\n", - "cross_origin_authentication": true, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } + "id": "cgr_pbwejzhwoujrsNE8", + "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", + "audience": "https://auth0-deploy-cli-e2e.us.auth0.com/api/v2/", + "scope": [ + "read:client_grants", + "create:client_grants", + "delete:client_grants", + "update:client_grants", + "read:users", + "update:users", + "delete:users", + "create:users", + "read:users_app_metadata", + "update:users_app_metadata", + "delete:users_app_metadata", + "create:users_app_metadata", + "read:user_custom_blocks", + "create:user_custom_blocks", + "delete:user_custom_blocks", + "create:user_tickets", + "read:clients", + "update:clients", + "delete:clients", + "create:clients", + "read:client_keys", + "update:client_keys", + "delete:client_keys", + "create:client_keys", + "read:client_credentials", + "update:client_credentials", + "delete:client_credentials", + "create:client_credentials", + "read:connections", + "update:connections", + "delete:connections", + "create:connections", + "read:resource_servers", + "update:resource_servers", + "delete:resource_servers", + "create:resource_servers", + "read:device_credentials", + "update:device_credentials", + "delete:device_credentials", + "create:device_credentials", + "read:rules", + "update:rules", + "delete:rules", + "create:rules", + "read:rules_configs", + "update:rules_configs", + "delete:rules_configs", + "read:hooks", + "update:hooks", + "delete:hooks", + "create:hooks", + "read:actions", + "update:actions", + "delete:actions", + "create:actions", + "read:email_provider", + "update:email_provider", + "delete:email_provider", + "create:email_provider", + "blacklist:tokens", + "read:stats", + "read:insights", + "read:tenant_settings", + "update:tenant_settings", + "read:logs", + "read:logs_users", + "read:shields", + "create:shields", + "update:shields", + "delete:shields", + "read:anomaly_blocks", + "delete:anomaly_blocks", + "update:triggers", + "read:triggers", + "read:grants", + "delete:grants", + "read:guardian_factors", + "update:guardian_factors", + "read:guardian_enrollments", + "delete:guardian_enrollments", + "create:guardian_enrollment_tickets", + "read:user_idp_tokens", + "create:passwords_checking_job", + "delete:passwords_checking_job", + "read:custom_domains", + "delete:custom_domains", + "create:custom_domains", + "update:custom_domains", + "read:email_templates", + "create:email_templates", + "update:email_templates", + "read:mfa_policies", + "update:mfa_policies", + "read:roles", + "create:roles", + "delete:roles", + "update:roles", + "read:prompts", + "update:prompts", + "read:branding", + "update:branding", + "delete:branding", + "read:log_streams", + "create:log_streams", + "delete:log_streams", + "update:log_streams", + "create:signing_keys", + "read:signing_keys", + "update:signing_keys", + "read:limits", + "update:limits", + "create:role_members", + "read:role_members", + "delete:role_members", + "read:entitlements", + "read:attack_protection", + "update:attack_protection", + "read:organizations_summary", + "create:authentication_methods", + "read:authentication_methods", + "update:authentication_methods", + "delete:authentication_methods", + "read:organizations", + "update:organizations", + "create:organizations", + "delete:organizations", + "read:organization_discovery_domains", + "update:organization_discovery_domains", + "create:organization_discovery_domains", + "delete:organization_discovery_domains", + "create:organization_members", + "read:organization_members", + "delete:organization_members", + "create:organization_connections", + "read:organization_connections", + "update:organization_connections", + "delete:organization_connections", + "create:organization_member_roles", + "read:organization_member_roles", + "delete:organization_member_roles", + "create:organization_invitations", + "read:organization_invitations", + "delete:organization_invitations", + "read:scim_config", + "create:scim_config", + "update:scim_config", + "delete:scim_config", + "create:scim_token", + "read:scim_token", + "delete:scim_token", + "delete:phone_providers", + "create:phone_providers", + "read:phone_providers", + "update:phone_providers", + "delete:phone_templates", + "create:phone_templates", + "read:phone_templates", + "update:phone_templates", + "create:encryption_keys", + "read:encryption_keys", + "update:encryption_keys", + "delete:encryption_keys", + "read:sessions", + "update:sessions", + "delete:sessions", + "read:refresh_tokens", + "delete:refresh_tokens", + "create:self_service_profiles", + "read:self_service_profiles", + "update:self_service_profiles", + "delete:self_service_profiles", + "create:sso_access_tickets", + "delete:sso_access_tickets", + "read:forms", + "update:forms", + "delete:forms", + "create:forms", + "read:flows", + "update:flows", + "delete:flows", + "create:flows", + "read:flows_vault", + "read:flows_vault_connections", + "update:flows_vault_connections", + "delete:flows_vault_connections", + "create:flows_vault_connections", + "read:flows_executions", + "delete:flows_executions", + "read:connections_options", + "update:connections_options", + "read:self_service_profile_custom_texts", + "update:self_service_profile_custom_texts", + "create:network_acls", + "update:network_acls", + "read:network_acls", + "delete:network_acls", + "delete:vdcs_templates", + "read:vdcs_templates", + "create:vdcs_templates", + "update:vdcs_templates", + "create:custom_signing_keys", + "read:custom_signing_keys", + "update:custom_signing_keys", + "delete:custom_signing_keys", + "read:federated_connections_tokens", + "delete:federated_connections_tokens", + "create:user_attribute_profiles", + "read:user_attribute_profiles", + "update:user_attribute_profiles", + "delete:user_attribute_profiles", + "read:event_streams", + "create:event_streams", + "delete:event_streams", + "update:event_streams", + "read:event_deliveries", + "update:event_deliveries", + "create:connection_profiles", + "read:connection_profiles", + "update:connection_profiles", + "delete:connection_profiles", + "read:organization_client_grants", + "create:organization_client_grants", + "delete:organization_client_grants", + "read:security_metrics", + "read:connections_keys", + "update:connections_keys", + "create:connections_keys" ], - "client_id": "Isi93ibGHIGwmdYjsLwTOn7Gu7nwxU3V", - "client_secret": "[REDACTED]", - "custom_login_page_on": true + "subject_type": "client" } ] }, @@ -9187,23 +8796,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PATCH", - "path": "/api/v2/organizations/org_vhEUeSlhgjQLTFPE", - "body": { - "display_name": "Organization2" - }, - "status": 200, - "response": { - "id": "org_vhEUeSlhgjQLTFPE", - "display_name": "Organization2", - "name": "org2" - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "PATCH", - "path": "/api/v2/organizations/org_nSblOG7yUuWAHLOG", + "path": "/api/v2/organizations/org_YQGLuGuqRYrilmSQ", "body": { "branding": { "colors": { @@ -9221,13 +8814,29 @@ "primary": "#57ddff" } }, - "id": "org_nSblOG7yUuWAHLOG", + "id": "org_YQGLuGuqRYrilmSQ", "display_name": "Organization", "name": "org1" }, "rawHeaders": [], "responseIsBinary": false }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "PATCH", + "path": "/api/v2/organizations/org_rupfjUkVVvnPPk1y", + "body": { + "display_name": "Organization2" + }, + "status": 200, + "response": { + "id": "org_rupfjUkVVvnPPk1y", + "display_name": "Organization2", + "name": "org2" + }, + "rawHeaders": [], + "responseIsBinary": false + }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", @@ -9236,7 +8845,7 @@ "status": 200, "response": [ { - "id": "lst_0000000000025415", + "id": "lst_0000000000025597", "name": "Suspended DD Log Stream", "type": "datadog", "status": "active", @@ -9247,14 +8856,14 @@ "isPriority": false }, { - "id": "lst_0000000000025416", + "id": "lst_0000000000025598", "name": "Amazon EventBridge", "type": "eventbridge", "status": "active", "sink": { "awsAccountId": "123456789012", "awsRegion": "us-east-2", - "awsPartnerEventSource": "aws.partner/auth0.com/auth0-deploy-cli-e2e-48aadbd2-ae4f-4553-9c92-75eebc8c63cd/auth0.logs" + "awsPartnerEventSource": "aws.partner/auth0.com/auth0-deploy-cli-e2e-7022a134-25ea-40c6-8164-cf25c35ee97d/auth0.logs" }, "filters": [ { @@ -9303,7 +8912,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PATCH", - "path": "/api/v2/log-streams/lst_0000000000025415", + "path": "/api/v2/log-streams/lst_0000000000025597", "body": { "name": "Suspended DD Log Stream", "sink": { @@ -9313,7 +8922,7 @@ }, "status": 200, "response": { - "id": "lst_0000000000025415", + "id": "lst_0000000000025597", "name": "Suspended DD Log Stream", "type": "datadog", "status": "active", @@ -9329,7 +8938,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PATCH", - "path": "/api/v2/log-streams/lst_0000000000025416", + "path": "/api/v2/log-streams/lst_0000000000025598", "body": { "name": "Amazon EventBridge", "filters": [ @@ -9374,14 +8983,14 @@ }, "status": 200, "response": { - "id": "lst_0000000000025416", + "id": "lst_0000000000025598", "name": "Amazon EventBridge", "type": "eventbridge", "status": "active", "sink": { "awsAccountId": "123456789012", "awsRegion": "us-east-2", - "awsPartnerEventSource": "aws.partner/auth0.com/auth0-deploy-cli-e2e-48aadbd2-ae4f-4553-9c92-75eebc8c63cd/auth0.logs" + "awsPartnerEventSource": "aws.partner/auth0.com/auth0-deploy-cli-e2e-7022a134-25ea-40c6-8164-cf25c35ee97d/auth0.logs" }, "filters": [ { @@ -9472,7 +9081,7 @@ "name": "Blank-form", "flow_count": 0, "created_at": "2024-11-26T11:58:18.187Z", - "updated_at": "2025-12-05T07:02:16.657Z" + "updated_at": "2025-12-16T10:13:11.443Z" } ] }, @@ -9543,7 +9152,7 @@ } }, "created_at": "2024-11-26T11:58:18.187Z", - "updated_at": "2025-12-05T07:02:16.657Z" + "updated_at": "2025-12-16T10:13:11.443Z" }, "rawHeaders": [], "responseIsBinary": false @@ -9668,7 +9277,7 @@ } }, "created_at": "2024-11-26T11:58:18.187Z", - "updated_at": "2025-12-05T07:04:41.210Z" + "updated_at": "2025-12-16T10:15:18.070Z" }, "rawHeaders": [], "responseIsBinary": false @@ -10761,6 +10370,22 @@ "value": "delete:organization_client_grants", "description": "Delete Organization Client Grants" }, + { + "value": "create:token_exchange_profiles", + "description": "Create Token Exchange Profile" + }, + { + "value": "read:token_exchange_profiles", + "description": "Read Token Exchange Profiles" + }, + { + "value": "update:token_exchange_profiles", + "description": "Update Token Exchange Profile" + }, + { + "value": "delete:token_exchange_profiles", + "description": "Delete Token Exchange Profile" + }, { "value": "read:security_metrics", "description": "Read Security Metrics" @@ -10888,7 +10513,7 @@ "subject": "deprecated" } ], - "client_id": "uf1Ju9xwQ09AWpcnRnwD91W3Sv3bf76S", + "client_id": "0ltKN06qv5WnNoNz2Fu6QvyOl2o6K6nE", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -10933,7 +10558,7 @@ "subject": "deprecated" } ], - "client_id": "WYPQxuqDdeNZHLcJeuPq0AvuNFtMiUgU", + "client_id": "HC5UXDFP5lEc2vbTkPQWJ1yYeiLRkmDg", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -10987,7 +10612,7 @@ } ], "allowed_origins": [], - "client_id": "QwKFSZ87TYF89lXp66sVFpGzYGQ07OU6", + "client_id": "KjqnjAT6PWajvX3XKVkWhFVaW8sFBWyv", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -11033,7 +10658,7 @@ "subject": "deprecated" } ], - "client_id": "VvKPDeB2QHhtG4tVBNcrRUuChB0jWefu", + "client_id": "GH55Wtak9aTrj6tjRFObq1cqnu5a8mtM", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -11052,14 +10677,9 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "Test SPA", + "name": "The Default App", "allowed_clients": [], - "allowed_logout_urls": [ - "http://localhost:3000" - ], - "callbacks": [ - "http://localhost:3000" - ], + "callbacks": [], "client_metadata": {}, "is_first_party": true, "native_social_login": { @@ -11070,16 +10690,17 @@ "enabled": false } }, - "oidc_conformant": true, + "oidc_conformant": false, "refresh_token": { - "expiration_type": "expiring", + "expiration_type": "non-expiring", "leeway": 0, + "infinite_token_lifetime": true, + "infinite_idle_token_lifetime": true, "token_lifetime": 2592000, "idle_token_lifetime": 1296000, - "infinite_token_lifetime": false, - "infinite_idle_token_lifetime": false, - "rotation_type": "rotating" + "rotation_type": "non-rotating" }, + "sso": false, "sso_disabled": false, "cross_origin_authentication": false, "cross_origin_auth": false, @@ -11090,7 +10711,7 @@ "subject": "deprecated" } ], - "client_id": "xODbqyam7rjqHDsYKjU9Tuo99yaBnR5T", + "client_id": "ahrUt7DkBom8m2EAs0zLSccaylYIuVfF", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -11099,15 +10720,12 @@ "secret_encoded": false }, "client_aliases": [], - "token_endpoint_auth_method": "none", - "app_type": "spa", + "token_endpoint_auth_method": "client_secret_post", "grant_types": [ "authorization_code", "implicit", - "refresh_token" - ], - "web_origins": [ - "http://localhost:3000" + "refresh_token", + "client_credentials" ], "custom_login_page_on": true }, @@ -11115,9 +10733,14 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "auth0-deploy-cli-extension", + "name": "Test SPA", "allowed_clients": [], - "callbacks": [], + "allowed_logout_urls": [ + "http://localhost:3000" + ], + "callbacks": [ + "http://localhost:3000" + ], "client_metadata": {}, "is_first_party": true, "native_social_login": { @@ -11130,13 +10753,13 @@ }, "oidc_conformant": true, "refresh_token": { - "expiration_type": "non-expiring", + "expiration_type": "expiring", "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" + "token_lifetime": 2592000, + "idle_token_lifetime": 1296000, + "infinite_token_lifetime": false, + "infinite_idle_token_lifetime": false, + "rotation_type": "rotating" }, "sso_disabled": false, "cross_origin_authentication": false, @@ -11148,7 +10771,7 @@ "subject": "deprecated" } ], - "client_id": "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1", + "client_id": "68Ty4a89yPogS0UGdX8aYaS6td9DXYjs", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -11157,10 +10780,15 @@ "secret_encoded": false }, "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", + "token_endpoint_auth_method": "none", + "app_type": "spa", "grant_types": [ - "client_credentials" + "authorization_code", + "implicit", + "refresh_token" + ], + "web_origins": [ + "http://localhost:3000" ], "custom_login_page_on": true }, @@ -11168,7 +10796,7 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "The Default App", + "name": "auth0-deploy-cli-extension", "allowed_clients": [], "callbacks": [], "client_metadata": {}, @@ -11181,17 +10809,16 @@ "enabled": false } }, - "oidc_conformant": false, + "oidc_conformant": true, "refresh_token": { "expiration_type": "non-expiring", "leeway": 0, "infinite_token_lifetime": true, "infinite_idle_token_lifetime": true, - "token_lifetime": 2592000, - "idle_token_lifetime": 1296000, + "token_lifetime": 31557600, + "idle_token_lifetime": 2592000, "rotation_type": "non-rotating" }, - "sso": false, "sso_disabled": false, "cross_origin_authentication": false, "cross_origin_auth": false, @@ -11202,7 +10829,7 @@ "subject": "deprecated" } ], - "client_id": "xYOv2UsoAuKptIEAjkeB62Oaeg1Jn2QX", + "client_id": "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -11212,10 +10839,8 @@ }, "client_aliases": [], "token_endpoint_auth_method": "client_secret_post", + "app_type": "non_interactive", "grant_types": [ - "authorization_code", - "implicit", - "refresh_token", "client_credentials" ], "custom_login_page_on": true @@ -11228,7 +10853,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "DELETE", - "path": "/api/v2/clients/uf1Ju9xwQ09AWpcnRnwD91W3Sv3bf76S", + "path": "/api/v2/clients/0ltKN06qv5WnNoNz2Fu6QvyOl2o6K6nE", "body": "", "status": 204, "response": "", @@ -11238,7 +10863,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "DELETE", - "path": "/api/v2/clients/WYPQxuqDdeNZHLcJeuPq0AvuNFtMiUgU", + "path": "/api/v2/clients/KjqnjAT6PWajvX3XKVkWhFVaW8sFBWyv", "body": "", "status": 204, "response": "", @@ -11248,7 +10873,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "DELETE", - "path": "/api/v2/clients/QwKFSZ87TYF89lXp66sVFpGzYGQ07OU6", + "path": "/api/v2/clients/HC5UXDFP5lEc2vbTkPQWJ1yYeiLRkmDg", "body": "", "status": 204, "response": "", @@ -11258,7 +10883,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "DELETE", - "path": "/api/v2/clients/gGel1LbswqDqdnqQ39oHycLldkhJZ8c1", + "path": "/api/v2/clients/GH55Wtak9aTrj6tjRFObq1cqnu5a8mtM", "body": "", "status": 204, "response": "", @@ -11268,7 +10893,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "DELETE", - "path": "/api/v2/clients/VvKPDeB2QHhtG4tVBNcrRUuChB0jWefu", + "path": "/api/v2/clients/ahrUt7DkBom8m2EAs0zLSccaylYIuVfF", "body": "", "status": 204, "response": "", @@ -11278,7 +10903,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "DELETE", - "path": "/api/v2/clients/xODbqyam7rjqHDsYKjU9Tuo99yaBnR5T", + "path": "/api/v2/clients/68Ty4a89yPogS0UGdX8aYaS6td9DXYjs", "body": "", "status": 204, "response": "", @@ -11288,7 +10913,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "DELETE", - "path": "/api/v2/clients/xYOv2UsoAuKptIEAjkeB62Oaeg1Jn2QX", + "path": "/api/v2/clients/1TbnVO0y41cPrTLC7HvGKQswbGETjlOU", "body": "", "status": 204, "response": "", @@ -11359,7 +10984,7 @@ "subject": "/CN=auth0-deploy-cli-e2e.us.auth0.com" } ], - "client_id": "VTTBLf4Y7vX3tpTVj0TuGPLPXGsAMUrj", + "client_id": "hI21z2wyWVzGpNi9K13c9dHvf5pCxqWe", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -11381,7 +11006,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PUT", - "path": "/api/v2/guardian/factors/email", + "path": "/api/v2/guardian/factors/otp", "body": { "enabled": false }, @@ -11395,7 +11020,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PUT", - "path": "/api/v2/guardian/factors/recovery-code", + "path": "/api/v2/guardian/factors/duo", "body": { "enabled": false }, @@ -11409,7 +11034,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PUT", - "path": "/api/v2/guardian/factors/push-notification", + "path": "/api/v2/guardian/factors/email", "body": { "enabled": false }, @@ -11423,7 +11048,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PUT", - "path": "/api/v2/guardian/factors/duo", + "path": "/api/v2/guardian/factors/webauthn-roaming", "body": { "enabled": false }, @@ -11437,7 +11062,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PUT", - "path": "/api/v2/guardian/factors/webauthn-platform", + "path": "/api/v2/guardian/factors/push-notification", "body": { "enabled": false }, @@ -11451,7 +11076,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PUT", - "path": "/api/v2/guardian/factors/otp", + "path": "/api/v2/guardian/factors/webauthn-platform", "body": { "enabled": false }, @@ -11465,7 +11090,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PUT", - "path": "/api/v2/guardian/factors/sms", + "path": "/api/v2/guardian/factors/recovery-code", "body": { "enabled": false }, @@ -11479,7 +11104,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PUT", - "path": "/api/v2/guardian/factors/webauthn-roaming", + "path": "/api/v2/guardian/factors/sms", "body": { "enabled": false }, @@ -11552,7 +11177,7 @@ "response": { "actions": [ { - "id": "d67e0c5e-5be5-4ea1-8b75-29c65f79b7fe", + "id": "9cc78117-5697-42a8-9c1f-03bf8e5a3689", "name": "My Custom Action", "supported_triggers": [ { @@ -11560,34 +11185,34 @@ "version": "v2" } ], - "created_at": "2025-12-05T07:01:47.853050355Z", - "updated_at": "2025-12-05T07:04:13.384306629Z", + "created_at": "2025-12-16T10:12:49.378691946Z", + "updated_at": "2025-12-16T10:14:50.956711889Z", "code": "/**\n * Handler that will be called during the execution of a PostLogin flow.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\nexports.onExecutePostLogin = async (event, api) => {\n console.log('Some custom action!');\n};\n\n/**\n * Handler that will be invoked when this action is resuming after an external redirect. If your\n * onExecutePostLogin function does not perform a redirect, this function can be safely ignored.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\n// exports.onContinuePostLogin = async (event, api) => {\n// };\n", "dependencies": [], "runtime": "node18", "status": "built", "secrets": [], "current_version": { - "id": "fd14ba8c-b586-49eb-8056-2a222c645a67", + "id": "00b51df2-c7d4-4a31-8e03-ebcd6f5b109c", "code": "/**\n * Handler that will be called during the execution of a PostLogin flow.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\nexports.onExecutePostLogin = async (event, api) => {\n console.log('Some custom action!');\n};\n\n/**\n * Handler that will be invoked when this action is resuming after an external redirect. If your\n * onExecutePostLogin function does not perform a redirect, this function can be safely ignored.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\n// exports.onContinuePostLogin = async (event, api) => {\n// };\n", "runtime": "node18", "status": "BUILT", "number": 2, - "build_time": "2025-12-05T07:04:14.420830198Z", - "created_at": "2025-12-05T07:04:14.332306393Z", - "updated_at": "2025-12-05T07:04:14.422326047Z" + "build_time": "2025-12-16T10:14:51.834979562Z", + "created_at": "2025-12-16T10:14:51.735114292Z", + "updated_at": "2025-12-16T10:14:51.837244030Z" }, "deployed_version": { "code": "/**\n * Handler that will be called during the execution of a PostLogin flow.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\nexports.onExecutePostLogin = async (event, api) => {\n console.log('Some custom action!');\n};\n\n/**\n * Handler that will be invoked when this action is resuming after an external redirect. If your\n * onExecutePostLogin function does not perform a redirect, this function can be safely ignored.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\n// exports.onContinuePostLogin = async (event, api) => {\n// };\n", "dependencies": [], - "id": "fd14ba8c-b586-49eb-8056-2a222c645a67", + "id": "00b51df2-c7d4-4a31-8e03-ebcd6f5b109c", "deployed": true, "number": 2, - "built_at": "2025-12-05T07:04:14.420830198Z", + "built_at": "2025-12-16T10:14:51.834979562Z", "secrets": [], "status": "built", - "created_at": "2025-12-05T07:04:14.332306393Z", - "updated_at": "2025-12-05T07:04:14.422326047Z", + "created_at": "2025-12-16T10:14:51.735114292Z", + "updated_at": "2025-12-16T10:14:51.837244030Z", "runtime": "node18", "supported_triggers": [ { @@ -11608,7 +11233,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "DELETE", - "path": "/api/v2/actions/actions/d67e0c5e-5be5-4ea1-8b75-29c65f79b7fe?force=true", + "path": "/api/v2/actions/actions/9cc78117-5697-42a8-9c1f-03bf8e5a3689?force=true", "body": "", "status": 204, "response": "", @@ -11628,6 +11253,54 @@ "rawHeaders": [], "responseIsBinary": false }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "PATCH", + "path": "/api/v2/attack-protection/suspicious-ip-throttling", + "body": { + "enabled": true, + "shields": [ + "admin_notification", + "block" + ], + "allowlist": [], + "stage": { + "pre-login": { + "max_attempts": 100, + "rate": 864000 + }, + "pre-user-registration": { + "max_attempts": 50, + "rate": 1200 + } + } + }, + "status": 200, + "response": { + "enabled": true, + "shields": [ + "admin_notification", + "block" + ], + "allowlist": [], + "stage": { + "pre-login": { + "max_attempts": 100, + "rate": 864000 + }, + "pre-user-registration": { + "max_attempts": 50, + "rate": 1200 + }, + "pre-custom-token-exchange": { + "max_attempts": 10, + "rate": 600000 + } + } + }, + "rawHeaders": [], + "responseIsBinary": false + }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PATCH", @@ -11670,58 +11343,14 @@ "response": { "enabled": false, "shields": [], - "admin_notification_frequency": [], - "method": "standard", - "stage": { - "pre-user-registration": { - "shields": [] - }, - "pre-change-password": { - "shields": [] - } - } - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "PATCH", - "path": "/api/v2/attack-protection/suspicious-ip-throttling", - "body": { - "enabled": true, - "shields": [ - "admin_notification", - "block" - ], - "allowlist": [], - "stage": { - "pre-login": { - "max_attempts": 100, - "rate": 864000 - }, - "pre-user-registration": { - "max_attempts": 50, - "rate": 1200 - } - } - }, - "status": 200, - "response": { - "enabled": true, - "shields": [ - "admin_notification", - "block" - ], - "allowlist": [], - "stage": { - "pre-login": { - "max_attempts": 100, - "rate": 864000 - }, + "admin_notification_frequency": [], + "method": "standard", + "stage": { "pre-user-registration": { - "max_attempts": 50, - "rate": 1200 + "shields": [] + }, + "pre-change-password": { + "shields": [] } } }, @@ -11821,7 +11450,7 @@ "subject": "deprecated" } ], - "client_id": "VTTBLf4Y7vX3tpTVj0TuGPLPXGsAMUrj", + "client_id": "hI21z2wyWVzGpNi9K13c9dHvf5pCxqWe", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -11882,94 +11511,13 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections?include_totals=true&strategy=auth0", - "body": "", - "status": 200, - "response": { - "total": 1, - "start": 0, - "limit": 50, - "connections": [ - { - "id": "con_fuBNFcmY8aL3HDBT", - "options": { - "mfa": { - "active": true, - "return_enroll_settings": true - }, - "import_mode": false, - "customScripts": { - "login": "function login(email, password, callback) {\n // This script should authenticate a user against the credentials stored in\n // your database.\n // It is executed when a user attempts to log in or immediately after signing\n // up (as a verification that the user was successfully signed up).\n //\n // Everything returned by this script will be set as part of the user profile\n // and will be visible by any of the tenant admins. Avoid adding attributes\n // with values such as passwords, keys, secrets, etc.\n //\n // The `password` parameter of this function is in plain text. It must be\n // hashed/salted to match whatever is stored in your database. For example:\n //\n // var bcrypt = require('bcrypt@0.8.5');\n // bcrypt.compare(password, dbPasswordHash, function(err, res)) { ... }\n //\n // There are three ways this script can finish:\n // 1. The user's credentials are valid. The returned user profile should be in\n // the following format: https://auth0.com/docs/users/normalized/auth0/normalized-user-profile-schema\n // var profile = {\n // user_id: ..., // user_id is mandatory\n // email: ...,\n // [...]\n // };\n // callback(null, profile);\n // 2. The user's credentials are invalid\n // callback(new WrongUsernameOrPasswordError(email, \"my error message\"));\n // 3. Something went wrong while trying to reach your database\n // callback(new Error(\"my error message\"));\n //\n // A list of Node.js modules which can be referenced is available here:\n //\n // https://tehsis.github.io/webtaskio-canirequire/\n console.log('AYYYYYE');\n\n const msg =\n 'Please implement the Login script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "create": "function create(user, callback) {\n // This script should create a user entry in your existing database. It will\n // be executed when a user attempts to sign up, or when a user is created\n // through the Auth0 dashboard or API.\n // When this script has finished executing, the Login script will be\n // executed immediately afterwards, to verify that the user was created\n // successfully.\n //\n // The user object will always contain the following properties:\n // * email: the user's email\n // * password: the password entered by the user, in plain text\n // * tenant: the name of this Auth0 account\n // * client_id: the client ID of the application where the user signed up, or\n // API key if created through the API or Auth0 dashboard\n // * connection: the name of this database connection\n //\n // There are three ways this script can finish:\n // 1. A user was successfully created\n // callback(null);\n // 2. This user already exists in your database\n // callback(new ValidationError(\"user_exists\", \"my error message\"));\n // 3. Something went wrong while trying to reach your database\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Create script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "delete": "function remove(id, callback) {\n // This script remove a user from your existing database.\n // It is executed whenever a user is deleted from the API or Auth0 dashboard.\n //\n // There are two ways that this script can finish:\n // 1. The user was removed successfully:\n // callback(null);\n // 2. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Delete script for this database ' +\n 'connection at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "verify": "function verify(email, callback) {\n // This script should mark the current user's email address as verified in\n // your database.\n // It is executed whenever a user clicks the verification link sent by email.\n // These emails can be customized at https://manage.auth0.com/#/emails.\n // It is safe to assume that the user's email already exists in your database,\n // because verification emails, if enabled, are sent immediately after a\n // successful signup.\n //\n // There are two ways that this script can finish:\n // 1. The user's email was verified successfully\n // callback(null, true);\n // 2. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n //\n // If an error is returned, it will be passed to the query string of the page\n // where the user is being redirected to after clicking the verification link.\n // For example, returning `callback(new Error(\"error\"))` and redirecting to\n // https://example.com would redirect to the following URL:\n // https://example.com?email=alice%40example.com&message=error&success=false\n\n const msg =\n 'Please implement the Verify script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "get_user": "function getByEmail(email, callback) {\n // This script should retrieve a user profile from your existing database,\n // without authenticating the user.\n // It is used to check if a user exists before executing flows that do not\n // require authentication (signup and password reset).\n //\n // There are three ways this script can finish:\n // 1. A user was successfully found. The profile should be in the following\n // format: https://auth0.com/docs/users/normalized/auth0/normalized-user-profile-schema.\n // callback(null, profile);\n // 2. A user was not found\n // callback(null);\n // 3. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Get User script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "change_password": "function changePassword(email, newPassword, callback) {\n // This script should change the password stored for the current user in your\n // database. It is executed when the user clicks on the confirmation link\n // after a reset password request.\n // The content and behavior of password confirmation emails can be customized\n // here: https://manage.auth0.com/#/emails\n // The `newPassword` parameter of this function is in plain text. It must be\n // hashed/salted to match whatever is stored in your database.\n //\n // There are three ways that this script can finish:\n // 1. The user's password was updated successfully:\n // callback(null, true);\n // 2. The user's password was not updated:\n // callback(null, false);\n // 3. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n //\n // If an error is returned, it will be passed to the query string of the page\n // where the user is being redirected to after clicking the confirmation link.\n // For example, returning `callback(new Error(\"error\"))` and redirecting to\n // https://example.com would redirect to the following URL:\n // https://example.com?email=alice%40example.com&message=error&success=false\n\n const msg =\n 'Please implement the Change Password script for this database ' +\n 'connection at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n" - }, - "disable_signup": false, - "passwordPolicy": "low", - "passkey_options": { - "challenge_ui": "both", - "local_enrollment_enabled": true, - "progressive_enrollment_enabled": true - }, - "password_history": { - "size": 5, - "enable": false - }, - "strategy_version": 2, - "requires_username": true, - "password_dictionary": { - "enable": true, - "dictionary": [] - }, - "authentication_methods": { - "passkey": { - "enabled": false - }, - "password": { - "enabled": true, - "api_behavior": "required" - } - }, - "brute_force_protection": true, - "password_no_personal_info": { - "enable": true - }, - "password_complexity_options": { - "min_length": 8 - }, - "enabledDatabaseCustomization": true - }, - "strategy": "auth0", - "name": "boo-baz-db-connection-test", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "boo-baz-db-connection-test" - ], - "enabled_clients": [] - } - ] - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/connections?include_totals=true&take=50&strategy=auth0", + "path": "/api/v2/connections?take=50&strategy=auth0", "body": "", "status": 200, "response": { "connections": [ { - "id": "con_fuBNFcmY8aL3HDBT", + "id": "con_cxSOS7uLgPojtLBh", "options": { "mfa": { "active": true, @@ -12041,16 +11589,13 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections?include_totals=true&strategy=auth0", + "path": "/api/v2/connections?take=50&strategy=auth0", "body": "", "status": 200, "response": { - "total": 1, - "start": 0, - "limit": 50, "connections": [ { - "id": "con_fuBNFcmY8aL3HDBT", + "id": "con_cxSOS7uLgPojtLBh", "options": { "mfa": { "active": true, @@ -12122,77 +11667,11 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections?include_totals=true&take=50&strategy=auth0", + "path": "/api/v2/connections/con_cxSOS7uLgPojtLBh/clients?take=50", "body": "", "status": 200, "response": { - "connections": [ - { - "id": "con_fuBNFcmY8aL3HDBT", - "options": { - "mfa": { - "active": true, - "return_enroll_settings": true - }, - "import_mode": false, - "customScripts": { - "login": "function login(email, password, callback) {\n // This script should authenticate a user against the credentials stored in\n // your database.\n // It is executed when a user attempts to log in or immediately after signing\n // up (as a verification that the user was successfully signed up).\n //\n // Everything returned by this script will be set as part of the user profile\n // and will be visible by any of the tenant admins. Avoid adding attributes\n // with values such as passwords, keys, secrets, etc.\n //\n // The `password` parameter of this function is in plain text. It must be\n // hashed/salted to match whatever is stored in your database. For example:\n //\n // var bcrypt = require('bcrypt@0.8.5');\n // bcrypt.compare(password, dbPasswordHash, function(err, res)) { ... }\n //\n // There are three ways this script can finish:\n // 1. The user's credentials are valid. The returned user profile should be in\n // the following format: https://auth0.com/docs/users/normalized/auth0/normalized-user-profile-schema\n // var profile = {\n // user_id: ..., // user_id is mandatory\n // email: ...,\n // [...]\n // };\n // callback(null, profile);\n // 2. The user's credentials are invalid\n // callback(new WrongUsernameOrPasswordError(email, \"my error message\"));\n // 3. Something went wrong while trying to reach your database\n // callback(new Error(\"my error message\"));\n //\n // A list of Node.js modules which can be referenced is available here:\n //\n // https://tehsis.github.io/webtaskio-canirequire/\n console.log('AYYYYYE');\n\n const msg =\n 'Please implement the Login script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "create": "function create(user, callback) {\n // This script should create a user entry in your existing database. It will\n // be executed when a user attempts to sign up, or when a user is created\n // through the Auth0 dashboard or API.\n // When this script has finished executing, the Login script will be\n // executed immediately afterwards, to verify that the user was created\n // successfully.\n //\n // The user object will always contain the following properties:\n // * email: the user's email\n // * password: the password entered by the user, in plain text\n // * tenant: the name of this Auth0 account\n // * client_id: the client ID of the application where the user signed up, or\n // API key if created through the API or Auth0 dashboard\n // * connection: the name of this database connection\n //\n // There are three ways this script can finish:\n // 1. A user was successfully created\n // callback(null);\n // 2. This user already exists in your database\n // callback(new ValidationError(\"user_exists\", \"my error message\"));\n // 3. Something went wrong while trying to reach your database\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Create script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "delete": "function remove(id, callback) {\n // This script remove a user from your existing database.\n // It is executed whenever a user is deleted from the API or Auth0 dashboard.\n //\n // There are two ways that this script can finish:\n // 1. The user was removed successfully:\n // callback(null);\n // 2. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Delete script for this database ' +\n 'connection at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "verify": "function verify(email, callback) {\n // This script should mark the current user's email address as verified in\n // your database.\n // It is executed whenever a user clicks the verification link sent by email.\n // These emails can be customized at https://manage.auth0.com/#/emails.\n // It is safe to assume that the user's email already exists in your database,\n // because verification emails, if enabled, are sent immediately after a\n // successful signup.\n //\n // There are two ways that this script can finish:\n // 1. The user's email was verified successfully\n // callback(null, true);\n // 2. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n //\n // If an error is returned, it will be passed to the query string of the page\n // where the user is being redirected to after clicking the verification link.\n // For example, returning `callback(new Error(\"error\"))` and redirecting to\n // https://example.com would redirect to the following URL:\n // https://example.com?email=alice%40example.com&message=error&success=false\n\n const msg =\n 'Please implement the Verify script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "get_user": "function getByEmail(email, callback) {\n // This script should retrieve a user profile from your existing database,\n // without authenticating the user.\n // It is used to check if a user exists before executing flows that do not\n // require authentication (signup and password reset).\n //\n // There are three ways this script can finish:\n // 1. A user was successfully found. The profile should be in the following\n // format: https://auth0.com/docs/users/normalized/auth0/normalized-user-profile-schema.\n // callback(null, profile);\n // 2. A user was not found\n // callback(null);\n // 3. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Get User script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "change_password": "function changePassword(email, newPassword, callback) {\n // This script should change the password stored for the current user in your\n // database. It is executed when the user clicks on the confirmation link\n // after a reset password request.\n // The content and behavior of password confirmation emails can be customized\n // here: https://manage.auth0.com/#/emails\n // The `newPassword` parameter of this function is in plain text. It must be\n // hashed/salted to match whatever is stored in your database.\n //\n // There are three ways that this script can finish:\n // 1. The user's password was updated successfully:\n // callback(null, true);\n // 2. The user's password was not updated:\n // callback(null, false);\n // 3. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n //\n // If an error is returned, it will be passed to the query string of the page\n // where the user is being redirected to after clicking the confirmation link.\n // For example, returning `callback(new Error(\"error\"))` and redirecting to\n // https://example.com would redirect to the following URL:\n // https://example.com?email=alice%40example.com&message=error&success=false\n\n const msg =\n 'Please implement the Change Password script for this database ' +\n 'connection at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n" - }, - "disable_signup": false, - "passwordPolicy": "low", - "passkey_options": { - "challenge_ui": "both", - "local_enrollment_enabled": true, - "progressive_enrollment_enabled": true - }, - "password_history": { - "size": 5, - "enable": false - }, - "strategy_version": 2, - "requires_username": true, - "password_dictionary": { - "enable": true, - "dictionary": [] - }, - "authentication_methods": { - "passkey": { - "enabled": false - }, - "password": { - "enabled": true, - "api_behavior": "required" - } - }, - "brute_force_protection": true, - "password_no_personal_info": { - "enable": true - }, - "password_complexity_options": { - "min_length": 8 - }, - "enabledDatabaseCustomization": true - }, - "strategy": "auth0", - "name": "boo-baz-db-connection-test", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "boo-baz-db-connection-test" - ], - "enabled_clients": [] - } - ] + "clients": [] }, "rawHeaders": [], "responseIsBinary": false @@ -12200,7 +11679,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections/con_fuBNFcmY8aL3HDBT/clients?take=50", + "path": "/api/v2/connections/con_cxSOS7uLgPojtLBh/clients?take=50", "body": "", "status": 200, "response": { @@ -12212,11 +11691,11 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "DELETE", - "path": "/api/v2/connections/con_fuBNFcmY8aL3HDBT", + "path": "/api/v2/connections/con_cxSOS7uLgPojtLBh", "body": "", "status": 202, "response": { - "deleted_at": "2025-12-05T07:04:56.343Z" + "deleted_at": "2025-12-16T10:15:34.350Z" }, "rawHeaders": [], "responseIsBinary": false @@ -12230,7 +11709,7 @@ "strategy": "auth0", "enabled_clients": [ "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", - "VTTBLf4Y7vX3tpTVj0TuGPLPXGsAMUrj" + "hI21z2wyWVzGpNi9K13c9dHvf5pCxqWe" ], "is_domain_connection": false, "options": { @@ -12248,7 +11727,7 @@ }, "status": 201, "response": { - "id": "con_LyQ8Ql8u6kYDmUkh", + "id": "con_OCG9gVNvzxoXsDxv", "options": { "mfa": { "active": true, @@ -12282,8 +11761,8 @@ "active": false }, "enabled_clients": [ - "VTTBLf4Y7vX3tpTVj0TuGPLPXGsAMUrj", - "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE" + "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", + "hI21z2wyWVzGpNi9K13c9dHvf5pCxqWe" ], "realms": [ "Username-Password-Authentication" @@ -12295,13 +11774,13 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections?include_totals=true&take=1&name=Username-Password-Authentication", + "path": "/api/v2/connections?take=1&name=Username-Password-Authentication&include_fields=true", "body": "", "status": 200, "response": { "connections": [ { - "id": "con_LyQ8Ql8u6kYDmUkh", + "id": "con_OCG9gVNvzxoXsDxv", "options": { "mfa": { "active": true, @@ -12338,8 +11817,8 @@ "Username-Password-Authentication" ], "enabled_clients": [ - "VTTBLf4Y7vX3tpTVj0TuGPLPXGsAMUrj", - "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE" + "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", + "hI21z2wyWVzGpNi9K13c9dHvf5pCxqWe" ] } ] @@ -12350,14 +11829,14 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PATCH", - "path": "/api/v2/connections/con_LyQ8Ql8u6kYDmUkh/clients", + "path": "/api/v2/connections/con_OCG9gVNvzxoXsDxv/clients", "body": [ { "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", "status": true }, { - "client_id": "VTTBLf4Y7vX3tpTVj0TuGPLPXGsAMUrj", + "client_id": "hI21z2wyWVzGpNi9K13c9dHvf5pCxqWe", "status": true } ], @@ -12459,7 +11938,7 @@ "subject": "deprecated" } ], - "client_id": "VTTBLf4Y7vX3tpTVj0TuGPLPXGsAMUrj", + "client_id": "hI21z2wyWVzGpNi9K13c9dHvf5pCxqWe", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -12489,110 +11968,28 @@ "token_lifetime": 2592000, "idle_token_lifetime": 1296000, "rotation_type": "non-rotating" - }, - "owners": [ - "mr|samlp|okta|will.vedder@auth0.com", - "mr|google-oauth2|102002633619863830825", - "mr|samlp|okta|frederik.prijck@auth0.com", - "mr|google-oauth2|109614534713742077035", - "mr|google-oauth2|116771660953104383819", - "mr|google-oauth2|112839029247827700155", - "mr|samlp|okta|ewan.harris@auth0.com" - ], - "custom_login_page": "TEST123\n", - "cross_origin_authentication": true, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "Isi93ibGHIGwmdYjsLwTOn7Gu7nwxU3V", - "client_secret": "[REDACTED]", - "custom_login_page_on": true - } - ] - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/connections?include_totals=true", - "body": "", - "status": 200, - "response": { - "total": 2, - "start": 0, - "limit": 50, - "connections": [ - { - "id": "con_URfc5OIXMzEJtZaz", - "options": { - "email": true, - "scope": [ - "email", - "profile" - ], - "profile": true - }, - "strategy": "google-oauth2", - "name": "google-oauth2", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "google-oauth2" - ], - "enabled_clients": [] - }, - { - "id": "con_LyQ8Ql8u6kYDmUkh", - "options": { - "mfa": { - "active": true, - "return_enroll_settings": true - }, - "passwordPolicy": "good", - "passkey_options": { - "challenge_ui": "both", - "local_enrollment_enabled": true, - "progressive_enrollment_enabled": true - }, - "strategy_version": 2, - "authentication_methods": { - "passkey": { - "enabled": false - }, - "password": { - "enabled": true, - "api_behavior": "required" - } - }, - "brute_force_protection": true - }, - "strategy": "auth0", - "name": "Username-Password-Authentication", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "Username-Password-Authentication" + }, + "owners": [ + "mr|samlp|okta|will.vedder@auth0.com", + "mr|google-oauth2|102002633619863830825", + "mr|samlp|okta|frederik.prijck@auth0.com", + "mr|google-oauth2|109614534713742077035", + "mr|google-oauth2|116771660953104383819", + "mr|google-oauth2|112839029247827700155", + "mr|samlp|okta|ewan.harris@auth0.com" ], - "enabled_clients": [ - "VTTBLf4Y7vX3tpTVj0TuGPLPXGsAMUrj", - "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE" - ] + "custom_login_page": "TEST123\n", + "cross_origin_authentication": true, + "signing_keys": [ + { + "cert": "[REDACTED]", + "pkcs7": "[REDACTED]", + "subject": "deprecated" + } + ], + "client_id": "Isi93ibGHIGwmdYjsLwTOn7Gu7nwxU3V", + "client_secret": "[REDACTED]", + "custom_login_page_on": true } ] }, @@ -12602,13 +11999,13 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections?include_totals=true&take=50", + "path": "/api/v2/connections?take=50", "body": "", "status": 200, "response": { "connections": [ { - "id": "con_URfc5OIXMzEJtZaz", + "id": "con_lfhXlIY73LFJlMks", "options": { "email": true, "scope": [ @@ -12632,7 +12029,7 @@ "enabled_clients": [] }, { - "id": "con_LyQ8Ql8u6kYDmUkh", + "id": "con_OCG9gVNvzxoXsDxv", "options": { "mfa": { "active": true, @@ -12669,8 +12066,8 @@ "Username-Password-Authentication" ], "enabled_clients": [ - "VTTBLf4Y7vX3tpTVj0TuGPLPXGsAMUrj", - "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE" + "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", + "hI21z2wyWVzGpNi9K13c9dHvf5pCxqWe" ] } ] @@ -12681,16 +12078,13 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections?include_totals=true", + "path": "/api/v2/connections?take=50", "body": "", "status": 200, "response": { - "total": 2, - "start": 0, - "limit": 50, "connections": [ { - "id": "con_URfc5OIXMzEJtZaz", + "id": "con_lfhXlIY73LFJlMks", "options": { "email": true, "scope": [ @@ -12714,7 +12108,7 @@ "enabled_clients": [] }, { - "id": "con_LyQ8Ql8u6kYDmUkh", + "id": "con_OCG9gVNvzxoXsDxv", "options": { "mfa": { "active": true, @@ -12751,8 +12145,8 @@ "Username-Password-Authentication" ], "enabled_clients": [ - "VTTBLf4Y7vX3tpTVj0TuGPLPXGsAMUrj", - "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE" + "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", + "hI21z2wyWVzGpNi9K13c9dHvf5pCxqWe" ] } ] @@ -12763,78 +12157,11 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections?include_totals=true&take=50", + "path": "/api/v2/connections/con_lfhXlIY73LFJlMks/clients?take=50", "body": "", "status": 200, "response": { - "connections": [ - { - "id": "con_URfc5OIXMzEJtZaz", - "options": { - "email": true, - "scope": [ - "email", - "profile" - ], - "profile": true - }, - "strategy": "google-oauth2", - "name": "google-oauth2", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "google-oauth2" - ], - "enabled_clients": [] - }, - { - "id": "con_LyQ8Ql8u6kYDmUkh", - "options": { - "mfa": { - "active": true, - "return_enroll_settings": true - }, - "passwordPolicy": "good", - "passkey_options": { - "challenge_ui": "both", - "local_enrollment_enabled": true, - "progressive_enrollment_enabled": true - }, - "strategy_version": 2, - "authentication_methods": { - "passkey": { - "enabled": false - }, - "password": { - "enabled": true, - "api_behavior": "required" - } - }, - "brute_force_protection": true - }, - "strategy": "auth0", - "name": "Username-Password-Authentication", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "Username-Password-Authentication" - ], - "enabled_clients": [ - "VTTBLf4Y7vX3tpTVj0TuGPLPXGsAMUrj", - "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE" - ] - } - ] + "clients": [] }, "rawHeaders": [], "responseIsBinary": false @@ -12842,7 +12169,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections/con_URfc5OIXMzEJtZaz/clients?take=50", + "path": "/api/v2/connections/con_lfhXlIY73LFJlMks/clients?take=50", "body": "", "status": 200, "response": { @@ -12854,11 +12181,11 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "DELETE", - "path": "/api/v2/connections/con_URfc5OIXMzEJtZaz", + "path": "/api/v2/connections/con_lfhXlIY73LFJlMks", "body": "", "status": 202, "response": { - "deleted_at": "2025-12-05T07:05:03.913Z" + "deleted_at": "2025-12-16T10:15:40.520Z" }, "rawHeaders": [], "responseIsBinary": false @@ -12990,7 +12317,7 @@ "subject": "deprecated" } ], - "client_id": "VTTBLf4Y7vX3tpTVj0TuGPLPXGsAMUrj", + "client_id": "hI21z2wyWVzGpNi9K13c9dHvf5pCxqWe", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -13051,13 +12378,10 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/client-grants?per_page=100&page=0&include_totals=true", + "path": "/api/v2/client-grants?take=50", "body": "", "status": 200, "response": { - "total": 1, - "start": 0, - "limit": 100, "client_grants": [ { "id": "cgr_pbwejzhwoujrsNE8", @@ -13308,22 +12632,22 @@ "response": { "roles": [ { - "id": "rol_fYWtGL9q5Foq7oJD", + "id": "rol_nvXgdsT2ksrlrQpN", "name": "Admin", "description": "Can read and write things" }, { - "id": "rol_iHF8WkcFPvQFJlvd", + "id": "rol_DW7eDROpAD03JEhC", "name": "Reader", "description": "Can only read things" }, { - "id": "rol_AHn82p4ofrvBg4g5", + "id": "rol_TDHVhZp26Ti7nQt2", "name": "read_only", "description": "Read Only" }, { - "id": "rol_J3tWLDMM6zuxlUiT", + "id": "rol_6uNKN3FdNBPgcRFM", "name": "read_osnly", "description": "Readz Only" } @@ -13338,7 +12662,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/roles/rol_fYWtGL9q5Foq7oJD/permissions?per_page=100&page=0&include_totals=true", + "path": "/api/v2/roles/rol_nvXgdsT2ksrlrQpN/permissions?per_page=100&page=0&include_totals=true", "body": "", "status": 200, "response": { @@ -13353,7 +12677,22 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/roles/rol_iHF8WkcFPvQFJlvd/permissions?per_page=100&page=0&include_totals=true", + "path": "/api/v2/roles/rol_nvXgdsT2ksrlrQpN/permissions?per_page=100&page=1&include_totals=true", + "body": "", + "status": 200, + "response": { + "permissions": [], + "start": 100, + "limit": 100, + "total": 0 + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/roles/rol_DW7eDROpAD03JEhC/permissions?per_page=100&page=0&include_totals=true", "body": "", "status": 200, "response": { @@ -13368,7 +12707,22 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/roles/rol_AHn82p4ofrvBg4g5/permissions?per_page=100&page=0&include_totals=true", + "path": "/api/v2/roles/rol_DW7eDROpAD03JEhC/permissions?per_page=100&page=1&include_totals=true", + "body": "", + "status": 200, + "response": { + "permissions": [], + "start": 100, + "limit": 100, + "total": 0 + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/roles/rol_TDHVhZp26Ti7nQt2/permissions?per_page=100&page=0&include_totals=true", "body": "", "status": 200, "response": { @@ -13383,7 +12737,22 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/roles/rol_J3tWLDMM6zuxlUiT/permissions?per_page=100&page=0&include_totals=true", + "path": "/api/v2/roles/rol_TDHVhZp26Ti7nQt2/permissions?per_page=100&page=1&include_totals=true", + "body": "", + "status": 200, + "response": { + "permissions": [], + "start": 100, + "limit": 100, + "total": 0 + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/roles/rol_6uNKN3FdNBPgcRFM/permissions?per_page=100&page=0&include_totals=true", "body": "", "status": 200, "response": { @@ -13395,10 +12764,25 @@ "rawHeaders": [], "responseIsBinary": false }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/roles/rol_6uNKN3FdNBPgcRFM/permissions?per_page=100&page=1&include_totals=true", + "body": "", + "status": 200, + "response": { + "permissions": [], + "start": 100, + "limit": 100, + "total": 0 + }, + "rawHeaders": [], + "responseIsBinary": false + }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "DELETE", - "path": "/api/v2/roles/rol_fYWtGL9q5Foq7oJD", + "path": "/api/v2/roles/rol_nvXgdsT2ksrlrQpN", "body": "", "status": 200, "response": {}, @@ -13408,7 +12792,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "DELETE", - "path": "/api/v2/roles/rol_iHF8WkcFPvQFJlvd", + "path": "/api/v2/roles/rol_DW7eDROpAD03JEhC", "body": "", "status": 200, "response": {}, @@ -13418,7 +12802,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "DELETE", - "path": "/api/v2/roles/rol_AHn82p4ofrvBg4g5", + "path": "/api/v2/roles/rol_TDHVhZp26Ti7nQt2", "body": "", "status": 200, "response": {}, @@ -13428,7 +12812,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "DELETE", - "path": "/api/v2/roles/rol_J3tWLDMM6zuxlUiT", + "path": "/api/v2/roles/rol_6uNKN3FdNBPgcRFM", "body": "", "status": 200, "response": {}, @@ -13438,13 +12822,18 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/organizations?include_totals=true", + "path": "/api/v2/organizations?take=50", "body": "", "status": 200, "response": { "organizations": [ { - "id": "org_nSblOG7yUuWAHLOG", + "id": "org_rupfjUkVVvnPPk1y", + "name": "org2", + "display_name": "Organization2" + }, + { + "id": "org_YQGLuGuqRYrilmSQ", "name": "org1", "display_name": "Organization", "branding": { @@ -13453,16 +12842,8 @@ "primary": "#57ddff" } } - }, - { - "id": "org_vhEUeSlhgjQLTFPE", - "name": "org2", - "display_name": "Organization2" } - ], - "start": 0, - "limit": 50, - "total": 2 + ] }, "rawHeaders": [], "responseIsBinary": false @@ -13560,7 +12941,7 @@ "subject": "deprecated" } ], - "client_id": "VTTBLf4Y7vX3tpTVj0TuGPLPXGsAMUrj", + "client_id": "hI21z2wyWVzGpNi9K13c9dHvf5pCxqWe", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -13621,28 +13002,14 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/organizations?include_totals=true&take=50", + "path": "/api/v2/organizations/org_rupfjUkVVvnPPk1y/enabled_connections?page=0&per_page=50&include_totals=true", "body": "", "status": 200, "response": { - "organizations": [ - { - "id": "org_nSblOG7yUuWAHLOG", - "name": "org1", - "display_name": "Organization", - "branding": { - "colors": { - "page_background": "#fff5f5", - "primary": "#57ddff" - } - } - }, - { - "id": "org_vhEUeSlhgjQLTFPE", - "name": "org2", - "display_name": "Organization2" - } - ] + "enabled_connections": [], + "start": 0, + "limit": 0, + "total": 0 }, "rawHeaders": [], "responseIsBinary": false @@ -13650,23 +13017,28 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/organizations/org_nSblOG7yUuWAHLOG/enabled_connections", + "path": "/api/v2/organizations/org_rupfjUkVVvnPPk1y/enabled_connections?page=1&per_page=50&include_totals=true", "body": "", "status": 200, - "response": [], + "response": { + "enabled_connections": [], + "start": 0, + "limit": 0, + "total": 0 + }, "rawHeaders": [], "responseIsBinary": false }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/organizations/org_nSblOG7yUuWAHLOG/client-grants?page=0&per_page=100&include_totals=true", + "path": "/api/v2/organizations/org_rupfjUkVVvnPPk1y/client-grants?page=0&per_page=50&include_totals=true", "body": "", "status": 200, "response": { "client_grants": [], "start": 0, - "limit": 100, + "limit": 50, "total": 0 }, "rawHeaders": [], @@ -13675,11 +13047,14 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/organizations/org_nSblOG7yUuWAHLOG/discovery-domains?take=50", + "path": "/api/v2/organizations/org_rupfjUkVVvnPPk1y/client-grants?page=1&per_page=50&include_totals=true", "body": "", "status": 200, "response": { - "domains": [] + "client_grants": [], + "start": 50, + "limit": 50, + "total": 0 }, "rawHeaders": [], "responseIsBinary": false @@ -13687,24 +13062,23 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/organizations/org_vhEUeSlhgjQLTFPE/enabled_connections", + "path": "/api/v2/organizations/org_rupfjUkVVvnPPk1y/discovery-domains?take=50", "body": "", "status": 200, - "response": [], + "response": { + "domains": [] + }, "rawHeaders": [], "responseIsBinary": false }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/organizations/org_vhEUeSlhgjQLTFPE/client-grants?page=0&per_page=100&include_totals=true", + "path": "/api/v2/organizations/org_rupfjUkVVvnPPk1y/discovery-domains?take=50", "body": "", "status": 200, "response": { - "client_grants": [], - "start": 0, - "limit": 100, - "total": 0 + "domains": [] }, "rawHeaders": [], "responseIsBinary": false @@ -13712,11 +13086,14 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/organizations/org_vhEUeSlhgjQLTFPE/discovery-domains?take=50", + "path": "/api/v2/organizations/org_YQGLuGuqRYrilmSQ/enabled_connections?page=0&per_page=50&include_totals=true", "body": "", "status": 200, "response": { - "domains": [] + "enabled_connections": [], + "start": 0, + "limit": 0, + "total": 0 }, "rawHeaders": [], "responseIsBinary": false @@ -13724,57 +13101,68 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections?include_totals=true", + "path": "/api/v2/organizations/org_YQGLuGuqRYrilmSQ/enabled_connections?page=1&per_page=50&include_totals=true", "body": "", "status": 200, "response": { - "total": 1, + "enabled_connections": [], "start": 0, - "limit": 50, - "connections": [ - { - "id": "con_LyQ8Ql8u6kYDmUkh", - "options": { - "mfa": { - "active": true, - "return_enroll_settings": true - }, - "passwordPolicy": "good", - "passkey_options": { - "challenge_ui": "both", - "local_enrollment_enabled": true, - "progressive_enrollment_enabled": true - }, - "strategy_version": 2, - "authentication_methods": { - "passkey": { - "enabled": false - }, - "password": { - "enabled": true, - "api_behavior": "required" - } - }, - "brute_force_protection": true - }, - "strategy": "auth0", - "name": "Username-Password-Authentication", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "Username-Password-Authentication" - ], - "enabled_clients": [ - "VTTBLf4Y7vX3tpTVj0TuGPLPXGsAMUrj", - "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE" - ] - } - ] + "limit": 0, + "total": 0 + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/organizations/org_YQGLuGuqRYrilmSQ/client-grants?page=0&per_page=50&include_totals=true", + "body": "", + "status": 200, + "response": { + "client_grants": [], + "start": 0, + "limit": 50, + "total": 0 + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/organizations/org_YQGLuGuqRYrilmSQ/client-grants?page=1&per_page=50&include_totals=true", + "body": "", + "status": 200, + "response": { + "client_grants": [], + "start": 50, + "limit": 50, + "total": 0 + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/organizations/org_YQGLuGuqRYrilmSQ/discovery-domains?take=50", + "body": "", + "status": 200, + "response": { + "domains": [] + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/organizations/org_YQGLuGuqRYrilmSQ/discovery-domains?take=50", + "body": "", + "status": 200, + "response": { + "domains": [] }, "rawHeaders": [], "responseIsBinary": false @@ -13782,13 +13170,13 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections?include_totals=true&take=50", + "path": "/api/v2/connections?take=50", "body": "", "status": 200, "response": { "connections": [ { - "id": "con_LyQ8Ql8u6kYDmUkh", + "id": "con_OCG9gVNvzxoXsDxv", "options": { "mfa": { "active": true, @@ -13825,8 +13213,8 @@ "Username-Password-Authentication" ], "enabled_clients": [ - "VTTBLf4Y7vX3tpTVj0TuGPLPXGsAMUrj", - "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE" + "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", + "hI21z2wyWVzGpNi9K13c9dHvf5pCxqWe" ] } ] @@ -13927,7 +13315,7 @@ "subject": "deprecated" } ], - "client_id": "VTTBLf4Y7vX3tpTVj0TuGPLPXGsAMUrj", + "client_id": "hI21z2wyWVzGpNi9K13c9dHvf5pCxqWe", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -13988,13 +13376,10 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/client-grants?per_page=100&page=0&include_totals=true", + "path": "/api/v2/client-grants?take=50", "body": "", "status": 200, "response": { - "total": 1, - "start": 0, - "limit": 100, "client_grants": [ { "id": "cgr_pbwejzhwoujrsNE8", @@ -14239,7 +13624,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "DELETE", - "path": "/api/v2/organizations/org_nSblOG7yUuWAHLOG", + "path": "/api/v2/organizations/org_YQGLuGuqRYrilmSQ", "body": "", "status": 204, "response": "", @@ -14249,7 +13634,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "DELETE", - "path": "/api/v2/organizations/org_vhEUeSlhgjQLTFPE", + "path": "/api/v2/organizations/org_rupfjUkVVvnPPk1y", "body": "", "status": 204, "response": "", @@ -14264,7 +13649,7 @@ "status": 200, "response": [ { - "id": "lst_0000000000025415", + "id": "lst_0000000000025597", "name": "Suspended DD Log Stream", "type": "datadog", "status": "active", @@ -14275,14 +13660,14 @@ "isPriority": false }, { - "id": "lst_0000000000025416", + "id": "lst_0000000000025598", "name": "Amazon EventBridge", "type": "eventbridge", "status": "active", "sink": { "awsAccountId": "123456789012", "awsRegion": "us-east-2", - "awsPartnerEventSource": "aws.partner/auth0.com/auth0-deploy-cli-e2e-48aadbd2-ae4f-4553-9c92-75eebc8c63cd/auth0.logs" + "awsPartnerEventSource": "aws.partner/auth0.com/auth0-deploy-cli-e2e-7022a134-25ea-40c6-8164-cf25c35ee97d/auth0.logs" }, "filters": [ { @@ -14331,7 +13716,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "DELETE", - "path": "/api/v2/log-streams/lst_0000000000025415", + "path": "/api/v2/log-streams/lst_0000000000025597", "body": "", "status": 204, "response": "", @@ -14341,7 +13726,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "DELETE", - "path": "/api/v2/log-streams/lst_0000000000025416", + "path": "/api/v2/log-streams/lst_0000000000025598", "body": "", "status": 204, "response": "", @@ -15516,6 +14901,22 @@ "value": "delete:organization_client_grants", "description": "Delete Organization Client Grants" }, + { + "value": "create:token_exchange_profiles", + "description": "Create Token Exchange Profile" + }, + { + "value": "read:token_exchange_profiles", + "description": "Read Token Exchange Profiles" + }, + { + "value": "update:token_exchange_profiles", + "description": "Update Token Exchange Profile" + }, + { + "value": "delete:token_exchange_profiles", + "description": "Delete Token Exchange Profile" + }, { "value": "read:security_metrics", "description": "Read Security Metrics" @@ -15633,7 +15034,7 @@ "subject": "deprecated" } ], - "client_id": "VTTBLf4Y7vX3tpTVj0TuGPLPXGsAMUrj", + "client_id": "hI21z2wyWVzGpNi9K13c9dHvf5pCxqWe", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -15657,71 +15058,13 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections?include_totals=true&strategy=auth0", - "body": "", - "status": 200, - "response": { - "total": 1, - "start": 0, - "limit": 50, - "connections": [ - { - "id": "con_LyQ8Ql8u6kYDmUkh", - "options": { - "mfa": { - "active": true, - "return_enroll_settings": true - }, - "passwordPolicy": "good", - "passkey_options": { - "challenge_ui": "both", - "local_enrollment_enabled": true, - "progressive_enrollment_enabled": true - }, - "strategy_version": 2, - "authentication_methods": { - "passkey": { - "enabled": false - }, - "password": { - "enabled": true, - "api_behavior": "required" - } - }, - "brute_force_protection": true - }, - "strategy": "auth0", - "name": "Username-Password-Authentication", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "Username-Password-Authentication" - ], - "enabled_clients": [ - "VTTBLf4Y7vX3tpTVj0TuGPLPXGsAMUrj", - "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE" - ] - } - ] - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/connections?include_totals=true&take=50&strategy=auth0", + "path": "/api/v2/connections?take=50&strategy=auth0", "body": "", "status": 200, "response": { "connections": [ { - "id": "con_LyQ8Ql8u6kYDmUkh", + "id": "con_OCG9gVNvzxoXsDxv", "options": { "mfa": { "active": true, @@ -15758,8 +15101,8 @@ "Username-Password-Authentication" ], "enabled_clients": [ - "VTTBLf4Y7vX3tpTVj0TuGPLPXGsAMUrj", - "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE" + "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", + "hI21z2wyWVzGpNi9K13c9dHvf5pCxqWe" ] } ] @@ -15770,16 +15113,16 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections/con_LyQ8Ql8u6kYDmUkh/clients?take=50", + "path": "/api/v2/connections/con_OCG9gVNvzxoXsDxv/clients?take=50", "body": "", "status": 200, "response": { "clients": [ { - "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE" + "client_id": "hI21z2wyWVzGpNi9K13c9dHvf5pCxqWe" }, { - "client_id": "VTTBLf4Y7vX3tpTVj0TuGPLPXGsAMUrj" + "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE" } ] }, @@ -15789,55 +15132,16 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections?include_totals=true", + "path": "/api/v2/connections/con_OCG9gVNvzxoXsDxv/clients?take=50", "body": "", "status": 200, "response": { - "total": 1, - "start": 0, - "limit": 50, - "connections": [ + "clients": [ { - "id": "con_LyQ8Ql8u6kYDmUkh", - "options": { - "mfa": { - "active": true, - "return_enroll_settings": true - }, - "passwordPolicy": "good", - "passkey_options": { - "challenge_ui": "both", - "local_enrollment_enabled": true, - "progressive_enrollment_enabled": true - }, - "strategy_version": 2, - "authentication_methods": { - "passkey": { - "enabled": false - }, - "password": { - "enabled": true, - "api_behavior": "required" - } - }, - "brute_force_protection": true - }, - "strategy": "auth0", - "name": "Username-Password-Authentication", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "Username-Password-Authentication" - ], - "enabled_clients": [ - "VTTBLf4Y7vX3tpTVj0TuGPLPXGsAMUrj", - "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE" - ] + "client_id": "hI21z2wyWVzGpNi9K13c9dHvf5pCxqWe" + }, + { + "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE" } ] }, @@ -15847,13 +15151,13 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections?include_totals=true&take=50", + "path": "/api/v2/connections?take=50", "body": "", "status": 200, "response": { "connections": [ { - "id": "con_LyQ8Ql8u6kYDmUkh", + "id": "con_OCG9gVNvzxoXsDxv", "options": { "mfa": { "active": true, @@ -15890,8 +15194,8 @@ "Username-Password-Authentication" ], "enabled_clients": [ - "VTTBLf4Y7vX3tpTVj0TuGPLPXGsAMUrj", - "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE" + "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", + "hI21z2wyWVzGpNi9K13c9dHvf5pCxqWe" ] } ] @@ -16007,18 +15311,14 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/email-templates/welcome_email", + "path": "/api/v2/email-templates/reset_email", "body": "", - "status": 200, + "status": 404, "response": { - "template": "welcome_email", - "body": "\n \n

Welcome!

\n \n\n", - "from": "", - "resultUrl": "https://example.com/welcome", - "subject": "Welcome", - "syntax": "liquid", - "urlLifetimeInSeconds": 3600, - "enabled": false + "statusCode": 404, + "error": "Not Found", + "message": "The template does not exist.", + "errorCode": "inexistent_email_template" }, "rawHeaders": [], "responseIsBinary": false @@ -16041,7 +15341,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/email-templates/reset_email_by_code", + "path": "/api/v2/email-templates/mfa_oob_code", "body": "", "status": 404, "response": { @@ -16056,7 +15356,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/email-templates/blocked_account", + "path": "/api/v2/email-templates/password_reset", "body": "", "status": 404, "response": { @@ -16071,7 +15371,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/email-templates/user_invitation", + "path": "/api/v2/email-templates/async_approval", "body": "", "status": 404, "response": { @@ -16086,7 +15386,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/email-templates/password_reset", + "path": "/api/v2/email-templates/change_password", "body": "", "status": 404, "response": { @@ -16131,7 +15431,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/email-templates/async_approval", + "path": "/api/v2/email-templates/user_invitation", "body": "", "status": 404, "response": { @@ -16146,14 +15446,18 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/email-templates/mfa_oob_code", + "path": "/api/v2/email-templates/welcome_email", "body": "", - "status": 404, + "status": 200, "response": { - "statusCode": 404, - "error": "Not Found", - "message": "The template does not exist.", - "errorCode": "inexistent_email_template" + "template": "welcome_email", + "body": "\n \n

Welcome!

\n \n\n", + "from": "", + "resultUrl": "https://example.com/welcome", + "subject": "Welcome", + "syntax": "liquid", + "urlLifetimeInSeconds": 3600, + "enabled": false }, "rawHeaders": [], "responseIsBinary": false @@ -16161,7 +15465,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/email-templates/change_password", + "path": "/api/v2/email-templates/blocked_account", "body": "", "status": 404, "response": { @@ -16176,7 +15480,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/email-templates/reset_email", + "path": "/api/v2/email-templates/reset_email_by_code", "body": "", "status": 404, "response": { @@ -16191,13 +15495,10 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/client-grants?per_page=100&page=0&include_totals=true", + "path": "/api/v2/client-grants?take=50", "body": "", "status": 200, "response": { - "total": 1, - "start": 0, - "limit": 100, "client_grants": [ { "id": "cgr_pbwejzhwoujrsNE8", @@ -16493,7 +15794,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/guardian/factors/push-notification/providers/sns", + "path": "/api/v2/guardian/factors/sms/providers/twilio", "body": "", "status": 200, "response": {}, @@ -16503,7 +15804,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/guardian/factors/sms/providers/twilio", + "path": "/api/v2/guardian/factors/push-notification/providers/sns", "body": "", "status": 200, "response": {}, @@ -16605,7 +15906,101 @@ "body": "", "status": 200, "response": { - "providers": [] + "providers": [ + { + "id": "pro_mY3L5BP6iVUUzpv22opofm", + "tenant": "auth0-deploy-cli-e2e", + "name": "custom", + "channel": "phone", + "disabled": false, + "configuration": { + "delivery_methods": [ + "text" + ] + }, + "credentials": null, + "created_at": "2025-12-09T12:24:00.604Z", + "updated_at": "2025-12-16T10:11:48.093Z" + } + ] + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/branding/phone/templates", + "body": "", + "status": 200, + "response": { + "templates": [ + { + "id": "tem_o4LBTt4NQyX8K4vC9dPafR", + "tenant": "auth0-deploy-cli-e2e", + "channel": "phone", + "type": "otp_verify", + "disabled": false, + "created_at": "2025-12-09T12:26:30.547Z", + "updated_at": "2025-12-16T10:11:50.208Z", + "content": { + "syntax": "liquid", + "body": { + "text": "{{ code | escape }} is your verification code for {{ friendly_name | escape }}", + "voice": "Hello. Your verification code for {{ friendly_name | escape }} is {{ pause }} {{ code | escape }}. I repeat, your verification code is {{ pause }} {{ code | escape }}" + } + } + }, + { + "id": "tem_xqbUSF83fpnRv8r8rqXFDZ", + "tenant": "auth0-deploy-cli-e2e", + "channel": "phone", + "type": "change_password", + "disabled": false, + "created_at": "2025-12-09T12:26:20.243Z", + "updated_at": "2025-12-16T10:11:50.047Z", + "content": { + "syntax": "liquid", + "body": { + "text": "{{ code | escape }} is your password change code for {{ friendly_name | escape }}", + "voice": "Hello. Your password change code for {{ friendly_name | escape }} is {{ pause }} {{ code | escape }}. I repeat, your password change code is {{ pause }} {{ code | escape }}" + } + } + }, + { + "id": "tem_dL83uTmWn8moGzm8UgAk4Q", + "tenant": "auth0-deploy-cli-e2e", + "channel": "phone", + "type": "blocked_account", + "disabled": false, + "created_at": "2025-12-09T12:22:47.683Z", + "updated_at": "2025-12-16T10:11:50.118Z", + "content": { + "syntax": "liquid", + "body": { + "text": "We detected suspicious activity on your account from the ip {{user.source_ip}}{% if user.city %} from {{user.city}}, {{user.country}}{% elsif user.country %} from {{user.country}}{% endif %}. Logins from this IP have been blocked on your account. If this is your IP, please reset your password to unblock your account. Otherwise, disregard this message.", + "voice": "We detected suspicious activity on your account from the ip {{user.source_ip}}{% if user.city %} from {{user.city}}, {{user.country}}{% elsif user.country %} from {{user.country}}{% endif %}. Logins from this IP have been blocked on your account. If this is your IP, please reset your password to unblock your account. Otherwise, disregard this message." + }, + "from": "0032232323" + } + }, + { + "id": "tem_qarYST5TTE5pbMNB5NHZAj", + "tenant": "auth0-deploy-cli-e2e", + "channel": "phone", + "type": "otp_enroll", + "disabled": false, + "created_at": "2025-12-09T12:26:25.327Z", + "updated_at": "2025-12-16T10:11:50.397Z", + "content": { + "syntax": "liquid", + "body": { + "text": "{{ code | escape }} is your verification code for {{ friendly_name | escape }}. Please enter this code to verify your enrollment.", + "voice": "Hello. Your verification code for {{ friendly_name | escape }} is {{ pause }} {{ code | escape }}. I repeat, your verification code is {{ pause }} {{ code | escape }}" + } + } + } + ] }, "rawHeaders": [], "responseIsBinary": false @@ -16728,7 +16123,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/prompts/login-passwordless/custom-text/en", + "path": "/api/v2/prompts/login-email-verification/custom-text/en", "body": "", "status": 200, "response": {}, @@ -16738,7 +16133,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/prompts/login-email-verification/custom-text/en", + "path": "/api/v2/prompts/login-passwordless/custom-text/en", "body": "", "status": 200, "response": {}, @@ -16808,7 +16203,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/prompts/custom-form/custom-text/en", + "path": "/api/v2/prompts/reset-password/custom-text/en", "body": "", "status": 200, "response": {}, @@ -16818,7 +16213,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/prompts/reset-password/custom-text/en", + "path": "/api/v2/prompts/custom-form/custom-text/en", "body": "", "status": 200, "response": {}, @@ -16858,7 +16253,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/prompts/mfa-otp/custom-text/en", + "path": "/api/v2/prompts/mfa-push/custom-text/en", "body": "", "status": 200, "response": {}, @@ -16868,7 +16263,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/prompts/mfa-push/custom-text/en", + "path": "/api/v2/prompts/mfa-otp/custom-text/en", "body": "", "status": 200, "response": {}, @@ -16888,7 +16283,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/prompts/mfa-webauthn/custom-text/en", + "path": "/api/v2/prompts/mfa-phone/custom-text/en", "body": "", "status": 200, "response": {}, @@ -16898,7 +16293,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/prompts/mfa-phone/custom-text/en", + "path": "/api/v2/prompts/mfa-webauthn/custom-text/en", "body": "", "status": 200, "response": {}, @@ -16908,7 +16303,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/prompts/mfa-email/custom-text/en", + "path": "/api/v2/prompts/mfa-sms/custom-text/en", "body": "", "status": 200, "response": {}, @@ -16918,7 +16313,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/prompts/mfa-sms/custom-text/en", + "path": "/api/v2/prompts/mfa-email/custom-text/en", "body": "", "status": 200, "response": {}, @@ -16978,7 +16373,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/prompts/invitation/custom-text/en", + "path": "/api/v2/prompts/email-otp-challenge/custom-text/en", "body": "", "status": 200, "response": {}, @@ -16998,7 +16393,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/prompts/common/custom-text/en", + "path": "/api/v2/prompts/invitation/custom-text/en", "body": "", "status": 200, "response": {}, @@ -17008,7 +16403,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/prompts/email-otp-challenge/custom-text/en", + "path": "/api/v2/prompts/common/custom-text/en", "body": "", "status": 200, "response": {}, @@ -17038,7 +16433,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/prompts/login-password/partials", + "path": "/api/v2/prompts/brute-force-protection/custom-text/en", "body": "", "status": 200, "response": {}, @@ -17048,7 +16443,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/prompts/login/partials", + "path": "/api/v2/prompts/login-id/partials", "body": "", "status": 200, "response": {}, @@ -17058,7 +16453,17 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/prompts/login-id/partials", + "path": "/api/v2/prompts/login-password/partials", + "body": "", + "status": 200, + "response": {}, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/prompts/login/partials", "body": "", "status": 200, "response": {}, @@ -17108,10 +16513,15 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/prompts/rendering", + "path": "/api/v2/prompts/rendering?page=0&per_page=100&include_totals=true", "body": "", "status": 200, - "response": [], + "response": { + "configs": [], + "start": 0, + "limit": 100, + "total": 0 + }, "rawHeaders": [], "responseIsBinary": false }, @@ -17141,7 +16551,6 @@ "version": "v3", "status": "CURRENT", "runtimes": [ - "node12", "node18-actions", "node22" ], @@ -17167,24 +16576,24 @@ }, { "id": "credentials-exchange", - "version": "v2", - "status": "CURRENT", + "version": "v1", + "status": "DEPRECATED", "runtimes": [ - "node18-actions", - "node22" + "node12" ], - "default_runtime": "node22", + "default_runtime": "node12", "binding_policy": "trigger-bound", "compatible_triggers": [] }, { - "id": "pre-user-registration", - "version": "v1", - "status": "DEPRECATED", + "id": "credentials-exchange", + "version": "v2", + "status": "CURRENT", "runtimes": [ - "node12" + "node18-actions", + "node22" ], - "default_runtime": "node12", + "default_runtime": "node22", "binding_policy": "trigger-bound", "compatible_triggers": [] }, @@ -17193,6 +16602,7 @@ "version": "v2", "status": "CURRENT", "runtimes": [ + "node12", "node18-actions", "node22" ], @@ -17240,7 +16650,6 @@ "version": "v2", "status": "CURRENT", "runtimes": [ - "node12", "node18-actions", "node22" ], @@ -17318,6 +16727,17 @@ "default_runtime": "node22", "binding_policy": "entity-bound", "compatible_triggers": [] + }, + { + "id": "password-hash-migration", + "version": "v1", + "status": "CURRENT", + "runtimes": [ + "node22" + ], + "default_runtime": "node22", + "binding_policy": "entity-bound", + "compatible_triggers": [] } ] }, @@ -17327,12 +16747,12 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/actions/triggers/post-login/bindings", + "path": "/api/v2/actions/triggers/post-login/bindings?page=0&per_page=50", "body": "", "status": 200, "response": { "bindings": [], - "per_page": 20 + "per_page": 50 }, "rawHeaders": [], "responseIsBinary": false @@ -17340,12 +16760,12 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/actions/triggers/credentials-exchange/bindings", + "path": "/api/v2/actions/triggers/credentials-exchange/bindings?page=0&per_page=50", "body": "", "status": 200, "response": { "bindings": [], - "per_page": 20 + "per_page": 50 }, "rawHeaders": [], "responseIsBinary": false @@ -17353,12 +16773,12 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/actions/triggers/pre-user-registration/bindings", + "path": "/api/v2/actions/triggers/pre-user-registration/bindings?page=0&per_page=50", "body": "", "status": 200, "response": { "bindings": [], - "per_page": 20 + "per_page": 50 }, "rawHeaders": [], "responseIsBinary": false @@ -17366,12 +16786,12 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/actions/triggers/post-user-registration/bindings", + "path": "/api/v2/actions/triggers/post-user-registration/bindings?page=0&per_page=50", "body": "", "status": 200, "response": { "bindings": [], - "per_page": 20 + "per_page": 50 }, "rawHeaders": [], "responseIsBinary": false @@ -17379,12 +16799,12 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/actions/triggers/post-change-password/bindings", + "path": "/api/v2/actions/triggers/post-change-password/bindings?page=0&per_page=50", "body": "", "status": 200, "response": { "bindings": [], - "per_page": 20 + "per_page": 50 }, "rawHeaders": [], "responseIsBinary": false @@ -17392,12 +16812,12 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/actions/triggers/send-phone-message/bindings", + "path": "/api/v2/actions/triggers/send-phone-message/bindings?page=0&per_page=50", "body": "", "status": 200, "response": { "bindings": [], - "per_page": 20 + "per_page": 50 }, "rawHeaders": [], "responseIsBinary": false @@ -17405,12 +16825,12 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/actions/triggers/password-reset-post-challenge/bindings", + "path": "/api/v2/actions/triggers/password-reset-post-challenge/bindings?page=0&per_page=50", "body": "", "status": 200, "response": { "bindings": [], - "per_page": 20 + "per_page": 50 }, "rawHeaders": [], "responseIsBinary": false @@ -17418,12 +16838,12 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/actions/triggers/login-post-identifier/bindings", + "path": "/api/v2/actions/triggers/login-post-identifier/bindings?page=0&per_page=50", "body": "", "status": 200, "response": { "bindings": [], - "per_page": 20 + "per_page": 50 }, "rawHeaders": [], "responseIsBinary": false @@ -17431,12 +16851,12 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/actions/triggers/custom-phone-provider/bindings", + "path": "/api/v2/actions/triggers/custom-phone-provider/bindings?page=0&per_page=50", "body": "", "status": 200, "response": { "bindings": [], - "per_page": 20 + "per_page": 50 }, "rawHeaders": [], "responseIsBinary": false @@ -17444,12 +16864,12 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/actions/triggers/custom-email-provider/bindings", + "path": "/api/v2/actions/triggers/custom-email-provider/bindings?page=0&per_page=50", "body": "", "status": 200, "response": { "bindings": [], - "per_page": 20 + "per_page": 50 }, "rawHeaders": [], "responseIsBinary": false @@ -17457,12 +16877,12 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/actions/triggers/custom-token-exchange/bindings", + "path": "/api/v2/actions/triggers/custom-token-exchange/bindings?page=0&per_page=50", "body": "", "status": 200, "response": { "bindings": [], - "per_page": 20 + "per_page": 50 }, "rawHeaders": [], "responseIsBinary": false @@ -17470,12 +16890,12 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/actions/triggers/event-stream/bindings", + "path": "/api/v2/actions/triggers/event-stream/bindings?page=0&per_page=50", "body": "", "status": 200, "response": { "bindings": [], - "per_page": 20 + "per_page": 50 }, "rawHeaders": [], "responseIsBinary": false @@ -17483,14 +16903,24 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/organizations?include_totals=true", + "path": "/api/v2/actions/triggers/password-hash-migration/bindings?page=0&per_page=50", "body": "", "status": 200, "response": { - "organizations": [], - "start": 0, - "limit": 50, - "total": 0 + "bindings": [], + "per_page": 50 + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/organizations?take=50", + "body": "", + "status": 200, + "response": { + "organizations": [] }, "rawHeaders": [], "responseIsBinary": false @@ -17588,7 +17018,7 @@ "subject": "deprecated" } ], - "client_id": "VTTBLf4Y7vX3tpTVj0TuGPLPXGsAMUrj", + "client_id": "hI21z2wyWVzGpNi9K13c9dHvf5pCxqWe", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -17649,11 +17079,22 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/organizations?include_totals=true&take=50", + "path": "/api/v2/attack-protection/breached-password-detection", "body": "", "status": 200, "response": { - "organizations": [] + "enabled": false, + "shields": [], + "admin_notification_frequency": [], + "method": "standard", + "stage": { + "pre-user-registration": { + "shields": [] + }, + "pre-change-password": { + "shields": [] + } + } }, "rawHeaders": [], "responseIsBinary": false @@ -17677,29 +17118,6 @@ "rawHeaders": [], "responseIsBinary": false }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/attack-protection/breached-password-detection", - "body": "", - "status": 200, - "response": { - "enabled": false, - "shields": [], - "admin_notification_frequency": [], - "method": "standard", - "stage": { - "pre-user-registration": { - "shields": [] - }, - "pre-change-password": { - "shields": [] - } - } - }, - "rawHeaders": [], - "responseIsBinary": false - }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", @@ -17721,12 +17139,33 @@ "pre-user-registration": { "max_attempts": 50, "rate": 1200 + }, + "pre-custom-token-exchange": { + "max_attempts": 10, + "rate": 600000 } } }, "rawHeaders": [], "responseIsBinary": false }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/attack-protection/bot-detection", + "body": "", + "status": 200, + "response": { + "challenge_password_policy": "never", + "challenge_passwordless_policy": "never", + "challenge_password_reset_policy": "never", + "allowlist": [], + "bot_detection_level": "medium", + "monitoring_mode_enabled": false + }, + "rawHeaders": [], + "responseIsBinary": false + }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", @@ -17762,23 +17201,6 @@ "rawHeaders": [], "responseIsBinary": false }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/attack-protection/bot-detection", - "body": "", - "status": 200, - "response": { - "challenge_password_policy": "never", - "challenge_passwordless_policy": "never", - "challenge_password_reset_policy": "never", - "allowlist": [], - "bot_detection_level": "medium", - "monitoring_mode_enabled": false - }, - "rawHeaders": [], - "responseIsBinary": false - }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", @@ -17799,18 +17221,6 @@ "rawHeaders": [], "responseIsBinary": false }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/custom-domains?take=50", - "body": "", - "status": 200, - "response": { - "custom_domains": [] - }, - "rawHeaders": [], - "responseIsBinary": false - }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", @@ -17857,7 +17267,7 @@ "name": "Blank-form", "flow_count": 0, "created_at": "2024-11-26T11:58:18.187Z", - "updated_at": "2025-12-05T07:04:41.210Z" + "updated_at": "2025-12-16T10:15:18.070Z" } ] }, @@ -17928,7 +17338,7 @@ } }, "created_at": "2024-11-26T11:58:18.187Z", - "updated_at": "2025-12-05T07:04:41.210Z" + "updated_at": "2025-12-16T10:15:18.070Z" }, "rawHeaders": [], "responseIsBinary": false @@ -17951,11 +17361,11 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/flows/vault/connections?page=0&per_page=100&include_totals=true", + "path": "/api/v2/flows/vault/connections?page=0&per_page=50&include_totals=true", "body": "", "status": 200, "response": { - "limit": 100, + "limit": 50, "start": 0, "total": 0, "connections": [] @@ -17966,11 +17376,26 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/flows/vault/connections?page=0&per_page=100&include_totals=true", + "path": "/api/v2/flows/vault/connections?page=1&per_page=50&include_totals=true", "body": "", "status": 200, "response": { - "limit": 100, + "limit": 50, + "start": 50, + "total": 0, + "connections": [] + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/flows/vault/connections?page=0&per_page=50&include_totals=true", + "body": "", + "status": 200, + "response": { + "limit": 50, "start": 0, "total": 0, "connections": [] @@ -17978,6 +17403,21 @@ "rawHeaders": [], "responseIsBinary": false }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/flows/vault/connections?page=1&per_page=50&include_totals=true", + "body": "", + "status": 200, + "response": { + "limit": 50, + "start": 50, + "total": 0, + "connections": [] + }, + "rawHeaders": [], + "responseIsBinary": false + }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", @@ -18007,7 +17447,7 @@ "okta" ], "created_at": "2024-11-26T11:58:18.962Z", - "updated_at": "2025-12-05T07:04:31.162Z", + "updated_at": "2025-12-16T10:15:07.545Z", "branding": { "colors": { "primary": "#19aecc" @@ -18059,7 +17499,7 @@ } }, "created_at": "2025-09-09T04:41:43.671Z", - "updated_at": "2025-12-05T07:04:15.756Z", + "updated_at": "2025-12-16T10:14:53.158Z", "id": "acl_wpZ6oScRU5L6QKAxMUMHmx" } ] @@ -18122,61 +17562,6 @@ "rawHeaders": [], "responseIsBinary": false }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/user-attribute-profiles?take=10", - "body": "", - "status": 200, - "response": { - "user_attribute_profiles": [ - { - "id": "uap_1csDj3szFsgxGS1oTZTdFm", - "name": "test-user-attribute-profile-2", - "user_id": { - "oidc_mapping": "sub", - "saml_mapping": [ - "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier", - "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn", - "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name" - ], - "scim_mapping": "externalId" - }, - "user_attributes": { - "email": { - "label": "Email", - "description": "Email of the User", - "auth0_mapping": "email", - "profile_required": true - } - } - }, - { - "id": "uap_1csDj3sAVu6n5eTzLw6XZg", - "name": "test-user-attribute-profile", - "user_id": { - "oidc_mapping": "sub", - "saml_mapping": [ - "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier", - "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn", - "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name" - ], - "scim_mapping": "externalId" - }, - "user_attributes": { - "email": { - "label": "Email", - "description": "Email of the User", - "auth0_mapping": "email", - "profile_required": true - } - } - } - ] - }, - "rawHeaders": [], - "responseIsBinary": false - }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", @@ -18192,11 +17577,14 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connection-profiles?take=10", + "path": "/api/v2/token-exchange-profiles?take=50", "body": "", - "status": 200, + "status": 403, "response": { - "connection_profiles": [] + "statusCode": 403, + "error": "Forbidden", + "message": "Insufficient scope, expected any of: read:token_exchange_profiles", + "errorCode": "insufficient_scope" }, "rawHeaders": [], "responseIsBinary": false diff --git a/test/e2e/recordings/should-deploy-without-deleting-resources-if-AUTH0_ALLOW_DELETE-is-false.json b/test/e2e/recordings/should-deploy-without-deleting-resources-if-AUTH0_ALLOW_DELETE-is-false.json index 95f61e1a1..6381f7f17 100644 --- a/test/e2e/recordings/should-deploy-without-deleting-resources-if-AUTH0_ALLOW_DELETE-is-false.json +++ b/test/e2e/recordings/should-deploy-without-deleting-resources-if-AUTH0_ALLOW_DELETE-is-false.json @@ -1170,6 +1170,22 @@ "value": "delete:organization_client_grants", "description": "Delete Organization Client Grants" }, + { + "value": "create:token_exchange_profiles", + "description": "Create Token Exchange Profile" + }, + { + "value": "read:token_exchange_profiles", + "description": "Read Token Exchange Profiles" + }, + { + "value": "update:token_exchange_profiles", + "description": "Update Token Exchange Profile" + }, + { + "value": "delete:token_exchange_profiles", + "description": "Delete Token Exchange Profile" + }, { "value": "read:security_metrics", "description": "Read Security Metrics" @@ -1287,7 +1303,7 @@ "subject": "deprecated" } ], - "client_id": "cLFFGtjp2Xe7HWQCHfCtQxmURfSu1lDH", + "client_id": "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -1308,6 +1324,91 @@ "rawHeaders": [], "responseIsBinary": false }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "POST", + "path": "/api/v2/clients", + "body": { + "name": "Quickstarts API (Test Application)", + "app_type": "non_interactive", + "client_metadata": { + "foo": "bar" + }, + "custom_login_page_on": true, + "grant_types": [ + "client_credentials" + ], + "is_first_party": true, + "is_token_endpoint_ip_header_trusted": false, + "jwt_configuration": { + "alg": "RS256", + "lifetime_in_seconds": 36000, + "secret_encoded": false + }, + "oidc_conformant": true, + "refresh_token": { + "expiration_type": "non-expiring", + "leeway": 0, + "infinite_token_lifetime": true, + "infinite_idle_token_lifetime": true, + "token_lifetime": 31557600, + "idle_token_lifetime": 2592000, + "rotation_type": "non-rotating" + }, + "sso_disabled": false, + "token_endpoint_auth_method": "client_secret_post", + "cross_origin_authentication": false + }, + "status": 201, + "response": { + "tenant": "auth0-deploy-cli-e2e", + "global": false, + "is_token_endpoint_ip_header_trusted": false, + "name": "Quickstarts API (Test Application)", + "client_metadata": { + "foo": "bar" + }, + "is_first_party": true, + "oidc_conformant": true, + "refresh_token": { + "expiration_type": "non-expiring", + "leeway": 0, + "infinite_token_lifetime": true, + "infinite_idle_token_lifetime": true, + "token_lifetime": 31557600, + "idle_token_lifetime": 2592000, + "rotation_type": "non-rotating" + }, + "sso_disabled": false, + "cross_origin_authentication": false, + "cross_origin_auth": false, + "encrypted": true, + "signing_keys": [ + { + "cert": "[REDACTED]", + "key": "[REDACTED]", + "pkcs7": "[REDACTED]", + "subject": "/CN=auth0-deploy-cli-e2e.us.auth0.com" + } + ], + "client_id": "HC5UXDFP5lEc2vbTkPQWJ1yYeiLRkmDg", + "callback_url_template": false, + "client_secret": "[REDACTED]", + "jwt_configuration": { + "alg": "RS256", + "lifetime_in_seconds": 36000, + "secret_encoded": false + }, + "token_endpoint_auth_method": "client_secret_post", + "app_type": "non_interactive", + "grant_types": [ + "client_credentials" + ], + "custom_login_page_on": true + }, + "rawHeaders": [], + "responseIsBinary": false + }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "POST", @@ -1400,7 +1501,7 @@ } ], "allowed_origins": [], - "client_id": "QwKFSZ87TYF89lXp66sVFpGzYGQ07OU6", + "client_id": "KjqnjAT6PWajvX3XKVkWhFVaW8sFBWyv", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -1428,11 +1529,12 @@ "method": "POST", "path": "/api/v2/clients", "body": { - "name": "Quickstarts API (Test Application)", + "name": "API Explorer Application", + "allowed_clients": [], "app_type": "non_interactive", - "client_metadata": { - "foo": "bar" - }, + "callbacks": [], + "client_aliases": [], + "client_metadata": {}, "custom_login_page_on": true, "grant_types": [ "client_credentials" @@ -1444,6 +1546,14 @@ "lifetime_in_seconds": 36000, "secret_encoded": false }, + "native_social_login": { + "apple": { + "enabled": false + }, + "facebook": { + "enabled": false + } + }, "oidc_conformant": true, "refresh_token": { "expiration_type": "non-expiring", @@ -1463,11 +1573,19 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "Quickstarts API (Test Application)", - "client_metadata": { - "foo": "bar" - }, + "name": "API Explorer Application", + "allowed_clients": [], + "callbacks": [], + "client_metadata": {}, "is_first_party": true, + "native_social_login": { + "apple": { + "enabled": false + }, + "facebook": { + "enabled": false + } + }, "oidc_conformant": true, "refresh_token": { "expiration_type": "non-expiring", @@ -1490,7 +1608,7 @@ "subject": "/CN=auth0-deploy-cli-e2e.us.auth0.com" } ], - "client_id": "WYPQxuqDdeNZHLcJeuPq0AvuNFtMiUgU", + "client_id": "0ltKN06qv5WnNoNz2Fu6QvyOl2o6K6nE", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -1498,6 +1616,7 @@ "lifetime_in_seconds": 36000, "secret_encoded": false }, + "client_aliases": [], "token_endpoint_auth_method": "client_secret_post", "app_type": "non_interactive", "grant_types": [ @@ -1513,14 +1632,16 @@ "method": "POST", "path": "/api/v2/clients", "body": { - "name": "API Explorer Application", + "name": "The Default App", "allowed_clients": [], - "app_type": "non_interactive", "callbacks": [], "client_aliases": [], "client_metadata": {}, "custom_login_page_on": true, "grant_types": [ + "authorization_code", + "implicit", + "refresh_token", "client_credentials" ], "is_first_party": true, @@ -1538,16 +1659,17 @@ "enabled": false } }, - "oidc_conformant": true, + "oidc_conformant": false, "refresh_token": { "expiration_type": "non-expiring", "leeway": 0, "infinite_token_lifetime": true, "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, + "token_lifetime": 2592000, + "idle_token_lifetime": 1296000, "rotation_type": "non-rotating" }, + "sso": false, "sso_disabled": false, "token_endpoint_auth_method": "client_secret_post", "cross_origin_authentication": false @@ -1557,7 +1679,7 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "API Explorer Application", + "name": "The Default App", "allowed_clients": [], "callbacks": [], "client_metadata": {}, @@ -1570,16 +1692,17 @@ "enabled": false } }, - "oidc_conformant": true, + "oidc_conformant": false, "refresh_token": { "expiration_type": "non-expiring", "leeway": 0, "infinite_token_lifetime": true, "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, + "token_lifetime": 2592000, + "idle_token_lifetime": 1296000, "rotation_type": "non-rotating" }, + "sso": false, "sso_disabled": false, "cross_origin_authentication": false, "cross_origin_auth": false, @@ -1592,7 +1715,7 @@ "subject": "/CN=auth0-deploy-cli-e2e.us.auth0.com" } ], - "client_id": "uf1Ju9xwQ09AWpcnRnwD91W3Sv3bf76S", + "client_id": "ahrUt7DkBom8m2EAs0zLSccaylYIuVfF", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -1602,8 +1725,10 @@ }, "client_aliases": [], "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", "grant_types": [ + "authorization_code", + "implicit", + "refresh_token", "client_credentials" ], "custom_login_page_on": true @@ -1672,7 +1797,7 @@ "subject": "/CN=auth0-deploy-cli-e2e.us.auth0.com" } ], - "client_id": "VvKPDeB2QHhtG4tVBNcrRUuChB0jWefu", + "client_id": "GH55Wtak9aTrj6tjRFObq1cqnu5a8mtM", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -1789,7 +1914,7 @@ "subject": "/CN=auth0-deploy-cli-e2e.us.auth0.com" } ], - "client_id": "xODbqyam7rjqHDsYKjU9Tuo99yaBnR5T", + "client_id": "68Ty4a89yPogS0UGdX8aYaS6td9DXYjs", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -1818,16 +1943,14 @@ "method": "POST", "path": "/api/v2/clients", "body": { - "name": "The Default App", + "name": "auth0-deploy-cli-extension", "allowed_clients": [], + "app_type": "non_interactive", "callbacks": [], "client_aliases": [], "client_metadata": {}, "custom_login_page_on": true, "grant_types": [ - "authorization_code", - "implicit", - "refresh_token", "client_credentials" ], "is_first_party": true, @@ -1845,17 +1968,16 @@ "enabled": false } }, - "oidc_conformant": false, + "oidc_conformant": true, "refresh_token": { "expiration_type": "non-expiring", "leeway": 0, "infinite_token_lifetime": true, "infinite_idle_token_lifetime": true, - "token_lifetime": 2592000, - "idle_token_lifetime": 1296000, + "token_lifetime": 31557600, + "idle_token_lifetime": 2592000, "rotation_type": "non-rotating" }, - "sso": false, "sso_disabled": false, "token_endpoint_auth_method": "client_secret_post", "cross_origin_authentication": false @@ -1865,7 +1987,7 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "The Default App", + "name": "auth0-deploy-cli-extension", "allowed_clients": [], "callbacks": [], "client_metadata": {}, @@ -1878,17 +2000,16 @@ "enabled": false } }, - "oidc_conformant": false, + "oidc_conformant": true, "refresh_token": { "expiration_type": "non-expiring", "leeway": 0, "infinite_token_lifetime": true, "infinite_idle_token_lifetime": true, - "token_lifetime": 2592000, - "idle_token_lifetime": 1296000, + "token_lifetime": 31557600, + "idle_token_lifetime": 2592000, "rotation_type": "non-rotating" }, - "sso": false, "sso_disabled": false, "cross_origin_authentication": false, "cross_origin_auth": false, @@ -1901,7 +2022,7 @@ "subject": "/CN=auth0-deploy-cli-e2e.us.auth0.com" } ], - "client_id": "xYOv2UsoAuKptIEAjkeB62Oaeg1Jn2QX", + "client_id": "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -1911,10 +2032,8 @@ }, "client_aliases": [], "token_endpoint_auth_method": "client_secret_post", + "app_type": "non_interactive", "grant_types": [ - "authorization_code", - "implicit", - "refresh_token", "client_credentials" ], "custom_login_page_on": true @@ -1924,103 +2043,14 @@ }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "POST", - "path": "/api/v2/clients", + "method": "PUT", + "path": "/api/v2/guardian/factors/email", "body": { - "name": "auth0-deploy-cli-extension", - "allowed_clients": [], - "app_type": "non_interactive", - "callbacks": [], - "client_aliases": [], - "client_metadata": {}, - "custom_login_page_on": true, - "grant_types": [ - "client_credentials" - ], - "is_first_party": true, - "is_token_endpoint_ip_header_trusted": false, - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, - "sso_disabled": false, - "token_endpoint_auth_method": "client_secret_post", - "cross_origin_authentication": false + "enabled": false }, - "status": 201, + "status": 200, "response": { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "auth0-deploy-cli-extension", - "allowed_clients": [], - "callbacks": [], - "client_metadata": {}, - "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "encrypted": true, - "signing_keys": [ - { - "cert": "[REDACTED]", - "key": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "/CN=auth0-deploy-cli-e2e.us.auth0.com" - } - ], - "client_id": "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", - "grant_types": [ - "client_credentials" - ], - "custom_login_page_on": true + "enabled": false }, "rawHeaders": [], "responseIsBinary": false @@ -2028,7 +2058,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PUT", - "path": "/api/v2/guardian/factors/email", + "path": "/api/v2/guardian/factors/otp", "body": { "enabled": false }, @@ -2042,7 +2072,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PUT", - "path": "/api/v2/guardian/factors/otp", + "path": "/api/v2/guardian/factors/duo", "body": { "enabled": false }, @@ -2056,7 +2086,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PUT", - "path": "/api/v2/guardian/factors/sms", + "path": "/api/v2/guardian/factors/webauthn-platform", "body": { "enabled": false }, @@ -2070,7 +2100,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PUT", - "path": "/api/v2/guardian/factors/duo", + "path": "/api/v2/guardian/factors/recovery-code", "body": { "enabled": false }, @@ -2084,7 +2114,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PUT", - "path": "/api/v2/guardian/factors/recovery-code", + "path": "/api/v2/guardian/factors/webauthn-roaming", "body": { "enabled": false }, @@ -2112,21 +2142,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PUT", - "path": "/api/v2/guardian/factors/webauthn-roaming", - "body": { - "enabled": false - }, - "status": 200, - "response": { - "enabled": false - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "PUT", - "path": "/api/v2/guardian/factors/webauthn-platform", + "path": "/api/v2/guardian/factors/sms", "body": { "enabled": false }, @@ -2202,7 +2218,56 @@ "body": "", "status": 200, "response": { - "actions": [], + "actions": [ + { + "id": "ead7d2a3-5a93-43e2-9ec3-455f3c39daf9", + "name": "Custom Phone Provider", + "supported_triggers": [ + { + "id": "custom-phone-provider", + "version": "v1" + } + ], + "created_at": "2025-12-16T10:10:30.752146844Z", + "updated_at": "2025-12-16T10:11:36.910288525Z", + "code": "/**\n* Handler to be executed while sending a phone notification\n* @param {Event} event - Details about the user and the context in which they are logging in.\n* @param {CustomPhoneProviderAPI} api - Methods and utilities to help change the behavior of sending a phone notification.\n*/\nexports.onExecuteCustomPhoneProvider = async (event, api) => {\n // Code goes here\n return;\n};", + "dependencies": [], + "runtime": "node22", + "status": "built", + "secrets": [], + "current_version": { + "id": "83a87aec-f6f7-42bb-b6ad-6fa170f652d1", + "code": "/**\n* Handler to be executed while sending a phone notification\n* @param {Event} event - Details about the user and the context in which they are logging in.\n* @param {CustomPhoneProviderAPI} api - Methods and utilities to help change the behavior of sending a phone notification.\n*/\nexports.onExecuteCustomPhoneProvider = async (event, api) => {\n // Code goes here\n return;\n};", + "runtime": "node22", + "status": "BUILT", + "number": 2, + "build_time": "2025-12-16T10:11:37.710742601Z", + "created_at": "2025-12-16T10:11:37.627490560Z", + "updated_at": "2025-12-16T10:11:37.712144713Z" + }, + "deployed_version": { + "code": "/**\n* Handler to be executed while sending a phone notification\n* @param {Event} event - Details about the user and the context in which they are logging in.\n* @param {CustomPhoneProviderAPI} api - Methods and utilities to help change the behavior of sending a phone notification.\n*/\nexports.onExecuteCustomPhoneProvider = async (event, api) => {\n // Code goes here\n return;\n};", + "dependencies": [], + "id": "83a87aec-f6f7-42bb-b6ad-6fa170f652d1", + "deployed": true, + "number": 2, + "built_at": "2025-12-16T10:11:37.710742601Z", + "secrets": [], + "status": "built", + "created_at": "2025-12-16T10:11:37.627490560Z", + "updated_at": "2025-12-16T10:11:37.712144713Z", + "runtime": "node22", + "supported_triggers": [ + { + "id": "custom-phone-provider", + "version": "v1" + } + ] + }, + "all_changes_deployed": true + } + ], + "total": 1, "per_page": 100 }, "rawHeaders": [], @@ -2227,7 +2292,7 @@ }, "status": 201, "response": { - "id": "d67e0c5e-5be5-4ea1-8b75-29c65f79b7fe", + "id": "9cc78117-5697-42a8-9c1f-03bf8e5a3689", "name": "My Custom Action", "supported_triggers": [ { @@ -2235,8 +2300,8 @@ "version": "v2" } ], - "created_at": "2025-12-05T07:01:47.853050355Z", - "updated_at": "2025-12-05T07:01:47.866830407Z", + "created_at": "2025-12-16T10:12:49.378691946Z", + "updated_at": "2025-12-16T10:12:49.386633985Z", "code": "/**\n * Handler that will be called during the execution of a PostLogin flow.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\nexports.onExecutePostLogin = async (event, api) => {\n console.log('Some custom action!');\n};\n\n/**\n * Handler that will be invoked when this action is resuming after an external redirect. If your\n * onExecutePostLogin function does not perform a redirect, this function can be safely ignored.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\n// exports.onContinuePostLogin = async (event, api) => {\n// };\n", "dependencies": [], "runtime": "node18", @@ -2256,7 +2321,54 @@ "response": { "actions": [ { - "id": "d67e0c5e-5be5-4ea1-8b75-29c65f79b7fe", + "id": "ead7d2a3-5a93-43e2-9ec3-455f3c39daf9", + "name": "Custom Phone Provider", + "supported_triggers": [ + { + "id": "custom-phone-provider", + "version": "v1" + } + ], + "created_at": "2025-12-16T10:10:30.752146844Z", + "updated_at": "2025-12-16T10:11:36.910288525Z", + "code": "/**\n* Handler to be executed while sending a phone notification\n* @param {Event} event - Details about the user and the context in which they are logging in.\n* @param {CustomPhoneProviderAPI} api - Methods and utilities to help change the behavior of sending a phone notification.\n*/\nexports.onExecuteCustomPhoneProvider = async (event, api) => {\n // Code goes here\n return;\n};", + "dependencies": [], + "runtime": "node22", + "status": "built", + "secrets": [], + "current_version": { + "id": "83a87aec-f6f7-42bb-b6ad-6fa170f652d1", + "code": "/**\n* Handler to be executed while sending a phone notification\n* @param {Event} event - Details about the user and the context in which they are logging in.\n* @param {CustomPhoneProviderAPI} api - Methods and utilities to help change the behavior of sending a phone notification.\n*/\nexports.onExecuteCustomPhoneProvider = async (event, api) => {\n // Code goes here\n return;\n};", + "runtime": "node22", + "status": "BUILT", + "number": 2, + "build_time": "2025-12-16T10:11:37.710742601Z", + "created_at": "2025-12-16T10:11:37.627490560Z", + "updated_at": "2025-12-16T10:11:37.712144713Z" + }, + "deployed_version": { + "code": "/**\n* Handler to be executed while sending a phone notification\n* @param {Event} event - Details about the user and the context in which they are logging in.\n* @param {CustomPhoneProviderAPI} api - Methods and utilities to help change the behavior of sending a phone notification.\n*/\nexports.onExecuteCustomPhoneProvider = async (event, api) => {\n // Code goes here\n return;\n};", + "dependencies": [], + "id": "83a87aec-f6f7-42bb-b6ad-6fa170f652d1", + "deployed": true, + "number": 2, + "built_at": "2025-12-16T10:11:37.710742601Z", + "secrets": [], + "status": "built", + "created_at": "2025-12-16T10:11:37.627490560Z", + "updated_at": "2025-12-16T10:11:37.712144713Z", + "runtime": "node22", + "supported_triggers": [ + { + "id": "custom-phone-provider", + "version": "v1" + } + ] + }, + "all_changes_deployed": true + }, + { + "id": "9cc78117-5697-42a8-9c1f-03bf8e5a3689", "name": "My Custom Action", "supported_triggers": [ { @@ -2264,8 +2376,8 @@ "version": "v2" } ], - "created_at": "2025-12-05T07:01:47.853050355Z", - "updated_at": "2025-12-05T07:01:47.866830407Z", + "created_at": "2025-12-16T10:12:49.378691946Z", + "updated_at": "2025-12-16T10:12:49.386633985Z", "code": "/**\n * Handler that will be called during the execution of a PostLogin flow.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\nexports.onExecutePostLogin = async (event, api) => {\n console.log('Some custom action!');\n};\n\n/**\n * Handler that will be invoked when this action is resuming after an external redirect. If your\n * onExecutePostLogin function does not perform a redirect, this function can be safely ignored.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\n// exports.onContinuePostLogin = async (event, api) => {\n// };\n", "dependencies": [], "runtime": "node18", @@ -2274,7 +2386,7 @@ "all_changes_deployed": false } ], - "total": 1, + "total": 2, "per_page": 100 }, "rawHeaders": [], @@ -2283,19 +2395,19 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "POST", - "path": "/api/v2/actions/actions/d67e0c5e-5be5-4ea1-8b75-29c65f79b7fe/deploy", + "path": "/api/v2/actions/actions/9cc78117-5697-42a8-9c1f-03bf8e5a3689/deploy", "body": "", "status": 200, "response": { "code": "/**\n * Handler that will be called during the execution of a PostLogin flow.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\nexports.onExecutePostLogin = async (event, api) => {\n console.log('Some custom action!');\n};\n\n/**\n * Handler that will be invoked when this action is resuming after an external redirect. If your\n * onExecutePostLogin function does not perform a redirect, this function can be safely ignored.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\n// exports.onContinuePostLogin = async (event, api) => {\n// };\n", "dependencies": [], - "id": "5b00cfd8-995b-428f-a908-7b162477d1eb", + "id": "9f712c5b-390c-46d5-92f1-899d62f0e892", "deployed": false, "number": 1, "secrets": [], "status": "built", - "created_at": "2025-12-05T07:01:48.828404196Z", - "updated_at": "2025-12-05T07:01:48.828404196Z", + "created_at": "2025-12-16T10:12:50.209634926Z", + "updated_at": "2025-12-16T10:12:50.209634926Z", "runtime": "node18", "supported_triggers": [ { @@ -2304,7 +2416,7 @@ } ], "action": { - "id": "d67e0c5e-5be5-4ea1-8b75-29c65f79b7fe", + "id": "9cc78117-5697-42a8-9c1f-03bf8e5a3689", "name": "My Custom Action", "supported_triggers": [ { @@ -2312,60 +2424,14 @@ "version": "v2" } ], - "created_at": "2025-12-05T07:01:47.853050355Z", - "updated_at": "2025-12-05T07:01:47.853050355Z", + "created_at": "2025-12-16T10:12:49.378691946Z", + "updated_at": "2025-12-16T10:12:49.378691946Z", "all_changes_deployed": false } }, "rawHeaders": [], "responseIsBinary": false }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "PATCH", - "path": "/api/v2/attack-protection/suspicious-ip-throttling", - "body": { - "enabled": true, - "shields": [ - "admin_notification" - ], - "allowlist": [ - "127.0.0.1" - ], - "stage": { - "pre-login": { - "max_attempts": 66, - "rate": 864000 - }, - "pre-user-registration": { - "max_attempts": 66, - "rate": 1200 - } - } - }, - "status": 200, - "response": { - "enabled": true, - "shields": [ - "admin_notification" - ], - "allowlist": [ - "127.0.0.1" - ], - "stage": { - "pre-login": { - "max_attempts": 66, - "rate": 864000 - }, - "pre-user-registration": { - "max_attempts": 66, - "rate": 1200 - } - } - }, - "rawHeaders": [], - "responseIsBinary": false - }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PATCH", @@ -2422,6 +2488,56 @@ "rawHeaders": [], "responseIsBinary": false }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "PATCH", + "path": "/api/v2/attack-protection/suspicious-ip-throttling", + "body": { + "enabled": true, + "shields": [ + "admin_notification" + ], + "allowlist": [ + "127.0.0.1" + ], + "stage": { + "pre-login": { + "max_attempts": 66, + "rate": 864000 + }, + "pre-user-registration": { + "max_attempts": 66, + "rate": 1200 + } + } + }, + "status": 200, + "response": { + "enabled": true, + "shields": [ + "admin_notification" + ], + "allowlist": [ + "127.0.0.1" + ], + "stage": { + "pre-login": { + "max_attempts": 66, + "rate": 864000 + }, + "pre-user-registration": { + "max_attempts": 66, + "rate": 1200 + }, + "pre-custom-token-exchange": { + "max_attempts": 10, + "rate": 600000 + } + } + }, + "rawHeaders": [], + "responseIsBinary": false + }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", @@ -2449,7 +2565,7 @@ } }, "created_at": "2025-09-09T04:41:43.671Z", - "updated_at": "2025-12-05T03:06:43.308Z", + "updated_at": "2025-12-16T10:11:39.157Z", "id": "acl_wpZ6oScRU5L6QKAxMUMHmx" } ] @@ -2459,7 +2575,7 @@ }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "PUT", + "method": "PATCH", "path": "/api/v2/network-acls/acl_wpZ6oScRU5L6QKAxMUMHmx", "body": { "priority": 1, @@ -2494,7 +2610,7 @@ } }, "created_at": "2025-09-09T04:41:43.671Z", - "updated_at": "2025-12-05T07:01:50.211Z", + "updated_at": "2025-12-16T10:12:51.416Z", "id": "acl_wpZ6oScRU5L6QKAxMUMHmx" }, "rawHeaders": [], @@ -2555,67 +2671,12 @@ "rawHeaders": [], "responseIsBinary": false }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/user-attribute-profiles?take=10", - "body": "", - "status": 200, - "response": { - "user_attribute_profiles": [ - { - "id": "uap_1csDj3szFsgxGS1oTZTdFm", - "name": "test-user-attribute-profile-2", - "user_id": { - "oidc_mapping": "sub", - "saml_mapping": [ - "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier", - "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn", - "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name" - ], - "scim_mapping": "externalId" - }, - "user_attributes": { - "email": { - "label": "Email", - "description": "Email of the User", - "auth0_mapping": "email", - "profile_required": true - } - } - }, - { - "id": "uap_1csDj3sAVu6n5eTzLw6XZg", - "name": "test-user-attribute-profile", - "user_id": { - "oidc_mapping": "sub", - "saml_mapping": [ - "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier", - "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn", - "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name" - ], - "scim_mapping": "externalId" - }, - "user_attributes": { - "email": { - "label": "Email", - "description": "Email of the User", - "auth0_mapping": "email", - "profile_required": true - } - } - } - ] - }, - "rawHeaders": [], - "responseIsBinary": false - }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PATCH", - "path": "/api/v2/user-attribute-profiles/uap_1csDj3szFsgxGS1oTZTdFm", + "path": "/api/v2/user-attribute-profiles/uap_1csDj3sAVu6n5eTzLw6XZg", "body": { - "name": "test-user-attribute-profile-2", + "name": "test-user-attribute-profile", "user_attributes": { "email": { "description": "Email of the User", @@ -2631,8 +2692,8 @@ }, "status": 200, "response": { - "id": "uap_1csDj3szFsgxGS1oTZTdFm", - "name": "test-user-attribute-profile-2", + "id": "uap_1csDj3sAVu6n5eTzLw6XZg", + "name": "test-user-attribute-profile", "user_id": { "oidc_mapping": "sub", "saml_mapping": [ @@ -2657,9 +2718,9 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PATCH", - "path": "/api/v2/user-attribute-profiles/uap_1csDj3sAVu6n5eTzLw6XZg", + "path": "/api/v2/user-attribute-profiles/uap_1csDj3szFsgxGS1oTZTdFm", "body": { - "name": "test-user-attribute-profile", + "name": "test-user-attribute-profile-2", "user_attributes": { "email": { "description": "Email of the User", @@ -2675,8 +2736,8 @@ }, "status": 200, "response": { - "id": "uap_1csDj3sAVu6n5eTzLw6XZg", - "name": "test-user-attribute-profile", + "id": "uap_1csDj3szFsgxGS1oTZTdFm", + "name": "test-user-attribute-profile-2", "user_id": { "oidc_mapping": "sub", "saml_mapping": [ @@ -2791,7 +2852,7 @@ "subject": "deprecated" } ], - "client_id": "cLFFGtjp2Xe7HWQCHfCtQxmURfSu1lDH", + "client_id": "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -2844,7 +2905,7 @@ "subject": "deprecated" } ], - "client_id": "uf1Ju9xwQ09AWpcnRnwD91W3Sv3bf76S", + "client_id": "0ltKN06qv5WnNoNz2Fu6QvyOl2o6K6nE", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -2889,7 +2950,7 @@ "subject": "deprecated" } ], - "client_id": "WYPQxuqDdeNZHLcJeuPq0AvuNFtMiUgU", + "client_id": "HC5UXDFP5lEc2vbTkPQWJ1yYeiLRkmDg", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -2943,7 +3004,7 @@ } ], "allowed_origins": [], - "client_id": "QwKFSZ87TYF89lXp66sVFpGzYGQ07OU6", + "client_id": "KjqnjAT6PWajvX3XKVkWhFVaW8sFBWyv", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -2989,7 +3050,7 @@ "subject": "deprecated" } ], - "client_id": "VvKPDeB2QHhtG4tVBNcrRUuChB0jWefu", + "client_id": "GH55Wtak9aTrj6tjRFObq1cqnu5a8mtM", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -3008,14 +3069,9 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "Test SPA", + "name": "The Default App", "allowed_clients": [], - "allowed_logout_urls": [ - "http://localhost:3000" - ], - "callbacks": [ - "http://localhost:3000" - ], + "callbacks": [], "client_metadata": {}, "is_first_party": true, "native_social_login": { @@ -3026,16 +3082,17 @@ "enabled": false } }, - "oidc_conformant": true, + "oidc_conformant": false, "refresh_token": { - "expiration_type": "expiring", + "expiration_type": "non-expiring", "leeway": 0, + "infinite_token_lifetime": true, + "infinite_idle_token_lifetime": true, "token_lifetime": 2592000, "idle_token_lifetime": 1296000, - "infinite_token_lifetime": false, - "infinite_idle_token_lifetime": false, - "rotation_type": "rotating" + "rotation_type": "non-rotating" }, + "sso": false, "sso_disabled": false, "cross_origin_authentication": false, "cross_origin_auth": false, @@ -3046,7 +3103,7 @@ "subject": "deprecated" } ], - "client_id": "xODbqyam7rjqHDsYKjU9Tuo99yaBnR5T", + "client_id": "ahrUt7DkBom8m2EAs0zLSccaylYIuVfF", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -3055,15 +3112,12 @@ "secret_encoded": false }, "client_aliases": [], - "token_endpoint_auth_method": "none", - "app_type": "spa", + "token_endpoint_auth_method": "client_secret_post", "grant_types": [ "authorization_code", "implicit", - "refresh_token" - ], - "web_origins": [ - "http://localhost:3000" + "refresh_token", + "client_credentials" ], "custom_login_page_on": true }, @@ -3071,9 +3125,14 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "auth0-deploy-cli-extension", + "name": "Test SPA", "allowed_clients": [], - "callbacks": [], + "allowed_logout_urls": [ + "http://localhost:3000" + ], + "callbacks": [ + "http://localhost:3000" + ], "client_metadata": {}, "is_first_party": true, "native_social_login": { @@ -3086,13 +3145,13 @@ }, "oidc_conformant": true, "refresh_token": { - "expiration_type": "non-expiring", + "expiration_type": "expiring", "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" + "token_lifetime": 2592000, + "idle_token_lifetime": 1296000, + "infinite_token_lifetime": false, + "infinite_idle_token_lifetime": false, + "rotation_type": "rotating" }, "sso_disabled": false, "cross_origin_authentication": false, @@ -3104,7 +3163,7 @@ "subject": "deprecated" } ], - "client_id": "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1", + "client_id": "68Ty4a89yPogS0UGdX8aYaS6td9DXYjs", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -3113,10 +3172,15 @@ "secret_encoded": false }, "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", + "token_endpoint_auth_method": "none", + "app_type": "spa", "grant_types": [ - "client_credentials" + "authorization_code", + "implicit", + "refresh_token" + ], + "web_origins": [ + "http://localhost:3000" ], "custom_login_page_on": true }, @@ -3124,7 +3188,7 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "The Default App", + "name": "auth0-deploy-cli-extension", "allowed_clients": [], "callbacks": [], "client_metadata": {}, @@ -3137,17 +3201,16 @@ "enabled": false } }, - "oidc_conformant": false, + "oidc_conformant": true, "refresh_token": { "expiration_type": "non-expiring", "leeway": 0, "infinite_token_lifetime": true, "infinite_idle_token_lifetime": true, - "token_lifetime": 2592000, - "idle_token_lifetime": 1296000, + "token_lifetime": 31557600, + "idle_token_lifetime": 2592000, "rotation_type": "non-rotating" }, - "sso": false, "sso_disabled": false, "cross_origin_authentication": false, "cross_origin_auth": false, @@ -3158,7 +3221,7 @@ "subject": "deprecated" } ], - "client_id": "xYOv2UsoAuKptIEAjkeB62Oaeg1Jn2QX", + "client_id": "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -3168,10 +3231,8 @@ }, "client_aliases": [], "token_endpoint_auth_method": "client_secret_post", + "app_type": "non_interactive", "grant_types": [ - "authorization_code", - "implicit", - "refresh_token", "client_credentials" ], "custom_login_page_on": true @@ -3221,16 +3282,13 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections?include_totals=true&strategy=auth0", + "path": "/api/v2/connections?take=50&strategy=auth0", "body": "", "status": 200, "response": { - "total": 1, - "start": 0, - "limit": 50, "connections": [ { - "id": "con_Ty3Nbl0J1Ddxat41", + "id": "con_3R2lX4rln4ArocW5", "options": { "mfa": { "active": true, @@ -3268,7 +3326,7 @@ ], "enabled_clients": [ "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", - "cLFFGtjp2Xe7HWQCHfCtQxmURfSu1lDH" + "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" ] } ] @@ -3279,13 +3337,13 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections?include_totals=true&take=50&strategy=auth0", + "path": "/api/v2/connections?take=50&strategy=auth0", "body": "", "status": 200, "response": { "connections": [ { - "id": "con_Ty3Nbl0J1Ddxat41", + "id": "con_3R2lX4rln4ArocW5", "options": { "mfa": { "active": true, @@ -3323,7 +3381,7 @@ ], "enabled_clients": [ "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", - "cLFFGtjp2Xe7HWQCHfCtQxmURfSu1lDH" + "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" ] } ] @@ -3334,110 +3392,16 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections?include_totals=true&strategy=auth0", + "path": "/api/v2/connections/con_3R2lX4rln4ArocW5/clients?take=50", "body": "", "status": 200, "response": { - "total": 1, - "start": 0, - "limit": 50, - "connections": [ + "clients": [ { - "id": "con_Ty3Nbl0J1Ddxat41", - "options": { - "mfa": { - "active": true, - "return_enroll_settings": true - }, - "passwordPolicy": "good", - "passkey_options": { - "challenge_ui": "both", - "local_enrollment_enabled": true, - "progressive_enrollment_enabled": true - }, - "strategy_version": 2, - "authentication_methods": { - "passkey": { - "enabled": false - }, - "password": { - "enabled": true, - "api_behavior": "required" - } - }, - "brute_force_protection": true - }, - "strategy": "auth0", - "name": "Username-Password-Authentication", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "Username-Password-Authentication" - ], - "enabled_clients": [ - "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", - "cLFFGtjp2Xe7HWQCHfCtQxmURfSu1lDH" - ] - } - ] - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/connections?include_totals=true&take=50&strategy=auth0", - "body": "", - "status": 200, - "response": { - "connections": [ + "client_id": "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" + }, { - "id": "con_Ty3Nbl0J1Ddxat41", - "options": { - "mfa": { - "active": true, - "return_enroll_settings": true - }, - "passwordPolicy": "good", - "passkey_options": { - "challenge_ui": "both", - "local_enrollment_enabled": true, - "progressive_enrollment_enabled": true - }, - "strategy_version": 2, - "authentication_methods": { - "passkey": { - "enabled": false - }, - "password": { - "enabled": true, - "api_behavior": "required" - } - }, - "brute_force_protection": true - }, - "strategy": "auth0", - "name": "Username-Password-Authentication", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "Username-Password-Authentication" - ], - "enabled_clients": [ - "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", - "cLFFGtjp2Xe7HWQCHfCtQxmURfSu1lDH" - ] + "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE" } ] }, @@ -3447,13 +3411,13 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections/con_Ty3Nbl0J1Ddxat41/clients?take=50", + "path": "/api/v2/connections/con_3R2lX4rln4ArocW5/clients?take=50", "body": "", "status": 200, "response": { "clients": [ { - "client_id": "cLFFGtjp2Xe7HWQCHfCtQxmURfSu1lDH" + "client_id": "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" }, { "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE" @@ -3471,8 +3435,8 @@ "name": "boo-baz-db-connection-test", "strategy": "auth0", "enabled_clients": [ - "QwKFSZ87TYF89lXp66sVFpGzYGQ07OU6", - "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1" + "KjqnjAT6PWajvX3XKVkWhFVaW8sFBWyv", + "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU" ], "is_domain_connection": false, "options": { @@ -3516,7 +3480,7 @@ }, "status": 201, "response": { - "id": "con_fuBNFcmY8aL3HDBT", + "id": "con_cxSOS7uLgPojtLBh", "options": { "mfa": { "active": true, @@ -3576,8 +3540,8 @@ "active": false }, "enabled_clients": [ - "QwKFSZ87TYF89lXp66sVFpGzYGQ07OU6", - "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1" + "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU", + "KjqnjAT6PWajvX3XKVkWhFVaW8sFBWyv" ], "realms": [ "boo-baz-db-connection-test" @@ -3589,13 +3553,13 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections?include_totals=true&take=1&name=boo-baz-db-connection-test", + "path": "/api/v2/connections?take=1&name=boo-baz-db-connection-test&include_fields=true", "body": "", "status": 200, "response": { "connections": [ { - "id": "con_fuBNFcmY8aL3HDBT", + "id": "con_cxSOS7uLgPojtLBh", "options": { "mfa": { "active": true, @@ -3658,8 +3622,8 @@ "boo-baz-db-connection-test" ], "enabled_clients": [ - "QwKFSZ87TYF89lXp66sVFpGzYGQ07OU6", - "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1" + "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU", + "KjqnjAT6PWajvX3XKVkWhFVaW8sFBWyv" ] } ] @@ -3670,14 +3634,14 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PATCH", - "path": "/api/v2/connections/con_fuBNFcmY8aL3HDBT/clients", + "path": "/api/v2/connections/con_cxSOS7uLgPojtLBh/clients", "body": [ { - "client_id": "QwKFSZ87TYF89lXp66sVFpGzYGQ07OU6", + "client_id": "KjqnjAT6PWajvX3XKVkWhFVaW8sFBWyv", "status": true }, { - "client_id": "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1", + "client_id": "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU", "status": true } ], @@ -3779,7 +3743,7 @@ "subject": "deprecated" } ], - "client_id": "cLFFGtjp2Xe7HWQCHfCtQxmURfSu1lDH", + "client_id": "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -3832,7 +3796,7 @@ "subject": "deprecated" } ], - "client_id": "uf1Ju9xwQ09AWpcnRnwD91W3Sv3bf76S", + "client_id": "0ltKN06qv5WnNoNz2Fu6QvyOl2o6K6nE", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -3877,7 +3841,7 @@ "subject": "deprecated" } ], - "client_id": "WYPQxuqDdeNZHLcJeuPq0AvuNFtMiUgU", + "client_id": "HC5UXDFP5lEc2vbTkPQWJ1yYeiLRkmDg", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -3931,7 +3895,7 @@ } ], "allowed_origins": [], - "client_id": "QwKFSZ87TYF89lXp66sVFpGzYGQ07OU6", + "client_id": "KjqnjAT6PWajvX3XKVkWhFVaW8sFBWyv", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -3977,7 +3941,7 @@ "subject": "deprecated" } ], - "client_id": "VvKPDeB2QHhtG4tVBNcrRUuChB0jWefu", + "client_id": "GH55Wtak9aTrj6tjRFObq1cqnu5a8mtM", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -3996,14 +3960,9 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "Test SPA", + "name": "The Default App", "allowed_clients": [], - "allowed_logout_urls": [ - "http://localhost:3000" - ], - "callbacks": [ - "http://localhost:3000" - ], + "callbacks": [], "client_metadata": {}, "is_first_party": true, "native_social_login": { @@ -4014,16 +3973,17 @@ "enabled": false } }, - "oidc_conformant": true, + "oidc_conformant": false, "refresh_token": { - "expiration_type": "expiring", + "expiration_type": "non-expiring", "leeway": 0, + "infinite_token_lifetime": true, + "infinite_idle_token_lifetime": true, "token_lifetime": 2592000, "idle_token_lifetime": 1296000, - "infinite_token_lifetime": false, - "infinite_idle_token_lifetime": false, - "rotation_type": "rotating" + "rotation_type": "non-rotating" }, + "sso": false, "sso_disabled": false, "cross_origin_authentication": false, "cross_origin_auth": false, @@ -4034,7 +3994,7 @@ "subject": "deprecated" } ], - "client_id": "xODbqyam7rjqHDsYKjU9Tuo99yaBnR5T", + "client_id": "ahrUt7DkBom8m2EAs0zLSccaylYIuVfF", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -4043,15 +4003,12 @@ "secret_encoded": false }, "client_aliases": [], - "token_endpoint_auth_method": "none", - "app_type": "spa", + "token_endpoint_auth_method": "client_secret_post", "grant_types": [ "authorization_code", "implicit", - "refresh_token" - ], - "web_origins": [ - "http://localhost:3000" + "refresh_token", + "client_credentials" ], "custom_login_page_on": true }, @@ -4059,9 +4016,14 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "auth0-deploy-cli-extension", + "name": "Test SPA", "allowed_clients": [], - "callbacks": [], + "allowed_logout_urls": [ + "http://localhost:3000" + ], + "callbacks": [ + "http://localhost:3000" + ], "client_metadata": {}, "is_first_party": true, "native_social_login": { @@ -4074,13 +4036,13 @@ }, "oidc_conformant": true, "refresh_token": { - "expiration_type": "non-expiring", + "expiration_type": "expiring", "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" + "token_lifetime": 2592000, + "idle_token_lifetime": 1296000, + "infinite_token_lifetime": false, + "infinite_idle_token_lifetime": false, + "rotation_type": "rotating" }, "sso_disabled": false, "cross_origin_authentication": false, @@ -4092,7 +4054,7 @@ "subject": "deprecated" } ], - "client_id": "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1", + "client_id": "68Ty4a89yPogS0UGdX8aYaS6td9DXYjs", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -4101,10 +4063,15 @@ "secret_encoded": false }, "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", + "token_endpoint_auth_method": "none", + "app_type": "spa", "grant_types": [ - "client_credentials" + "authorization_code", + "implicit", + "refresh_token" + ], + "web_origins": [ + "http://localhost:3000" ], "custom_login_page_on": true }, @@ -4112,7 +4079,7 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "The Default App", + "name": "auth0-deploy-cli-extension", "allowed_clients": [], "callbacks": [], "client_metadata": {}, @@ -4125,17 +4092,16 @@ "enabled": false } }, - "oidc_conformant": false, + "oidc_conformant": true, "refresh_token": { "expiration_type": "non-expiring", "leeway": 0, "infinite_token_lifetime": true, "infinite_idle_token_lifetime": true, - "token_lifetime": 2592000, - "idle_token_lifetime": 1296000, + "token_lifetime": 31557600, + "idle_token_lifetime": 2592000, "rotation_type": "non-rotating" }, - "sso": false, "sso_disabled": false, "cross_origin_authentication": false, "cross_origin_auth": false, @@ -4146,7 +4112,7 @@ "subject": "deprecated" } ], - "client_id": "xYOv2UsoAuKptIEAjkeB62Oaeg1Jn2QX", + "client_id": "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -4156,10 +4122,8 @@ }, "client_aliases": [], "token_endpoint_auth_method": "client_secret_post", + "app_type": "non_interactive", "grant_types": [ - "authorization_code", - "implicit", - "refresh_token", "client_credentials" ], "custom_login_page_on": true @@ -4209,16 +4173,13 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections?include_totals=true", + "path": "/api/v2/connections?take=50", "body": "", "status": 200, "response": { - "total": 2, - "start": 0, - "limit": 50, "connections": [ { - "id": "con_fuBNFcmY8aL3HDBT", + "id": "con_cxSOS7uLgPojtLBh", "options": { "mfa": { "active": true, @@ -4281,37 +4242,22 @@ "boo-baz-db-connection-test" ], "enabled_clients": [ - "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1", - "QwKFSZ87TYF89lXp66sVFpGzYGQ07OU6" + "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU", + "KjqnjAT6PWajvX3XKVkWhFVaW8sFBWyv" ] }, { - "id": "con_Ty3Nbl0J1Ddxat41", + "id": "con_lfhXlIY73LFJlMks", "options": { - "mfa": { - "active": true, - "return_enroll_settings": true - }, - "passwordPolicy": "good", - "passkey_options": { - "challenge_ui": "both", - "local_enrollment_enabled": true, - "progressive_enrollment_enabled": true - }, - "strategy_version": 2, - "authentication_methods": { - "passkey": { - "enabled": false - }, - "password": { - "enabled": true, - "api_behavior": "required" - } - }, - "brute_force_protection": true + "email": true, + "scope": [ + "email", + "profile" + ], + "profile": true }, - "strategy": "auth0", - "name": "Username-Password-Authentication", + "strategy": "google-oauth2", + "name": "google-oauth2", "is_domain_connection": false, "authentication": { "active": true @@ -4320,96 +4266,15 @@ "active": false }, "realms": [ - "Username-Password-Authentication" + "google-oauth2" ], "enabled_clients": [ "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", - "cLFFGtjp2Xe7HWQCHfCtQxmURfSu1lDH" - ] - } - ] - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/connections?include_totals=true&take=50", - "body": "", - "status": 200, - "response": { - "connections": [ - { - "id": "con_fuBNFcmY8aL3HDBT", - "options": { - "mfa": { - "active": true, - "return_enroll_settings": true - }, - "import_mode": false, - "customScripts": { - "login": "function login(email, password, callback) {\n // This script should authenticate a user against the credentials stored in\n // your database.\n // It is executed when a user attempts to log in or immediately after signing\n // up (as a verification that the user was successfully signed up).\n //\n // Everything returned by this script will be set as part of the user profile\n // and will be visible by any of the tenant admins. Avoid adding attributes\n // with values such as passwords, keys, secrets, etc.\n //\n // The `password` parameter of this function is in plain text. It must be\n // hashed/salted to match whatever is stored in your database. For example:\n //\n // var bcrypt = require('bcrypt@0.8.5');\n // bcrypt.compare(password, dbPasswordHash, function(err, res)) { ... }\n //\n // There are three ways this script can finish:\n // 1. The user's credentials are valid. The returned user profile should be in\n // the following format: https://auth0.com/docs/users/normalized/auth0/normalized-user-profile-schema\n // var profile = {\n // user_id: ..., // user_id is mandatory\n // email: ...,\n // [...]\n // };\n // callback(null, profile);\n // 2. The user's credentials are invalid\n // callback(new WrongUsernameOrPasswordError(email, \"my error message\"));\n // 3. Something went wrong while trying to reach your database\n // callback(new Error(\"my error message\"));\n //\n // A list of Node.js modules which can be referenced is available here:\n //\n // https://tehsis.github.io/webtaskio-canirequire/\n console.log('AYYYYYE');\n\n const msg =\n 'Please implement the Login script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "create": "function create(user, callback) {\n // This script should create a user entry in your existing database. It will\n // be executed when a user attempts to sign up, or when a user is created\n // through the Auth0 dashboard or API.\n // When this script has finished executing, the Login script will be\n // executed immediately afterwards, to verify that the user was created\n // successfully.\n //\n // The user object will always contain the following properties:\n // * email: the user's email\n // * password: the password entered by the user, in plain text\n // * tenant: the name of this Auth0 account\n // * client_id: the client ID of the application where the user signed up, or\n // API key if created through the API or Auth0 dashboard\n // * connection: the name of this database connection\n //\n // There are three ways this script can finish:\n // 1. A user was successfully created\n // callback(null);\n // 2. This user already exists in your database\n // callback(new ValidationError(\"user_exists\", \"my error message\"));\n // 3. Something went wrong while trying to reach your database\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Create script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "delete": "function remove(id, callback) {\n // This script remove a user from your existing database.\n // It is executed whenever a user is deleted from the API or Auth0 dashboard.\n //\n // There are two ways that this script can finish:\n // 1. The user was removed successfully:\n // callback(null);\n // 2. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Delete script for this database ' +\n 'connection at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "verify": "function verify(email, callback) {\n // This script should mark the current user's email address as verified in\n // your database.\n // It is executed whenever a user clicks the verification link sent by email.\n // These emails can be customized at https://manage.auth0.com/#/emails.\n // It is safe to assume that the user's email already exists in your database,\n // because verification emails, if enabled, are sent immediately after a\n // successful signup.\n //\n // There are two ways that this script can finish:\n // 1. The user's email was verified successfully\n // callback(null, true);\n // 2. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n //\n // If an error is returned, it will be passed to the query string of the page\n // where the user is being redirected to after clicking the verification link.\n // For example, returning `callback(new Error(\"error\"))` and redirecting to\n // https://example.com would redirect to the following URL:\n // https://example.com?email=alice%40example.com&message=error&success=false\n\n const msg =\n 'Please implement the Verify script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "get_user": "function getByEmail(email, callback) {\n // This script should retrieve a user profile from your existing database,\n // without authenticating the user.\n // It is used to check if a user exists before executing flows that do not\n // require authentication (signup and password reset).\n //\n // There are three ways this script can finish:\n // 1. A user was successfully found. The profile should be in the following\n // format: https://auth0.com/docs/users/normalized/auth0/normalized-user-profile-schema.\n // callback(null, profile);\n // 2. A user was not found\n // callback(null);\n // 3. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Get User script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "change_password": "function changePassword(email, newPassword, callback) {\n // This script should change the password stored for the current user in your\n // database. It is executed when the user clicks on the confirmation link\n // after a reset password request.\n // The content and behavior of password confirmation emails can be customized\n // here: https://manage.auth0.com/#/emails\n // The `newPassword` parameter of this function is in plain text. It must be\n // hashed/salted to match whatever is stored in your database.\n //\n // There are three ways that this script can finish:\n // 1. The user's password was updated successfully:\n // callback(null, true);\n // 2. The user's password was not updated:\n // callback(null, false);\n // 3. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n //\n // If an error is returned, it will be passed to the query string of the page\n // where the user is being redirected to after clicking the confirmation link.\n // For example, returning `callback(new Error(\"error\"))` and redirecting to\n // https://example.com would redirect to the following URL:\n // https://example.com?email=alice%40example.com&message=error&success=false\n\n const msg =\n 'Please implement the Change Password script for this database ' +\n 'connection at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n" - }, - "disable_signup": false, - "passwordPolicy": "low", - "passkey_options": { - "challenge_ui": "both", - "local_enrollment_enabled": true, - "progressive_enrollment_enabled": true - }, - "password_history": { - "size": 5, - "enable": false - }, - "strategy_version": 2, - "requires_username": true, - "password_dictionary": { - "enable": true, - "dictionary": [] - }, - "authentication_methods": { - "passkey": { - "enabled": false - }, - "password": { - "enabled": true, - "api_behavior": "required" - } - }, - "brute_force_protection": true, - "password_no_personal_info": { - "enable": true - }, - "password_complexity_options": { - "min_length": 8 - }, - "enabledDatabaseCustomization": true - }, - "strategy": "auth0", - "name": "boo-baz-db-connection-test", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "boo-baz-db-connection-test" - ], - "enabled_clients": [ - "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1", - "QwKFSZ87TYF89lXp66sVFpGzYGQ07OU6" + "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" ] }, { - "id": "con_Ty3Nbl0J1Ddxat41", + "id": "con_3R2lX4rln4ArocW5", "options": { "mfa": { "active": true, @@ -4447,7 +4312,7 @@ ], "enabled_clients": [ "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", - "cLFFGtjp2Xe7HWQCHfCtQxmURfSu1lDH" + "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" ] } ] @@ -4458,16 +4323,13 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections?include_totals=true", + "path": "/api/v2/connections?take=50", "body": "", "status": 200, "response": { - "total": 2, - "start": 0, - "limit": 50, "connections": [ { - "id": "con_fuBNFcmY8aL3HDBT", + "id": "con_cxSOS7uLgPojtLBh", "options": { "mfa": { "active": true, @@ -4530,37 +4392,22 @@ "boo-baz-db-connection-test" ], "enabled_clients": [ - "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1", - "QwKFSZ87TYF89lXp66sVFpGzYGQ07OU6" + "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU", + "KjqnjAT6PWajvX3XKVkWhFVaW8sFBWyv" ] }, { - "id": "con_Ty3Nbl0J1Ddxat41", + "id": "con_lfhXlIY73LFJlMks", "options": { - "mfa": { - "active": true, - "return_enroll_settings": true - }, - "passwordPolicy": "good", - "passkey_options": { - "challenge_ui": "both", - "local_enrollment_enabled": true, - "progressive_enrollment_enabled": true - }, - "strategy_version": 2, - "authentication_methods": { - "passkey": { - "enabled": false - }, - "password": { - "enabled": true, - "api_behavior": "required" - } - }, - "brute_force_protection": true + "email": true, + "scope": [ + "email", + "profile" + ], + "profile": true }, - "strategy": "auth0", - "name": "Username-Password-Authentication", + "strategy": "google-oauth2", + "name": "google-oauth2", "is_domain_connection": false, "authentication": { "active": true @@ -4569,96 +4416,15 @@ "active": false }, "realms": [ - "Username-Password-Authentication" + "google-oauth2" ], "enabled_clients": [ "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", - "cLFFGtjp2Xe7HWQCHfCtQxmURfSu1lDH" - ] - } - ] - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/connections?include_totals=true&take=50", - "body": "", - "status": 200, - "response": { - "connections": [ - { - "id": "con_fuBNFcmY8aL3HDBT", - "options": { - "mfa": { - "active": true, - "return_enroll_settings": true - }, - "import_mode": false, - "customScripts": { - "login": "function login(email, password, callback) {\n // This script should authenticate a user against the credentials stored in\n // your database.\n // It is executed when a user attempts to log in or immediately after signing\n // up (as a verification that the user was successfully signed up).\n //\n // Everything returned by this script will be set as part of the user profile\n // and will be visible by any of the tenant admins. Avoid adding attributes\n // with values such as passwords, keys, secrets, etc.\n //\n // The `password` parameter of this function is in plain text. It must be\n // hashed/salted to match whatever is stored in your database. For example:\n //\n // var bcrypt = require('bcrypt@0.8.5');\n // bcrypt.compare(password, dbPasswordHash, function(err, res)) { ... }\n //\n // There are three ways this script can finish:\n // 1. The user's credentials are valid. The returned user profile should be in\n // the following format: https://auth0.com/docs/users/normalized/auth0/normalized-user-profile-schema\n // var profile = {\n // user_id: ..., // user_id is mandatory\n // email: ...,\n // [...]\n // };\n // callback(null, profile);\n // 2. The user's credentials are invalid\n // callback(new WrongUsernameOrPasswordError(email, \"my error message\"));\n // 3. Something went wrong while trying to reach your database\n // callback(new Error(\"my error message\"));\n //\n // A list of Node.js modules which can be referenced is available here:\n //\n // https://tehsis.github.io/webtaskio-canirequire/\n console.log('AYYYYYE');\n\n const msg =\n 'Please implement the Login script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "create": "function create(user, callback) {\n // This script should create a user entry in your existing database. It will\n // be executed when a user attempts to sign up, or when a user is created\n // through the Auth0 dashboard or API.\n // When this script has finished executing, the Login script will be\n // executed immediately afterwards, to verify that the user was created\n // successfully.\n //\n // The user object will always contain the following properties:\n // * email: the user's email\n // * password: the password entered by the user, in plain text\n // * tenant: the name of this Auth0 account\n // * client_id: the client ID of the application where the user signed up, or\n // API key if created through the API or Auth0 dashboard\n // * connection: the name of this database connection\n //\n // There are three ways this script can finish:\n // 1. A user was successfully created\n // callback(null);\n // 2. This user already exists in your database\n // callback(new ValidationError(\"user_exists\", \"my error message\"));\n // 3. Something went wrong while trying to reach your database\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Create script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "delete": "function remove(id, callback) {\n // This script remove a user from your existing database.\n // It is executed whenever a user is deleted from the API or Auth0 dashboard.\n //\n // There are two ways that this script can finish:\n // 1. The user was removed successfully:\n // callback(null);\n // 2. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Delete script for this database ' +\n 'connection at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "verify": "function verify(email, callback) {\n // This script should mark the current user's email address as verified in\n // your database.\n // It is executed whenever a user clicks the verification link sent by email.\n // These emails can be customized at https://manage.auth0.com/#/emails.\n // It is safe to assume that the user's email already exists in your database,\n // because verification emails, if enabled, are sent immediately after a\n // successful signup.\n //\n // There are two ways that this script can finish:\n // 1. The user's email was verified successfully\n // callback(null, true);\n // 2. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n //\n // If an error is returned, it will be passed to the query string of the page\n // where the user is being redirected to after clicking the verification link.\n // For example, returning `callback(new Error(\"error\"))` and redirecting to\n // https://example.com would redirect to the following URL:\n // https://example.com?email=alice%40example.com&message=error&success=false\n\n const msg =\n 'Please implement the Verify script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "get_user": "function getByEmail(email, callback) {\n // This script should retrieve a user profile from your existing database,\n // without authenticating the user.\n // It is used to check if a user exists before executing flows that do not\n // require authentication (signup and password reset).\n //\n // There are three ways this script can finish:\n // 1. A user was successfully found. The profile should be in the following\n // format: https://auth0.com/docs/users/normalized/auth0/normalized-user-profile-schema.\n // callback(null, profile);\n // 2. A user was not found\n // callback(null);\n // 3. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Get User script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "change_password": "function changePassword(email, newPassword, callback) {\n // This script should change the password stored for the current user in your\n // database. It is executed when the user clicks on the confirmation link\n // after a reset password request.\n // The content and behavior of password confirmation emails can be customized\n // here: https://manage.auth0.com/#/emails\n // The `newPassword` parameter of this function is in plain text. It must be\n // hashed/salted to match whatever is stored in your database.\n //\n // There are three ways that this script can finish:\n // 1. The user's password was updated successfully:\n // callback(null, true);\n // 2. The user's password was not updated:\n // callback(null, false);\n // 3. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n //\n // If an error is returned, it will be passed to the query string of the page\n // where the user is being redirected to after clicking the confirmation link.\n // For example, returning `callback(new Error(\"error\"))` and redirecting to\n // https://example.com would redirect to the following URL:\n // https://example.com?email=alice%40example.com&message=error&success=false\n\n const msg =\n 'Please implement the Change Password script for this database ' +\n 'connection at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n" - }, - "disable_signup": false, - "passwordPolicy": "low", - "passkey_options": { - "challenge_ui": "both", - "local_enrollment_enabled": true, - "progressive_enrollment_enabled": true - }, - "password_history": { - "size": 5, - "enable": false - }, - "strategy_version": 2, - "requires_username": true, - "password_dictionary": { - "enable": true, - "dictionary": [] - }, - "authentication_methods": { - "passkey": { - "enabled": false - }, - "password": { - "enabled": true, - "api_behavior": "required" - } - }, - "brute_force_protection": true, - "password_no_personal_info": { - "enable": true - }, - "password_complexity_options": { - "min_length": 8 - }, - "enabledDatabaseCustomization": true - }, - "strategy": "auth0", - "name": "boo-baz-db-connection-test", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "boo-baz-db-connection-test" - ], - "enabled_clients": [ - "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1", - "QwKFSZ87TYF89lXp66sVFpGzYGQ07OU6" + "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" ] }, { - "id": "con_Ty3Nbl0J1Ddxat41", + "id": "con_3R2lX4rln4ArocW5", "options": { "mfa": { "active": true, @@ -4696,7 +4462,7 @@ ], "enabled_clients": [ "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", - "cLFFGtjp2Xe7HWQCHfCtQxmURfSu1lDH" + "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" ] } ] @@ -4706,51 +4472,18 @@ }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "POST", - "path": "/api/v2/connections", - "body": { - "name": "google-oauth2", - "strategy": "google-oauth2", - "enabled_clients": [ - "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1", - "xYOv2UsoAuKptIEAjkeB62Oaeg1Jn2QX" - ], - "is_domain_connection": false, - "options": { - "email": true, - "scope": [ - "email", - "profile" - ], - "profile": true - } - }, - "status": 201, + "method": "GET", + "path": "/api/v2/connections/con_lfhXlIY73LFJlMks/clients?take=50", + "body": "", + "status": 200, "response": { - "id": "con_URfc5OIXMzEJtZaz", - "options": { - "email": true, - "scope": [ - "email", - "profile" - ], - "profile": true - }, - "strategy": "google-oauth2", - "name": "google-oauth2", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "enabled_clients": [ - "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1", - "xYOv2UsoAuKptIEAjkeB62Oaeg1Jn2QX" - ], - "realms": [ - "google-oauth2" + "clients": [ + { + "client_id": "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" + }, + { + "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE" + } ] }, "rawHeaders": [], @@ -4759,37 +4492,16 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections?include_totals=true&take=1&name=google-oauth2", + "path": "/api/v2/connections/con_lfhXlIY73LFJlMks/clients?take=50", "body": "", "status": 200, "response": { - "connections": [ + "clients": [ { - "id": "con_URfc5OIXMzEJtZaz", - "options": { - "email": true, - "scope": [ - "email", - "profile" - ], - "profile": true - }, - "strategy": "google-oauth2", - "name": "google-oauth2", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "google-oauth2" - ], - "enabled_clients": [ - "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1", - "xYOv2UsoAuKptIEAjkeB62Oaeg1Jn2QX" - ] + "client_id": "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" + }, + { + "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE" } ] }, @@ -4799,14 +4511,64 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PATCH", - "path": "/api/v2/connections/con_URfc5OIXMzEJtZaz/clients", + "path": "/api/v2/connections/con_lfhXlIY73LFJlMks", + "body": { + "enabled_clients": [ + "ahrUt7DkBom8m2EAs0zLSccaylYIuVfF", + "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU" + ], + "is_domain_connection": false, + "options": { + "email": true, + "scope": [ + "email", + "profile" + ], + "profile": true + } + }, + "status": 200, + "response": { + "id": "con_lfhXlIY73LFJlMks", + "options": { + "email": true, + "scope": [ + "email", + "profile" + ], + "profile": true + }, + "strategy": "google-oauth2", + "name": "google-oauth2", + "is_domain_connection": false, + "authentication": { + "active": true + }, + "connected_accounts": { + "active": false + }, + "enabled_clients": [ + "ahrUt7DkBom8m2EAs0zLSccaylYIuVfF", + "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU" + ], + "realms": [ + "google-oauth2" + ] + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "PATCH", + "path": "/api/v2/connections/con_lfhXlIY73LFJlMks/clients", "body": [ { - "client_id": "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1", + "client_id": "ahrUt7DkBom8m2EAs0zLSccaylYIuVfF", "status": true }, { - "client_id": "xYOv2UsoAuKptIEAjkeB62Oaeg1Jn2QX", + "client_id": "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU", "status": true } ], @@ -4945,7 +4707,7 @@ "subject": "deprecated" } ], - "client_id": "cLFFGtjp2Xe7HWQCHfCtQxmURfSu1lDH", + "client_id": "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -4998,7 +4760,7 @@ "subject": "deprecated" } ], - "client_id": "uf1Ju9xwQ09AWpcnRnwD91W3Sv3bf76S", + "client_id": "0ltKN06qv5WnNoNz2Fu6QvyOl2o6K6nE", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -5043,7 +4805,7 @@ "subject": "deprecated" } ], - "client_id": "WYPQxuqDdeNZHLcJeuPq0AvuNFtMiUgU", + "client_id": "HC5UXDFP5lEc2vbTkPQWJ1yYeiLRkmDg", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -5097,7 +4859,7 @@ } ], "allowed_origins": [], - "client_id": "QwKFSZ87TYF89lXp66sVFpGzYGQ07OU6", + "client_id": "KjqnjAT6PWajvX3XKVkWhFVaW8sFBWyv", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -5143,7 +4905,7 @@ "subject": "deprecated" } ], - "client_id": "VvKPDeB2QHhtG4tVBNcrRUuChB0jWefu", + "client_id": "GH55Wtak9aTrj6tjRFObq1cqnu5a8mtM", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -5162,14 +4924,9 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "Test SPA", + "name": "The Default App", "allowed_clients": [], - "allowed_logout_urls": [ - "http://localhost:3000" - ], - "callbacks": [ - "http://localhost:3000" - ], + "callbacks": [], "client_metadata": {}, "is_first_party": true, "native_social_login": { @@ -5180,16 +4937,17 @@ "enabled": false } }, - "oidc_conformant": true, + "oidc_conformant": false, "refresh_token": { - "expiration_type": "expiring", + "expiration_type": "non-expiring", "leeway": 0, + "infinite_token_lifetime": true, + "infinite_idle_token_lifetime": true, "token_lifetime": 2592000, "idle_token_lifetime": 1296000, - "infinite_token_lifetime": false, - "infinite_idle_token_lifetime": false, - "rotation_type": "rotating" + "rotation_type": "non-rotating" }, + "sso": false, "sso_disabled": false, "cross_origin_authentication": false, "cross_origin_auth": false, @@ -5200,7 +4958,7 @@ "subject": "deprecated" } ], - "client_id": "xODbqyam7rjqHDsYKjU9Tuo99yaBnR5T", + "client_id": "ahrUt7DkBom8m2EAs0zLSccaylYIuVfF", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -5209,15 +4967,12 @@ "secret_encoded": false }, "client_aliases": [], - "token_endpoint_auth_method": "none", - "app_type": "spa", + "token_endpoint_auth_method": "client_secret_post", "grant_types": [ "authorization_code", "implicit", - "refresh_token" - ], - "web_origins": [ - "http://localhost:3000" + "refresh_token", + "client_credentials" ], "custom_login_page_on": true }, @@ -5225,9 +4980,14 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "auth0-deploy-cli-extension", + "name": "Test SPA", "allowed_clients": [], - "callbacks": [], + "allowed_logout_urls": [ + "http://localhost:3000" + ], + "callbacks": [ + "http://localhost:3000" + ], "client_metadata": {}, "is_first_party": true, "native_social_login": { @@ -5240,13 +5000,13 @@ }, "oidc_conformant": true, "refresh_token": { - "expiration_type": "non-expiring", + "expiration_type": "expiring", "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" + "token_lifetime": 2592000, + "idle_token_lifetime": 1296000, + "infinite_token_lifetime": false, + "infinite_idle_token_lifetime": false, + "rotation_type": "rotating" }, "sso_disabled": false, "cross_origin_authentication": false, @@ -5258,7 +5018,7 @@ "subject": "deprecated" } ], - "client_id": "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1", + "client_id": "68Ty4a89yPogS0UGdX8aYaS6td9DXYjs", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -5267,10 +5027,15 @@ "secret_encoded": false }, "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", + "token_endpoint_auth_method": "none", + "app_type": "spa", "grant_types": [ - "client_credentials" + "authorization_code", + "implicit", + "refresh_token" + ], + "web_origins": [ + "http://localhost:3000" ], "custom_login_page_on": true }, @@ -5278,7 +5043,7 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "The Default App", + "name": "auth0-deploy-cli-extension", "allowed_clients": [], "callbacks": [], "client_metadata": {}, @@ -5291,17 +5056,16 @@ "enabled": false } }, - "oidc_conformant": false, + "oidc_conformant": true, "refresh_token": { "expiration_type": "non-expiring", "leeway": 0, "infinite_token_lifetime": true, "infinite_idle_token_lifetime": true, - "token_lifetime": 2592000, - "idle_token_lifetime": 1296000, + "token_lifetime": 31557600, + "idle_token_lifetime": 2592000, "rotation_type": "non-rotating" }, - "sso": false, "sso_disabled": false, "cross_origin_authentication": false, "cross_origin_auth": false, @@ -5312,7 +5076,7 @@ "subject": "deprecated" } ], - "client_id": "xYOv2UsoAuKptIEAjkeB62Oaeg1Jn2QX", + "client_id": "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -5322,10 +5086,8 @@ }, "client_aliases": [], "token_endpoint_auth_method": "client_secret_post", + "app_type": "non_interactive", "grant_types": [ - "authorization_code", - "implicit", - "refresh_token", "client_credentials" ], "custom_login_page_on": true @@ -5375,13 +5137,10 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/client-grants?per_page=100&page=0&include_totals=true", + "path": "/api/v2/client-grants?take=50", "body": "", "status": 200, "response": { - "total": 1, - "start": 0, - "limit": 100, "client_grants": [ { "id": "cgr_pbwejzhwoujrsNE8", @@ -5628,7 +5387,7 @@ "method": "POST", "path": "/api/v2/client-grants", "body": { - "client_id": "VvKPDeB2QHhtG4tVBNcrRUuChB0jWefu", + "client_id": "0ltKN06qv5WnNoNz2Fu6QvyOl2o6K6nE", "audience": "https://auth0-deploy-cli-e2e.us.auth0.com/api/v2/", "scope": [ "read:client_grants", @@ -5765,8 +5524,8 @@ }, "status": 201, "response": { - "id": "cgr_X9WoUpI87FLuMfUp", - "client_id": "VvKPDeB2QHhtG4tVBNcrRUuChB0jWefu", + "id": "cgr_UQhGxDPGii0tSQcs", + "client_id": "0ltKN06qv5WnNoNz2Fu6QvyOl2o6K6nE", "audience": "https://auth0-deploy-cli-e2e.us.auth0.com/api/v2/", "scope": [ "read:client_grants", @@ -5910,7 +5669,7 @@ "method": "POST", "path": "/api/v2/client-grants", "body": { - "client_id": "uf1Ju9xwQ09AWpcnRnwD91W3Sv3bf76S", + "client_id": "GH55Wtak9aTrj6tjRFObq1cqnu5a8mtM", "audience": "https://auth0-deploy-cli-e2e.us.auth0.com/api/v2/", "scope": [ "read:client_grants", @@ -6047,8 +5806,8 @@ }, "status": 201, "response": { - "id": "cgr_s9W4N1r5PKXB4V8l", - "client_id": "uf1Ju9xwQ09AWpcnRnwD91W3Sv3bf76S", + "id": "cgr_S92D2BBPB2wQXFYC", + "client_id": "GH55Wtak9aTrj6tjRFObq1cqnu5a8mtM", "audience": "https://auth0-deploy-cli-e2e.us.auth0.com/api/v2/", "scope": [ "read:client_grants", @@ -6212,7 +5971,7 @@ }, "status": 200, "response": { - "id": "rol_iHF8WkcFPvQFJlvd", + "id": "rol_DW7eDROpAD03JEhC", "name": "Reader", "description": "Can only read things" }, @@ -6224,14 +5983,14 @@ "method": "POST", "path": "/api/v2/roles", "body": { - "name": "Admin", - "description": "Can read and write things" + "name": "read_only", + "description": "Read Only" }, "status": 200, "response": { - "id": "rol_fYWtGL9q5Foq7oJD", - "name": "Admin", - "description": "Can read and write things" + "id": "rol_TDHVhZp26Ti7nQt2", + "name": "read_only", + "description": "Read Only" }, "rawHeaders": [], "responseIsBinary": false @@ -6241,14 +6000,14 @@ "method": "POST", "path": "/api/v2/roles", "body": { - "name": "read_only", - "description": "Read Only" + "name": "Admin", + "description": "Can read and write things" }, "status": 200, "response": { - "id": "rol_AHn82p4ofrvBg4g5", - "name": "read_only", - "description": "Read Only" + "id": "rol_nvXgdsT2ksrlrQpN", + "name": "Admin", + "description": "Can read and write things" }, "rawHeaders": [], "responseIsBinary": false @@ -6263,7 +6022,7 @@ }, "status": 200, "response": { - "id": "rol_J3tWLDMM6zuxlUiT", + "id": "rol_6uNKN3FdNBPgcRFM", "name": "read_osnly", "description": "Readz Only" }, @@ -6299,7 +6058,7 @@ "okta" ], "created_at": "2024-11-26T11:58:18.962Z", - "updated_at": "2025-12-05T03:07:00.312Z", + "updated_at": "2025-12-16T10:11:49.300Z", "branding": { "colors": { "primary": "#19aecc" @@ -6375,7 +6134,7 @@ "okta" ], "created_at": "2024-11-26T11:58:18.962Z", - "updated_at": "2025-12-05T07:02:09.046Z", + "updated_at": "2025-12-16T10:13:05.041Z", "branding": { "colors": { "primary": "#19aecc" @@ -6388,27 +6147,25 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PATCH", - "path": "/api/v2/email-templates/welcome_email", + "path": "/api/v2/email-templates/verify_email", "body": { - "template": "welcome_email", - "body": "\n \n

Welcome!

\n \n\n", - "enabled": false, + "template": "verify_email", + "body": "\n \n \n \n \n
\n \n \n \n
\n \n \n

\n\n

Welcome to {{ application.name}}!

\n\n

\n Thank you for signing up. Please verify your email address by clicking the following\n link:\n

\n\n

Confirm my account

\n\n

\n If you are having any issues with your account, please don’t hesitate to contact us\n by replying to this mail.\n

\n\n
\n Haha!!!\n
\n\n {{ application.name }}\n\n

\n
\n \n If you did not make this request, please contact us by replying to this mail.\n

\n
\n \n \n \n
\n \n\n", + "enabled": true, "from": "", - "resultUrl": "https://example.com/welcome", - "subject": "Welcome", + "subject": "", "syntax": "liquid", - "urlLifetimeInSeconds": 3600 + "urlLifetimeInSeconds": 432000 }, "status": 200, "response": { - "template": "welcome_email", - "body": "\n \n

Welcome!

\n \n\n", + "template": "verify_email", + "body": "\n \n \n \n \n
\n \n \n \n
\n \n \n

\n\n

Welcome to {{ application.name}}!

\n\n

\n Thank you for signing up. Please verify your email address by clicking the following\n link:\n

\n\n

Confirm my account

\n\n

\n If you are having any issues with your account, please don’t hesitate to contact us\n by replying to this mail.\n

\n\n
\n Haha!!!\n
\n\n {{ application.name }}\n\n

\n
\n \n If you did not make this request, please contact us by replying to this mail.\n

\n
\n \n \n \n
\n \n\n", "from": "", - "resultUrl": "https://example.com/welcome", - "subject": "Welcome", + "subject": "", "syntax": "liquid", - "urlLifetimeInSeconds": 3600, - "enabled": false + "urlLifetimeInSeconds": 432000, + "enabled": true }, "rawHeaders": [], "responseIsBinary": false @@ -6416,25 +6173,27 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PATCH", - "path": "/api/v2/email-templates/verify_email", + "path": "/api/v2/email-templates/welcome_email", "body": { - "template": "verify_email", - "body": "\n \n \n \n \n
\n \n \n \n
\n \n \n

\n\n

Welcome to {{ application.name}}!

\n\n

\n Thank you for signing up. Please verify your email address by clicking the following\n link:\n

\n\n

Confirm my account

\n\n

\n If you are having any issues with your account, please don’t hesitate to contact us\n by replying to this mail.\n

\n\n
\n Haha!!!\n
\n\n {{ application.name }}\n\n

\n
\n \n If you did not make this request, please contact us by replying to this mail.\n

\n
\n \n \n \n
\n \n\n", - "enabled": true, + "template": "welcome_email", + "body": "\n \n

Welcome!

\n \n\n", + "enabled": false, "from": "", - "subject": "", + "resultUrl": "https://example.com/welcome", + "subject": "Welcome", "syntax": "liquid", - "urlLifetimeInSeconds": 432000 + "urlLifetimeInSeconds": 3600 }, "status": 200, "response": { - "template": "verify_email", - "body": "\n \n \n \n \n
\n \n \n \n
\n \n \n

\n\n

Welcome to {{ application.name}}!

\n\n

\n Thank you for signing up. Please verify your email address by clicking the following\n link:\n

\n\n

Confirm my account

\n\n

\n If you are having any issues with your account, please don’t hesitate to contact us\n by replying to this mail.\n

\n\n
\n Haha!!!\n
\n\n {{ application.name }}\n\n

\n
\n \n If you did not make this request, please contact us by replying to this mail.\n

\n
\n \n \n \n
\n \n\n", + "template": "welcome_email", + "body": "\n \n

Welcome!

\n \n\n", "from": "", - "subject": "", + "resultUrl": "https://example.com/welcome", + "subject": "Welcome", "syntax": "liquid", - "urlLifetimeInSeconds": 432000, - "enabled": true + "urlLifetimeInSeconds": 3600, + "enabled": false }, "rawHeaders": [], "responseIsBinary": false @@ -6442,14 +6201,11 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/organizations?include_totals=true", + "path": "/api/v2/organizations?take=50", "body": "", "status": 200, "response": { - "organizations": [], - "start": 0, - "limit": 50, - "total": 0 + "organizations": [] }, "rawHeaders": [], "responseIsBinary": false @@ -6547,7 +6303,7 @@ "subject": "deprecated" } ], - "client_id": "cLFFGtjp2Xe7HWQCHfCtQxmURfSu1lDH", + "client_id": "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -6600,7 +6356,7 @@ "subject": "deprecated" } ], - "client_id": "uf1Ju9xwQ09AWpcnRnwD91W3Sv3bf76S", + "client_id": "0ltKN06qv5WnNoNz2Fu6QvyOl2o6K6nE", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -6645,7 +6401,7 @@ "subject": "deprecated" } ], - "client_id": "WYPQxuqDdeNZHLcJeuPq0AvuNFtMiUgU", + "client_id": "HC5UXDFP5lEc2vbTkPQWJ1yYeiLRkmDg", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -6699,7 +6455,7 @@ } ], "allowed_origins": [], - "client_id": "QwKFSZ87TYF89lXp66sVFpGzYGQ07OU6", + "client_id": "KjqnjAT6PWajvX3XKVkWhFVaW8sFBWyv", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -6745,7 +6501,7 @@ "subject": "deprecated" } ], - "client_id": "VvKPDeB2QHhtG4tVBNcrRUuChB0jWefu", + "client_id": "GH55Wtak9aTrj6tjRFObq1cqnu5a8mtM", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -6764,14 +6520,9 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "Test SPA", + "name": "The Default App", "allowed_clients": [], - "allowed_logout_urls": [ - "http://localhost:3000" - ], - "callbacks": [ - "http://localhost:3000" - ], + "callbacks": [], "client_metadata": {}, "is_first_party": true, "native_social_login": { @@ -6782,16 +6533,17 @@ "enabled": false } }, - "oidc_conformant": true, + "oidc_conformant": false, "refresh_token": { - "expiration_type": "expiring", + "expiration_type": "non-expiring", "leeway": 0, + "infinite_token_lifetime": true, + "infinite_idle_token_lifetime": true, "token_lifetime": 2592000, "idle_token_lifetime": 1296000, - "infinite_token_lifetime": false, - "infinite_idle_token_lifetime": false, - "rotation_type": "rotating" + "rotation_type": "non-rotating" }, + "sso": false, "sso_disabled": false, "cross_origin_authentication": false, "cross_origin_auth": false, @@ -6802,7 +6554,7 @@ "subject": "deprecated" } ], - "client_id": "xODbqyam7rjqHDsYKjU9Tuo99yaBnR5T", + "client_id": "ahrUt7DkBom8m2EAs0zLSccaylYIuVfF", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -6811,15 +6563,12 @@ "secret_encoded": false }, "client_aliases": [], - "token_endpoint_auth_method": "none", - "app_type": "spa", + "token_endpoint_auth_method": "client_secret_post", "grant_types": [ "authorization_code", "implicit", - "refresh_token" - ], - "web_origins": [ - "http://localhost:3000" + "refresh_token", + "client_credentials" ], "custom_login_page_on": true }, @@ -6827,9 +6576,14 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "auth0-deploy-cli-extension", + "name": "Test SPA", "allowed_clients": [], - "callbacks": [], + "allowed_logout_urls": [ + "http://localhost:3000" + ], + "callbacks": [ + "http://localhost:3000" + ], "client_metadata": {}, "is_first_party": true, "native_social_login": { @@ -6842,13 +6596,13 @@ }, "oidc_conformant": true, "refresh_token": { - "expiration_type": "non-expiring", + "expiration_type": "expiring", "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" + "token_lifetime": 2592000, + "idle_token_lifetime": 1296000, + "infinite_token_lifetime": false, + "infinite_idle_token_lifetime": false, + "rotation_type": "rotating" }, "sso_disabled": false, "cross_origin_authentication": false, @@ -6860,7 +6614,7 @@ "subject": "deprecated" } ], - "client_id": "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1", + "client_id": "68Ty4a89yPogS0UGdX8aYaS6td9DXYjs", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -6869,10 +6623,15 @@ "secret_encoded": false }, "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", + "token_endpoint_auth_method": "none", + "app_type": "spa", "grant_types": [ - "client_credentials" + "authorization_code", + "implicit", + "refresh_token" + ], + "web_origins": [ + "http://localhost:3000" ], "custom_login_page_on": true }, @@ -6880,7 +6639,7 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "The Default App", + "name": "auth0-deploy-cli-extension", "allowed_clients": [], "callbacks": [], "client_metadata": {}, @@ -6893,17 +6652,16 @@ "enabled": false } }, - "oidc_conformant": false, + "oidc_conformant": true, "refresh_token": { "expiration_type": "non-expiring", "leeway": 0, "infinite_token_lifetime": true, "infinite_idle_token_lifetime": true, - "token_lifetime": 2592000, - "idle_token_lifetime": 1296000, + "token_lifetime": 31557600, + "idle_token_lifetime": 2592000, "rotation_type": "non-rotating" }, - "sso": false, "sso_disabled": false, "cross_origin_authentication": false, "cross_origin_auth": false, @@ -6914,7 +6672,7 @@ "subject": "deprecated" } ], - "client_id": "xYOv2UsoAuKptIEAjkeB62Oaeg1Jn2QX", + "client_id": "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -6924,10 +6682,8 @@ }, "client_aliases": [], "token_endpoint_auth_method": "client_secret_post", + "app_type": "non_interactive", "grant_types": [ - "authorization_code", - "implicit", - "refresh_token", "client_credentials" ], "custom_login_page_on": true @@ -6977,178 +6733,13 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/organizations?include_totals=true&take=50", - "body": "", - "status": 200, - "response": { - "organizations": [] - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/connections?include_totals=true", - "body": "", - "status": 200, - "response": { - "total": 3, - "start": 0, - "limit": 50, - "connections": [ - { - "id": "con_fuBNFcmY8aL3HDBT", - "options": { - "mfa": { - "active": true, - "return_enroll_settings": true - }, - "import_mode": false, - "customScripts": { - "login": "function login(email, password, callback) {\n // This script should authenticate a user against the credentials stored in\n // your database.\n // It is executed when a user attempts to log in or immediately after signing\n // up (as a verification that the user was successfully signed up).\n //\n // Everything returned by this script will be set as part of the user profile\n // and will be visible by any of the tenant admins. Avoid adding attributes\n // with values such as passwords, keys, secrets, etc.\n //\n // The `password` parameter of this function is in plain text. It must be\n // hashed/salted to match whatever is stored in your database. For example:\n //\n // var bcrypt = require('bcrypt@0.8.5');\n // bcrypt.compare(password, dbPasswordHash, function(err, res)) { ... }\n //\n // There are three ways this script can finish:\n // 1. The user's credentials are valid. The returned user profile should be in\n // the following format: https://auth0.com/docs/users/normalized/auth0/normalized-user-profile-schema\n // var profile = {\n // user_id: ..., // user_id is mandatory\n // email: ...,\n // [...]\n // };\n // callback(null, profile);\n // 2. The user's credentials are invalid\n // callback(new WrongUsernameOrPasswordError(email, \"my error message\"));\n // 3. Something went wrong while trying to reach your database\n // callback(new Error(\"my error message\"));\n //\n // A list of Node.js modules which can be referenced is available here:\n //\n // https://tehsis.github.io/webtaskio-canirequire/\n console.log('AYYYYYE');\n\n const msg =\n 'Please implement the Login script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "create": "function create(user, callback) {\n // This script should create a user entry in your existing database. It will\n // be executed when a user attempts to sign up, or when a user is created\n // through the Auth0 dashboard or API.\n // When this script has finished executing, the Login script will be\n // executed immediately afterwards, to verify that the user was created\n // successfully.\n //\n // The user object will always contain the following properties:\n // * email: the user's email\n // * password: the password entered by the user, in plain text\n // * tenant: the name of this Auth0 account\n // * client_id: the client ID of the application where the user signed up, or\n // API key if created through the API or Auth0 dashboard\n // * connection: the name of this database connection\n //\n // There are three ways this script can finish:\n // 1. A user was successfully created\n // callback(null);\n // 2. This user already exists in your database\n // callback(new ValidationError(\"user_exists\", \"my error message\"));\n // 3. Something went wrong while trying to reach your database\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Create script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "delete": "function remove(id, callback) {\n // This script remove a user from your existing database.\n // It is executed whenever a user is deleted from the API or Auth0 dashboard.\n //\n // There are two ways that this script can finish:\n // 1. The user was removed successfully:\n // callback(null);\n // 2. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Delete script for this database ' +\n 'connection at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "verify": "function verify(email, callback) {\n // This script should mark the current user's email address as verified in\n // your database.\n // It is executed whenever a user clicks the verification link sent by email.\n // These emails can be customized at https://manage.auth0.com/#/emails.\n // It is safe to assume that the user's email already exists in your database,\n // because verification emails, if enabled, are sent immediately after a\n // successful signup.\n //\n // There are two ways that this script can finish:\n // 1. The user's email was verified successfully\n // callback(null, true);\n // 2. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n //\n // If an error is returned, it will be passed to the query string of the page\n // where the user is being redirected to after clicking the verification link.\n // For example, returning `callback(new Error(\"error\"))` and redirecting to\n // https://example.com would redirect to the following URL:\n // https://example.com?email=alice%40example.com&message=error&success=false\n\n const msg =\n 'Please implement the Verify script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "get_user": "function getByEmail(email, callback) {\n // This script should retrieve a user profile from your existing database,\n // without authenticating the user.\n // It is used to check if a user exists before executing flows that do not\n // require authentication (signup and password reset).\n //\n // There are three ways this script can finish:\n // 1. A user was successfully found. The profile should be in the following\n // format: https://auth0.com/docs/users/normalized/auth0/normalized-user-profile-schema.\n // callback(null, profile);\n // 2. A user was not found\n // callback(null);\n // 3. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Get User script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "change_password": "function changePassword(email, newPassword, callback) {\n // This script should change the password stored for the current user in your\n // database. It is executed when the user clicks on the confirmation link\n // after a reset password request.\n // The content and behavior of password confirmation emails can be customized\n // here: https://manage.auth0.com/#/emails\n // The `newPassword` parameter of this function is in plain text. It must be\n // hashed/salted to match whatever is stored in your database.\n //\n // There are three ways that this script can finish:\n // 1. The user's password was updated successfully:\n // callback(null, true);\n // 2. The user's password was not updated:\n // callback(null, false);\n // 3. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n //\n // If an error is returned, it will be passed to the query string of the page\n // where the user is being redirected to after clicking the confirmation link.\n // For example, returning `callback(new Error(\"error\"))` and redirecting to\n // https://example.com would redirect to the following URL:\n // https://example.com?email=alice%40example.com&message=error&success=false\n\n const msg =\n 'Please implement the Change Password script for this database ' +\n 'connection at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n" - }, - "disable_signup": false, - "passwordPolicy": "low", - "passkey_options": { - "challenge_ui": "both", - "local_enrollment_enabled": true, - "progressive_enrollment_enabled": true - }, - "password_history": { - "size": 5, - "enable": false - }, - "strategy_version": 2, - "requires_username": true, - "password_dictionary": { - "enable": true, - "dictionary": [] - }, - "authentication_methods": { - "passkey": { - "enabled": false - }, - "password": { - "enabled": true, - "api_behavior": "required" - } - }, - "brute_force_protection": true, - "password_no_personal_info": { - "enable": true - }, - "password_complexity_options": { - "min_length": 8 - }, - "enabledDatabaseCustomization": true - }, - "strategy": "auth0", - "name": "boo-baz-db-connection-test", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "boo-baz-db-connection-test" - ], - "enabled_clients": [ - "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1", - "QwKFSZ87TYF89lXp66sVFpGzYGQ07OU6" - ] - }, - { - "id": "con_URfc5OIXMzEJtZaz", - "options": { - "email": true, - "scope": [ - "email", - "profile" - ], - "profile": true - }, - "strategy": "google-oauth2", - "name": "google-oauth2", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "google-oauth2" - ], - "enabled_clients": [ - "xYOv2UsoAuKptIEAjkeB62Oaeg1Jn2QX", - "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1" - ] - }, - { - "id": "con_Ty3Nbl0J1Ddxat41", - "options": { - "mfa": { - "active": true, - "return_enroll_settings": true - }, - "passwordPolicy": "good", - "passkey_options": { - "challenge_ui": "both", - "local_enrollment_enabled": true, - "progressive_enrollment_enabled": true - }, - "strategy_version": 2, - "authentication_methods": { - "passkey": { - "enabled": false - }, - "password": { - "enabled": true, - "api_behavior": "required" - } - }, - "brute_force_protection": true - }, - "strategy": "auth0", - "name": "Username-Password-Authentication", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "Username-Password-Authentication" - ], - "enabled_clients": [ - "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", - "cLFFGtjp2Xe7HWQCHfCtQxmURfSu1lDH" - ] - } - ] - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/connections?include_totals=true&take=50", + "path": "/api/v2/connections?take=50", "body": "", "status": 200, "response": { "connections": [ { - "id": "con_fuBNFcmY8aL3HDBT", + "id": "con_cxSOS7uLgPojtLBh", "options": { "mfa": { "active": true, @@ -7211,12 +6802,12 @@ "boo-baz-db-connection-test" ], "enabled_clients": [ - "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1", - "QwKFSZ87TYF89lXp66sVFpGzYGQ07OU6" + "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU", + "KjqnjAT6PWajvX3XKVkWhFVaW8sFBWyv" ] }, { - "id": "con_URfc5OIXMzEJtZaz", + "id": "con_lfhXlIY73LFJlMks", "options": { "email": true, "scope": [ @@ -7238,12 +6829,12 @@ "google-oauth2" ], "enabled_clients": [ - "xYOv2UsoAuKptIEAjkeB62Oaeg1Jn2QX", - "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1" + "ahrUt7DkBom8m2EAs0zLSccaylYIuVfF", + "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU" ] }, { - "id": "con_Ty3Nbl0J1Ddxat41", + "id": "con_3R2lX4rln4ArocW5", "options": { "mfa": { "active": true, @@ -7281,7 +6872,7 @@ ], "enabled_clients": [ "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", - "cLFFGtjp2Xe7HWQCHfCtQxmURfSu1lDH" + "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" ] } ] @@ -7292,17 +6883,14 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/client-grants?per_page=100&page=0&include_totals=true", + "path": "/api/v2/client-grants?take=50", "body": "", "status": 200, "response": { - "total": 3, - "start": 0, - "limit": 100, "client_grants": [ { - "id": "cgr_X9WoUpI87FLuMfUp", - "client_id": "VvKPDeB2QHhtG4tVBNcrRUuChB0jWefu", + "id": "cgr_S92D2BBPB2wQXFYC", + "client_id": "GH55Wtak9aTrj6tjRFObq1cqnu5a8mtM", "audience": "https://auth0-deploy-cli-e2e.us.auth0.com/api/v2/", "scope": [ "read:client_grants", @@ -7439,8 +7027,8 @@ "subject_type": "client" }, { - "id": "cgr_pbwejzhwoujrsNE8", - "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", + "id": "cgr_UQhGxDPGii0tSQcs", + "client_id": "0ltKN06qv5WnNoNz2Fu6QvyOl2o6K6nE", "audience": "https://auth0-deploy-cli-e2e.us.auth0.com/api/v2/", "scope": [ "read:client_grants", @@ -7467,10 +7055,6 @@ "update:client_keys", "delete:client_keys", "create:client_keys", - "read:client_credentials", - "update:client_credentials", - "delete:client_credentials", - "create:client_credentials", "read:connections", "update:connections", "delete:connections", @@ -7560,19 +7144,10 @@ "read:entitlements", "read:attack_protection", "update:attack_protection", - "read:organizations_summary", - "create:authentication_methods", - "read:authentication_methods", - "update:authentication_methods", - "delete:authentication_methods", "read:organizations", "update:organizations", "create:organizations", "delete:organizations", - "read:organization_discovery_domains", - "update:organization_discovery_domains", - "create:organization_discovery_domains", - "delete:organization_discovery_domains", "create:organization_members", "read:organization_members", "delete:organization_members", @@ -7585,97 +7160,13 @@ "delete:organization_member_roles", "create:organization_invitations", "read:organization_invitations", - "delete:organization_invitations", - "read:scim_config", - "create:scim_config", - "update:scim_config", - "delete:scim_config", - "create:scim_token", - "read:scim_token", - "delete:scim_token", - "delete:phone_providers", - "create:phone_providers", - "read:phone_providers", - "update:phone_providers", - "delete:phone_templates", - "create:phone_templates", - "read:phone_templates", - "update:phone_templates", - "create:encryption_keys", - "read:encryption_keys", - "update:encryption_keys", - "delete:encryption_keys", - "read:sessions", - "update:sessions", - "delete:sessions", - "read:refresh_tokens", - "delete:refresh_tokens", - "create:self_service_profiles", - "read:self_service_profiles", - "update:self_service_profiles", - "delete:self_service_profiles", - "create:sso_access_tickets", - "delete:sso_access_tickets", - "read:forms", - "update:forms", - "delete:forms", - "create:forms", - "read:flows", - "update:flows", - "delete:flows", - "create:flows", - "read:flows_vault", - "read:flows_vault_connections", - "update:flows_vault_connections", - "delete:flows_vault_connections", - "create:flows_vault_connections", - "read:flows_executions", - "delete:flows_executions", - "read:connections_options", - "update:connections_options", - "read:self_service_profile_custom_texts", - "update:self_service_profile_custom_texts", - "create:network_acls", - "update:network_acls", - "read:network_acls", - "delete:network_acls", - "delete:vdcs_templates", - "read:vdcs_templates", - "create:vdcs_templates", - "update:vdcs_templates", - "create:custom_signing_keys", - "read:custom_signing_keys", - "update:custom_signing_keys", - "delete:custom_signing_keys", - "read:federated_connections_tokens", - "delete:federated_connections_tokens", - "create:user_attribute_profiles", - "read:user_attribute_profiles", - "update:user_attribute_profiles", - "delete:user_attribute_profiles", - "read:event_streams", - "create:event_streams", - "delete:event_streams", - "update:event_streams", - "read:event_deliveries", - "update:event_deliveries", - "create:connection_profiles", - "read:connection_profiles", - "update:connection_profiles", - "delete:connection_profiles", - "read:organization_client_grants", - "create:organization_client_grants", - "delete:organization_client_grants", - "read:security_metrics", - "read:connections_keys", - "update:connections_keys", - "create:connections_keys" + "delete:organization_invitations" ], "subject_type": "client" }, { - "id": "cgr_s9W4N1r5PKXB4V8l", - "client_id": "uf1Ju9xwQ09AWpcnRnwD91W3Sv3bf76S", + "id": "cgr_pbwejzhwoujrsNE8", + "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", "audience": "https://auth0-deploy-cli-e2e.us.auth0.com/api/v2/", "scope": [ "read:client_grants", @@ -7702,6 +7193,10 @@ "update:client_keys", "delete:client_keys", "create:client_keys", + "read:client_credentials", + "update:client_credentials", + "delete:client_credentials", + "create:client_credentials", "read:connections", "update:connections", "delete:connections", @@ -7791,10 +7286,19 @@ "read:entitlements", "read:attack_protection", "update:attack_protection", + "read:organizations_summary", + "create:authentication_methods", + "read:authentication_methods", + "update:authentication_methods", + "delete:authentication_methods", "read:organizations", "update:organizations", "create:organizations", "delete:organizations", + "read:organization_discovery_domains", + "update:organization_discovery_domains", + "create:organization_discovery_domains", + "delete:organization_discovery_domains", "create:organization_members", "read:organization_members", "delete:organization_members", @@ -7807,7 +7311,91 @@ "delete:organization_member_roles", "create:organization_invitations", "read:organization_invitations", - "delete:organization_invitations" + "delete:organization_invitations", + "read:scim_config", + "create:scim_config", + "update:scim_config", + "delete:scim_config", + "create:scim_token", + "read:scim_token", + "delete:scim_token", + "delete:phone_providers", + "create:phone_providers", + "read:phone_providers", + "update:phone_providers", + "delete:phone_templates", + "create:phone_templates", + "read:phone_templates", + "update:phone_templates", + "create:encryption_keys", + "read:encryption_keys", + "update:encryption_keys", + "delete:encryption_keys", + "read:sessions", + "update:sessions", + "delete:sessions", + "read:refresh_tokens", + "delete:refresh_tokens", + "create:self_service_profiles", + "read:self_service_profiles", + "update:self_service_profiles", + "delete:self_service_profiles", + "create:sso_access_tickets", + "delete:sso_access_tickets", + "read:forms", + "update:forms", + "delete:forms", + "create:forms", + "read:flows", + "update:flows", + "delete:flows", + "create:flows", + "read:flows_vault", + "read:flows_vault_connections", + "update:flows_vault_connections", + "delete:flows_vault_connections", + "create:flows_vault_connections", + "read:flows_executions", + "delete:flows_executions", + "read:connections_options", + "update:connections_options", + "read:self_service_profile_custom_texts", + "update:self_service_profile_custom_texts", + "create:network_acls", + "update:network_acls", + "read:network_acls", + "delete:network_acls", + "delete:vdcs_templates", + "read:vdcs_templates", + "create:vdcs_templates", + "update:vdcs_templates", + "create:custom_signing_keys", + "read:custom_signing_keys", + "update:custom_signing_keys", + "delete:custom_signing_keys", + "read:federated_connections_tokens", + "delete:federated_connections_tokens", + "create:user_attribute_profiles", + "read:user_attribute_profiles", + "update:user_attribute_profiles", + "delete:user_attribute_profiles", + "read:event_streams", + "create:event_streams", + "delete:event_streams", + "update:event_streams", + "read:event_deliveries", + "update:event_deliveries", + "create:connection_profiles", + "read:connection_profiles", + "update:connection_profiles", + "delete:connection_profiles", + "read:organization_client_grants", + "create:organization_client_grants", + "delete:organization_client_grants", + "read:security_metrics", + "read:connections_keys", + "update:connections_keys", + "create:connections_keys" ], "subject_type": "client" } @@ -7909,7 +7497,7 @@ "subject": "deprecated" } ], - "client_id": "cLFFGtjp2Xe7HWQCHfCtQxmURfSu1lDH", + "client_id": "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -7962,7 +7550,7 @@ "subject": "deprecated" } ], - "client_id": "uf1Ju9xwQ09AWpcnRnwD91W3Sv3bf76S", + "client_id": "0ltKN06qv5WnNoNz2Fu6QvyOl2o6K6nE", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -8007,7 +7595,7 @@ "subject": "deprecated" } ], - "client_id": "WYPQxuqDdeNZHLcJeuPq0AvuNFtMiUgU", + "client_id": "HC5UXDFP5lEc2vbTkPQWJ1yYeiLRkmDg", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -8061,7 +7649,7 @@ } ], "allowed_origins": [], - "client_id": "QwKFSZ87TYF89lXp66sVFpGzYGQ07OU6", + "client_id": "KjqnjAT6PWajvX3XKVkWhFVaW8sFBWyv", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -8107,7 +7695,7 @@ "subject": "deprecated" } ], - "client_id": "VvKPDeB2QHhtG4tVBNcrRUuChB0jWefu", + "client_id": "GH55Wtak9aTrj6tjRFObq1cqnu5a8mtM", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -8126,14 +7714,9 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "Test SPA", + "name": "The Default App", "allowed_clients": [], - "allowed_logout_urls": [ - "http://localhost:3000" - ], - "callbacks": [ - "http://localhost:3000" - ], + "callbacks": [], "client_metadata": {}, "is_first_party": true, "native_social_login": { @@ -8144,16 +7727,17 @@ "enabled": false } }, - "oidc_conformant": true, + "oidc_conformant": false, "refresh_token": { - "expiration_type": "expiring", + "expiration_type": "non-expiring", "leeway": 0, + "infinite_token_lifetime": true, + "infinite_idle_token_lifetime": true, "token_lifetime": 2592000, "idle_token_lifetime": 1296000, - "infinite_token_lifetime": false, - "infinite_idle_token_lifetime": false, - "rotation_type": "rotating" + "rotation_type": "non-rotating" }, + "sso": false, "sso_disabled": false, "cross_origin_authentication": false, "cross_origin_auth": false, @@ -8164,7 +7748,7 @@ "subject": "deprecated" } ], - "client_id": "xODbqyam7rjqHDsYKjU9Tuo99yaBnR5T", + "client_id": "ahrUt7DkBom8m2EAs0zLSccaylYIuVfF", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -8173,15 +7757,12 @@ "secret_encoded": false }, "client_aliases": [], - "token_endpoint_auth_method": "none", - "app_type": "spa", + "token_endpoint_auth_method": "client_secret_post", "grant_types": [ "authorization_code", "implicit", - "refresh_token" - ], - "web_origins": [ - "http://localhost:3000" + "refresh_token", + "client_credentials" ], "custom_login_page_on": true }, @@ -8189,9 +7770,14 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "auth0-deploy-cli-extension", + "name": "Test SPA", "allowed_clients": [], - "callbacks": [], + "allowed_logout_urls": [ + "http://localhost:3000" + ], + "callbacks": [ + "http://localhost:3000" + ], "client_metadata": {}, "is_first_party": true, "native_social_login": { @@ -8204,13 +7790,13 @@ }, "oidc_conformant": true, "refresh_token": { - "expiration_type": "non-expiring", + "expiration_type": "expiring", "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" + "token_lifetime": 2592000, + "idle_token_lifetime": 1296000, + "infinite_token_lifetime": false, + "infinite_idle_token_lifetime": false, + "rotation_type": "rotating" }, "sso_disabled": false, "cross_origin_authentication": false, @@ -8222,7 +7808,7 @@ "subject": "deprecated" } ], - "client_id": "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1", + "client_id": "68Ty4a89yPogS0UGdX8aYaS6td9DXYjs", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -8231,10 +7817,15 @@ "secret_encoded": false }, "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", + "token_endpoint_auth_method": "none", + "app_type": "spa", "grant_types": [ - "client_credentials" + "authorization_code", + "implicit", + "refresh_token" + ], + "web_origins": [ + "http://localhost:3000" ], "custom_login_page_on": true }, @@ -8242,7 +7833,7 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "The Default App", + "name": "auth0-deploy-cli-extension", "allowed_clients": [], "callbacks": [], "client_metadata": {}, @@ -8255,17 +7846,16 @@ "enabled": false } }, - "oidc_conformant": false, + "oidc_conformant": true, "refresh_token": { "expiration_type": "non-expiring", "leeway": 0, "infinite_token_lifetime": true, "infinite_idle_token_lifetime": true, - "token_lifetime": 2592000, - "idle_token_lifetime": 1296000, + "token_lifetime": 31557600, + "idle_token_lifetime": 2592000, "rotation_type": "non-rotating" }, - "sso": false, "sso_disabled": false, "cross_origin_authentication": false, "cross_origin_auth": false, @@ -8276,7 +7866,7 @@ "subject": "deprecated" } ], - "client_id": "xYOv2UsoAuKptIEAjkeB62Oaeg1Jn2QX", + "client_id": "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -8286,10 +7876,8 @@ }, "client_aliases": [], "token_endpoint_auth_method": "client_secret_post", + "app_type": "non_interactive", "grant_types": [ - "authorization_code", - "implicit", - "refresh_token", "client_credentials" ], "custom_login_page_on": true @@ -8336,6 +7924,23 @@ "rawHeaders": [], "responseIsBinary": false }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "POST", + "path": "/api/v2/organizations", + "body": { + "name": "org2", + "display_name": "Organization2" + }, + "status": 201, + "response": { + "id": "org_rupfjUkVVvnPPk1y", + "display_name": "Organization2", + "name": "org2" + }, + "rawHeaders": [], + "responseIsBinary": false + }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "POST", @@ -8352,7 +7957,7 @@ }, "status": 201, "response": { - "id": "org_nSblOG7yUuWAHLOG", + "id": "org_YQGLuGuqRYrilmSQ", "display_name": "Organization", "name": "org1", "branding": { @@ -8365,37 +7970,20 @@ "rawHeaders": [], "responseIsBinary": false }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/log-streams", + "body": "", + "status": 200, + "response": [], + "rawHeaders": [], + "responseIsBinary": false + }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "POST", - "path": "/api/v2/organizations", - "body": { - "name": "org2", - "display_name": "Organization2" - }, - "status": 201, - "response": { - "id": "org_vhEUeSlhgjQLTFPE", - "display_name": "Organization2", - "name": "org2" - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/log-streams", - "body": "", - "status": 200, - "response": [], - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "POST", - "path": "/api/v2/log-streams", + "path": "/api/v2/log-streams", "body": { "name": "Suspended DD Log Stream", "sink": { @@ -8406,7 +7994,7 @@ }, "status": 200, "response": { - "id": "lst_0000000000025415", + "id": "lst_0000000000025597", "name": "Suspended DD Log Stream", "type": "datadog", "status": "active", @@ -8471,14 +8059,14 @@ }, "status": 200, "response": { - "id": "lst_0000000000025416", + "id": "lst_0000000000025598", "name": "Amazon EventBridge", "type": "eventbridge", "status": "active", "sink": { "awsAccountId": "123456789012", "awsRegion": "us-east-2", - "awsPartnerEventSource": "aws.partner/auth0.com/auth0-deploy-cli-e2e-48aadbd2-ae4f-4553-9c92-75eebc8c63cd/auth0.logs" + "awsPartnerEventSource": "aws.partner/auth0.com/auth0-deploy-cli-e2e-7022a134-25ea-40c6-8164-cf25c35ee97d/auth0.logs" }, "filters": [ { @@ -8554,7 +8142,7 @@ "name": "Blank-form", "flow_count": 0, "created_at": "2024-11-26T11:58:18.187Z", - "updated_at": "2025-12-05T03:07:10.310Z" + "updated_at": "2025-12-16T10:11:59.715Z" } ] }, @@ -8640,7 +8228,7 @@ } }, "created_at": "2024-11-26T11:58:18.187Z", - "updated_at": "2025-12-05T03:07:10.310Z" + "updated_at": "2025-12-16T10:11:59.715Z" }, "rawHeaders": [], "responseIsBinary": false @@ -8765,7 +8353,7 @@ } }, "created_at": "2024-11-26T11:58:18.187Z", - "updated_at": "2025-12-05T07:02:16.657Z" + "updated_at": "2025-12-16T10:13:11.443Z" }, "rawHeaders": [], "responseIsBinary": false @@ -9858,6 +9446,22 @@ "value": "delete:organization_client_grants", "description": "Delete Organization Client Grants" }, + { + "value": "create:token_exchange_profiles", + "description": "Create Token Exchange Profile" + }, + { + "value": "read:token_exchange_profiles", + "description": "Read Token Exchange Profiles" + }, + { + "value": "update:token_exchange_profiles", + "description": "Update Token Exchange Profile" + }, + { + "value": "delete:token_exchange_profiles", + "description": "Delete Token Exchange Profile" + }, { "value": "read:security_metrics", "description": "Read Security Metrics" @@ -9975,7 +9579,7 @@ "subject": "deprecated" } ], - "client_id": "cLFFGtjp2Xe7HWQCHfCtQxmURfSu1lDH", + "client_id": "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -10028,7 +9632,7 @@ "subject": "deprecated" } ], - "client_id": "uf1Ju9xwQ09AWpcnRnwD91W3Sv3bf76S", + "client_id": "0ltKN06qv5WnNoNz2Fu6QvyOl2o6K6nE", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -10073,7 +9677,7 @@ "subject": "deprecated" } ], - "client_id": "WYPQxuqDdeNZHLcJeuPq0AvuNFtMiUgU", + "client_id": "HC5UXDFP5lEc2vbTkPQWJ1yYeiLRkmDg", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -10127,7 +9731,7 @@ } ], "allowed_origins": [], - "client_id": "QwKFSZ87TYF89lXp66sVFpGzYGQ07OU6", + "client_id": "KjqnjAT6PWajvX3XKVkWhFVaW8sFBWyv", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -10173,7 +9777,7 @@ "subject": "deprecated" } ], - "client_id": "VvKPDeB2QHhtG4tVBNcrRUuChB0jWefu", + "client_id": "GH55Wtak9aTrj6tjRFObq1cqnu5a8mtM", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -10192,14 +9796,9 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "Test SPA", + "name": "The Default App", "allowed_clients": [], - "allowed_logout_urls": [ - "http://localhost:3000" - ], - "callbacks": [ - "http://localhost:3000" - ], + "callbacks": [], "client_metadata": {}, "is_first_party": true, "native_social_login": { @@ -10210,16 +9809,17 @@ "enabled": false } }, - "oidc_conformant": true, + "oidc_conformant": false, "refresh_token": { - "expiration_type": "expiring", + "expiration_type": "non-expiring", "leeway": 0, + "infinite_token_lifetime": true, + "infinite_idle_token_lifetime": true, "token_lifetime": 2592000, "idle_token_lifetime": 1296000, - "infinite_token_lifetime": false, - "infinite_idle_token_lifetime": false, - "rotation_type": "rotating" + "rotation_type": "non-rotating" }, + "sso": false, "sso_disabled": false, "cross_origin_authentication": false, "cross_origin_auth": false, @@ -10230,7 +9830,7 @@ "subject": "deprecated" } ], - "client_id": "xODbqyam7rjqHDsYKjU9Tuo99yaBnR5T", + "client_id": "ahrUt7DkBom8m2EAs0zLSccaylYIuVfF", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -10239,15 +9839,12 @@ "secret_encoded": false }, "client_aliases": [], - "token_endpoint_auth_method": "none", - "app_type": "spa", + "token_endpoint_auth_method": "client_secret_post", "grant_types": [ "authorization_code", "implicit", - "refresh_token" - ], - "web_origins": [ - "http://localhost:3000" + "refresh_token", + "client_credentials" ], "custom_login_page_on": true }, @@ -10255,9 +9852,14 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "auth0-deploy-cli-extension", + "name": "Test SPA", "allowed_clients": [], - "callbacks": [], + "allowed_logout_urls": [ + "http://localhost:3000" + ], + "callbacks": [ + "http://localhost:3000" + ], "client_metadata": {}, "is_first_party": true, "native_social_login": { @@ -10270,13 +9872,13 @@ }, "oidc_conformant": true, "refresh_token": { - "expiration_type": "non-expiring", + "expiration_type": "expiring", "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" + "token_lifetime": 2592000, + "idle_token_lifetime": 1296000, + "infinite_token_lifetime": false, + "infinite_idle_token_lifetime": false, + "rotation_type": "rotating" }, "sso_disabled": false, "cross_origin_authentication": false, @@ -10288,7 +9890,7 @@ "subject": "deprecated" } ], - "client_id": "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1", + "client_id": "68Ty4a89yPogS0UGdX8aYaS6td9DXYjs", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -10297,10 +9899,15 @@ "secret_encoded": false }, "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", + "token_endpoint_auth_method": "none", + "app_type": "spa", "grant_types": [ - "client_credentials" + "authorization_code", + "implicit", + "refresh_token" + ], + "web_origins": [ + "http://localhost:3000" ], "custom_login_page_on": true }, @@ -10308,7 +9915,7 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "The Default App", + "name": "auth0-deploy-cli-extension", "allowed_clients": [], "callbacks": [], "client_metadata": {}, @@ -10321,17 +9928,16 @@ "enabled": false } }, - "oidc_conformant": false, + "oidc_conformant": true, "refresh_token": { "expiration_type": "non-expiring", "leeway": 0, "infinite_token_lifetime": true, "infinite_idle_token_lifetime": true, - "token_lifetime": 2592000, - "idle_token_lifetime": 1296000, + "token_lifetime": 31557600, + "idle_token_lifetime": 2592000, "rotation_type": "non-rotating" }, - "sso": false, "sso_disabled": false, "cross_origin_authentication": false, "cross_origin_auth": false, @@ -10342,7 +9948,7 @@ "subject": "deprecated" } ], - "client_id": "xYOv2UsoAuKptIEAjkeB62Oaeg1Jn2QX", + "client_id": "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -10352,10 +9958,8 @@ }, "client_aliases": [], "token_endpoint_auth_method": "client_secret_post", + "app_type": "non_interactive", "grant_types": [ - "authorization_code", - "implicit", - "refresh_token", "client_credentials" ], "custom_login_page_on": true @@ -10368,7 +9972,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PATCH", - "path": "/api/v2/clients/cLFFGtjp2Xe7HWQCHfCtQxmURfSu1lDH", + "path": "/api/v2/clients/lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V", "body": { "name": "Default App", "callbacks": [], @@ -10426,7 +10030,7 @@ "subject": "/CN=auth0-deploy-cli-e2e.us.auth0.com" } ], - "client_id": "cLFFGtjp2Xe7HWQCHfCtQxmURfSu1lDH", + "client_id": "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -10490,7 +10094,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PUT", - "path": "/api/v2/guardian/factors/webauthn-platform", + "path": "/api/v2/guardian/factors/sms", "body": { "enabled": false }, @@ -10504,7 +10108,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PUT", - "path": "/api/v2/guardian/factors/recovery-code", + "path": "/api/v2/guardian/factors/push-notification", "body": { "enabled": false }, @@ -10518,7 +10122,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PUT", - "path": "/api/v2/guardian/factors/push-notification", + "path": "/api/v2/guardian/factors/webauthn-platform", "body": { "enabled": false }, @@ -10546,7 +10150,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PUT", - "path": "/api/v2/guardian/factors/sms", + "path": "/api/v2/guardian/factors/recovery-code", "body": { "enabled": false }, @@ -10619,7 +10223,54 @@ "response": { "actions": [ { - "id": "d67e0c5e-5be5-4ea1-8b75-29c65f79b7fe", + "id": "ead7d2a3-5a93-43e2-9ec3-455f3c39daf9", + "name": "Custom Phone Provider", + "supported_triggers": [ + { + "id": "custom-phone-provider", + "version": "v1" + } + ], + "created_at": "2025-12-16T10:10:30.752146844Z", + "updated_at": "2025-12-16T10:11:36.910288525Z", + "code": "/**\n* Handler to be executed while sending a phone notification\n* @param {Event} event - Details about the user and the context in which they are logging in.\n* @param {CustomPhoneProviderAPI} api - Methods and utilities to help change the behavior of sending a phone notification.\n*/\nexports.onExecuteCustomPhoneProvider = async (event, api) => {\n // Code goes here\n return;\n};", + "dependencies": [], + "runtime": "node22", + "status": "built", + "secrets": [], + "current_version": { + "id": "83a87aec-f6f7-42bb-b6ad-6fa170f652d1", + "code": "/**\n* Handler to be executed while sending a phone notification\n* @param {Event} event - Details about the user and the context in which they are logging in.\n* @param {CustomPhoneProviderAPI} api - Methods and utilities to help change the behavior of sending a phone notification.\n*/\nexports.onExecuteCustomPhoneProvider = async (event, api) => {\n // Code goes here\n return;\n};", + "runtime": "node22", + "status": "BUILT", + "number": 2, + "build_time": "2025-12-16T10:11:37.710742601Z", + "created_at": "2025-12-16T10:11:37.627490560Z", + "updated_at": "2025-12-16T10:11:37.712144713Z" + }, + "deployed_version": { + "code": "/**\n* Handler to be executed while sending a phone notification\n* @param {Event} event - Details about the user and the context in which they are logging in.\n* @param {CustomPhoneProviderAPI} api - Methods and utilities to help change the behavior of sending a phone notification.\n*/\nexports.onExecuteCustomPhoneProvider = async (event, api) => {\n // Code goes here\n return;\n};", + "dependencies": [], + "id": "83a87aec-f6f7-42bb-b6ad-6fa170f652d1", + "deployed": true, + "number": 2, + "built_at": "2025-12-16T10:11:37.710742601Z", + "secrets": [], + "status": "built", + "created_at": "2025-12-16T10:11:37.627490560Z", + "updated_at": "2025-12-16T10:11:37.712144713Z", + "runtime": "node22", + "supported_triggers": [ + { + "id": "custom-phone-provider", + "version": "v1" + } + ] + }, + "all_changes_deployed": true + }, + { + "id": "9cc78117-5697-42a8-9c1f-03bf8e5a3689", "name": "My Custom Action", "supported_triggers": [ { @@ -10627,34 +10278,34 @@ "version": "v2" } ], - "created_at": "2025-12-05T07:01:47.853050355Z", - "updated_at": "2025-12-05T07:01:47.866830407Z", + "created_at": "2025-12-16T10:12:49.378691946Z", + "updated_at": "2025-12-16T10:12:49.386633985Z", "code": "/**\n * Handler that will be called during the execution of a PostLogin flow.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\nexports.onExecutePostLogin = async (event, api) => {\n console.log('Some custom action!');\n};\n\n/**\n * Handler that will be invoked when this action is resuming after an external redirect. If your\n * onExecutePostLogin function does not perform a redirect, this function can be safely ignored.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\n// exports.onContinuePostLogin = async (event, api) => {\n// };\n", "dependencies": [], "runtime": "node18", "status": "built", "secrets": [], "current_version": { - "id": "5b00cfd8-995b-428f-a908-7b162477d1eb", + "id": "9f712c5b-390c-46d5-92f1-899d62f0e892", "code": "/**\n * Handler that will be called during the execution of a PostLogin flow.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\nexports.onExecutePostLogin = async (event, api) => {\n console.log('Some custom action!');\n};\n\n/**\n * Handler that will be invoked when this action is resuming after an external redirect. If your\n * onExecutePostLogin function does not perform a redirect, this function can be safely ignored.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\n// exports.onContinuePostLogin = async (event, api) => {\n// };\n", "runtime": "node18", "status": "BUILT", "number": 1, - "build_time": "2025-12-05T07:01:48.911433236Z", - "created_at": "2025-12-05T07:01:48.828404196Z", - "updated_at": "2025-12-05T07:01:48.912374903Z" + "build_time": "2025-12-16T10:12:50.304956456Z", + "created_at": "2025-12-16T10:12:50.209634926Z", + "updated_at": "2025-12-16T10:12:50.307080188Z" }, "deployed_version": { "code": "/**\n * Handler that will be called during the execution of a PostLogin flow.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\nexports.onExecutePostLogin = async (event, api) => {\n console.log('Some custom action!');\n};\n\n/**\n * Handler that will be invoked when this action is resuming after an external redirect. If your\n * onExecutePostLogin function does not perform a redirect, this function can be safely ignored.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\n// exports.onContinuePostLogin = async (event, api) => {\n// };\n", "dependencies": [], - "id": "5b00cfd8-995b-428f-a908-7b162477d1eb", + "id": "9f712c5b-390c-46d5-92f1-899d62f0e892", "deployed": true, "number": 1, - "built_at": "2025-12-05T07:01:48.911433236Z", + "built_at": "2025-12-16T10:12:50.304956456Z", "secrets": [], "status": "built", - "created_at": "2025-12-05T07:01:48.828404196Z", - "updated_at": "2025-12-05T07:01:48.912374903Z", + "created_at": "2025-12-16T10:12:50.209634926Z", + "updated_at": "2025-12-16T10:12:50.307080188Z", "runtime": "node18", "supported_triggers": [ { @@ -10666,7 +10317,7 @@ "all_changes_deployed": true } ], - "total": 1, + "total": 2, "per_page": 100 }, "rawHeaders": [], @@ -10681,7 +10332,54 @@ "response": { "actions": [ { - "id": "d67e0c5e-5be5-4ea1-8b75-29c65f79b7fe", + "id": "ead7d2a3-5a93-43e2-9ec3-455f3c39daf9", + "name": "Custom Phone Provider", + "supported_triggers": [ + { + "id": "custom-phone-provider", + "version": "v1" + } + ], + "created_at": "2025-12-16T10:10:30.752146844Z", + "updated_at": "2025-12-16T10:11:36.910288525Z", + "code": "/**\n* Handler to be executed while sending a phone notification\n* @param {Event} event - Details about the user and the context in which they are logging in.\n* @param {CustomPhoneProviderAPI} api - Methods and utilities to help change the behavior of sending a phone notification.\n*/\nexports.onExecuteCustomPhoneProvider = async (event, api) => {\n // Code goes here\n return;\n};", + "dependencies": [], + "runtime": "node22", + "status": "built", + "secrets": [], + "current_version": { + "id": "83a87aec-f6f7-42bb-b6ad-6fa170f652d1", + "code": "/**\n* Handler to be executed while sending a phone notification\n* @param {Event} event - Details about the user and the context in which they are logging in.\n* @param {CustomPhoneProviderAPI} api - Methods and utilities to help change the behavior of sending a phone notification.\n*/\nexports.onExecuteCustomPhoneProvider = async (event, api) => {\n // Code goes here\n return;\n};", + "runtime": "node22", + "status": "BUILT", + "number": 2, + "build_time": "2025-12-16T10:11:37.710742601Z", + "created_at": "2025-12-16T10:11:37.627490560Z", + "updated_at": "2025-12-16T10:11:37.712144713Z" + }, + "deployed_version": { + "code": "/**\n* Handler to be executed while sending a phone notification\n* @param {Event} event - Details about the user and the context in which they are logging in.\n* @param {CustomPhoneProviderAPI} api - Methods and utilities to help change the behavior of sending a phone notification.\n*/\nexports.onExecuteCustomPhoneProvider = async (event, api) => {\n // Code goes here\n return;\n};", + "dependencies": [], + "id": "83a87aec-f6f7-42bb-b6ad-6fa170f652d1", + "deployed": true, + "number": 2, + "built_at": "2025-12-16T10:11:37.710742601Z", + "secrets": [], + "status": "built", + "created_at": "2025-12-16T10:11:37.627490560Z", + "updated_at": "2025-12-16T10:11:37.712144713Z", + "runtime": "node22", + "supported_triggers": [ + { + "id": "custom-phone-provider", + "version": "v1" + } + ] + }, + "all_changes_deployed": true + }, + { + "id": "9cc78117-5697-42a8-9c1f-03bf8e5a3689", "name": "My Custom Action", "supported_triggers": [ { @@ -10689,34 +10387,34 @@ "version": "v2" } ], - "created_at": "2025-12-05T07:01:47.853050355Z", - "updated_at": "2025-12-05T07:01:47.866830407Z", + "created_at": "2025-12-16T10:12:49.378691946Z", + "updated_at": "2025-12-16T10:12:49.386633985Z", "code": "/**\n * Handler that will be called during the execution of a PostLogin flow.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\nexports.onExecutePostLogin = async (event, api) => {\n console.log('Some custom action!');\n};\n\n/**\n * Handler that will be invoked when this action is resuming after an external redirect. If your\n * onExecutePostLogin function does not perform a redirect, this function can be safely ignored.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\n// exports.onContinuePostLogin = async (event, api) => {\n// };\n", "dependencies": [], "runtime": "node18", "status": "built", "secrets": [], "current_version": { - "id": "5b00cfd8-995b-428f-a908-7b162477d1eb", + "id": "9f712c5b-390c-46d5-92f1-899d62f0e892", "code": "/**\n * Handler that will be called during the execution of a PostLogin flow.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\nexports.onExecutePostLogin = async (event, api) => {\n console.log('Some custom action!');\n};\n\n/**\n * Handler that will be invoked when this action is resuming after an external redirect. If your\n * onExecutePostLogin function does not perform a redirect, this function can be safely ignored.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\n// exports.onContinuePostLogin = async (event, api) => {\n// };\n", "runtime": "node18", "status": "BUILT", "number": 1, - "build_time": "2025-12-05T07:01:48.911433236Z", - "created_at": "2025-12-05T07:01:48.828404196Z", - "updated_at": "2025-12-05T07:01:48.912374903Z" + "build_time": "2025-12-16T10:12:50.304956456Z", + "created_at": "2025-12-16T10:12:50.209634926Z", + "updated_at": "2025-12-16T10:12:50.307080188Z" }, "deployed_version": { "code": "/**\n * Handler that will be called during the execution of a PostLogin flow.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\nexports.onExecutePostLogin = async (event, api) => {\n console.log('Some custom action!');\n};\n\n/**\n * Handler that will be invoked when this action is resuming after an external redirect. If your\n * onExecutePostLogin function does not perform a redirect, this function can be safely ignored.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\n// exports.onContinuePostLogin = async (event, api) => {\n// };\n", "dependencies": [], - "id": "5b00cfd8-995b-428f-a908-7b162477d1eb", + "id": "9f712c5b-390c-46d5-92f1-899d62f0e892", "deployed": true, "number": 1, - "built_at": "2025-12-05T07:01:48.911433236Z", + "built_at": "2025-12-16T10:12:50.304956456Z", "secrets": [], "status": "built", - "created_at": "2025-12-05T07:01:48.828404196Z", - "updated_at": "2025-12-05T07:01:48.912374903Z", + "created_at": "2025-12-16T10:12:50.209634926Z", + "updated_at": "2025-12-16T10:12:50.307080188Z", "runtime": "node18", "supported_triggers": [ { @@ -10728,56 +10426,12 @@ "all_changes_deployed": true } ], - "total": 1, + "total": 2, "per_page": 100 }, "rawHeaders": [], "responseIsBinary": false }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "PATCH", - "path": "/api/v2/attack-protection/suspicious-ip-throttling", - "body": { - "enabled": true, - "shields": [ - "admin_notification", - "block" - ], - "allowlist": [], - "stage": { - "pre-login": { - "max_attempts": 100, - "rate": 864000 - }, - "pre-user-registration": { - "max_attempts": 50, - "rate": 1200 - } - } - }, - "status": 200, - "response": { - "enabled": true, - "shields": [ - "admin_notification", - "block" - ], - "allowlist": [], - "stage": { - "pre-login": { - "max_attempts": 100, - "rate": 864000 - }, - "pre-user-registration": { - "max_attempts": 50, - "rate": 1200 - } - } - }, - "rawHeaders": [], - "responseIsBinary": false - }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PATCH", @@ -10834,6 +10488,54 @@ "rawHeaders": [], "responseIsBinary": false }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "PATCH", + "path": "/api/v2/attack-protection/suspicious-ip-throttling", + "body": { + "enabled": true, + "shields": [ + "admin_notification", + "block" + ], + "allowlist": [], + "stage": { + "pre-login": { + "max_attempts": 100, + "rate": 864000 + }, + "pre-user-registration": { + "max_attempts": 50, + "rate": 1200 + } + } + }, + "status": 200, + "response": { + "enabled": true, + "shields": [ + "admin_notification", + "block" + ], + "allowlist": [], + "stage": { + "pre-login": { + "max_attempts": 100, + "rate": 864000 + }, + "pre-user-registration": { + "max_attempts": 50, + "rate": 1200 + }, + "pre-custom-token-exchange": { + "max_attempts": 10, + "rate": 600000 + } + } + }, + "rawHeaders": [], + "responseIsBinary": false + }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", @@ -10927,7 +10629,7 @@ "subject": "deprecated" } ], - "client_id": "cLFFGtjp2Xe7HWQCHfCtQxmURfSu1lDH", + "client_id": "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -10980,7 +10682,7 @@ "subject": "deprecated" } ], - "client_id": "uf1Ju9xwQ09AWpcnRnwD91W3Sv3bf76S", + "client_id": "0ltKN06qv5WnNoNz2Fu6QvyOl2o6K6nE", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -11025,7 +10727,7 @@ "subject": "deprecated" } ], - "client_id": "WYPQxuqDdeNZHLcJeuPq0AvuNFtMiUgU", + "client_id": "HC5UXDFP5lEc2vbTkPQWJ1yYeiLRkmDg", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -11079,7 +10781,7 @@ } ], "allowed_origins": [], - "client_id": "QwKFSZ87TYF89lXp66sVFpGzYGQ07OU6", + "client_id": "KjqnjAT6PWajvX3XKVkWhFVaW8sFBWyv", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -11125,7 +10827,7 @@ "subject": "deprecated" } ], - "client_id": "VvKPDeB2QHhtG4tVBNcrRUuChB0jWefu", + "client_id": "GH55Wtak9aTrj6tjRFObq1cqnu5a8mtM", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -11144,14 +10846,9 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "Test SPA", + "name": "The Default App", "allowed_clients": [], - "allowed_logout_urls": [ - "http://localhost:3000" - ], - "callbacks": [ - "http://localhost:3000" - ], + "callbacks": [], "client_metadata": {}, "is_first_party": true, "native_social_login": { @@ -11162,16 +10859,17 @@ "enabled": false } }, - "oidc_conformant": true, + "oidc_conformant": false, "refresh_token": { - "expiration_type": "expiring", + "expiration_type": "non-expiring", "leeway": 0, + "infinite_token_lifetime": true, + "infinite_idle_token_lifetime": true, "token_lifetime": 2592000, "idle_token_lifetime": 1296000, - "infinite_token_lifetime": false, - "infinite_idle_token_lifetime": false, - "rotation_type": "rotating" + "rotation_type": "non-rotating" }, + "sso": false, "sso_disabled": false, "cross_origin_authentication": false, "cross_origin_auth": false, @@ -11182,7 +10880,7 @@ "subject": "deprecated" } ], - "client_id": "xODbqyam7rjqHDsYKjU9Tuo99yaBnR5T", + "client_id": "ahrUt7DkBom8m2EAs0zLSccaylYIuVfF", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -11191,15 +10889,12 @@ "secret_encoded": false }, "client_aliases": [], - "token_endpoint_auth_method": "none", - "app_type": "spa", + "token_endpoint_auth_method": "client_secret_post", "grant_types": [ "authorization_code", "implicit", - "refresh_token" - ], - "web_origins": [ - "http://localhost:3000" + "refresh_token", + "client_credentials" ], "custom_login_page_on": true }, @@ -11207,9 +10902,14 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "auth0-deploy-cli-extension", + "name": "Test SPA", "allowed_clients": [], - "callbacks": [], + "allowed_logout_urls": [ + "http://localhost:3000" + ], + "callbacks": [ + "http://localhost:3000" + ], "client_metadata": {}, "is_first_party": true, "native_social_login": { @@ -11222,13 +10922,13 @@ }, "oidc_conformant": true, "refresh_token": { - "expiration_type": "non-expiring", + "expiration_type": "expiring", "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" + "token_lifetime": 2592000, + "idle_token_lifetime": 1296000, + "infinite_token_lifetime": false, + "infinite_idle_token_lifetime": false, + "rotation_type": "rotating" }, "sso_disabled": false, "cross_origin_authentication": false, @@ -11240,7 +10940,7 @@ "subject": "deprecated" } ], - "client_id": "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1", + "client_id": "68Ty4a89yPogS0UGdX8aYaS6td9DXYjs", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -11249,10 +10949,15 @@ "secret_encoded": false }, "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", + "token_endpoint_auth_method": "none", + "app_type": "spa", "grant_types": [ - "client_credentials" + "authorization_code", + "implicit", + "refresh_token" + ], + "web_origins": [ + "http://localhost:3000" ], "custom_login_page_on": true }, @@ -11260,7 +10965,7 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "The Default App", + "name": "auth0-deploy-cli-extension", "allowed_clients": [], "callbacks": [], "client_metadata": {}, @@ -11273,17 +10978,16 @@ "enabled": false } }, - "oidc_conformant": false, + "oidc_conformant": true, "refresh_token": { "expiration_type": "non-expiring", "leeway": 0, "infinite_token_lifetime": true, "infinite_idle_token_lifetime": true, - "token_lifetime": 2592000, - "idle_token_lifetime": 1296000, + "token_lifetime": 31557600, + "idle_token_lifetime": 2592000, "rotation_type": "non-rotating" }, - "sso": false, "sso_disabled": false, "cross_origin_authentication": false, "cross_origin_auth": false, @@ -11294,7 +10998,7 @@ "subject": "deprecated" } ], - "client_id": "xYOv2UsoAuKptIEAjkeB62Oaeg1Jn2QX", + "client_id": "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -11304,10 +11008,8 @@ }, "client_aliases": [], "token_endpoint_auth_method": "client_secret_post", + "app_type": "non_interactive", "grant_types": [ - "authorization_code", - "implicit", - "refresh_token", "client_credentials" ], "custom_login_page_on": true @@ -11357,16 +11059,13 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections?include_totals=true&strategy=auth0", + "path": "/api/v2/connections?take=50&strategy=auth0", "body": "", "status": 200, "response": { - "total": 2, - "start": 0, - "limit": 50, "connections": [ { - "id": "con_fuBNFcmY8aL3HDBT", + "id": "con_cxSOS7uLgPojtLBh", "options": { "mfa": { "active": true, @@ -11429,12 +11128,12 @@ "boo-baz-db-connection-test" ], "enabled_clients": [ - "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1", - "QwKFSZ87TYF89lXp66sVFpGzYGQ07OU6" + "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU", + "KjqnjAT6PWajvX3XKVkWhFVaW8sFBWyv" ] }, { - "id": "con_Ty3Nbl0J1Ddxat41", + "id": "con_3R2lX4rln4ArocW5", "options": { "mfa": { "active": true, @@ -11472,7 +11171,7 @@ ], "enabled_clients": [ "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", - "cLFFGtjp2Xe7HWQCHfCtQxmURfSu1lDH" + "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" ] } ] @@ -11483,13 +11182,13 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections?include_totals=true&take=50&strategy=auth0", + "path": "/api/v2/connections?take=50&strategy=auth0", "body": "", "status": 200, "response": { "connections": [ { - "id": "con_fuBNFcmY8aL3HDBT", + "id": "con_cxSOS7uLgPojtLBh", "options": { "mfa": { "active": true, @@ -11552,12 +11251,12 @@ "boo-baz-db-connection-test" ], "enabled_clients": [ - "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1", - "QwKFSZ87TYF89lXp66sVFpGzYGQ07OU6" + "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU", + "KjqnjAT6PWajvX3XKVkWhFVaW8sFBWyv" ] }, { - "id": "con_Ty3Nbl0J1Ddxat41", + "id": "con_3R2lX4rln4ArocW5", "options": { "mfa": { "active": true, @@ -11595,7 +11294,7 @@ ], "enabled_clients": [ "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", - "cLFFGtjp2Xe7HWQCHfCtQxmURfSu1lDH" + "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" ] } ] @@ -11606,123 +11305,16 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections?include_totals=true&strategy=auth0", + "path": "/api/v2/connections/con_cxSOS7uLgPojtLBh/clients?take=50", "body": "", "status": 200, "response": { - "total": 2, - "start": 0, - "limit": 50, - "connections": [ + "clients": [ { - "id": "con_fuBNFcmY8aL3HDBT", - "options": { - "mfa": { - "active": true, - "return_enroll_settings": true - }, - "import_mode": false, - "customScripts": { - "login": "function login(email, password, callback) {\n // This script should authenticate a user against the credentials stored in\n // your database.\n // It is executed when a user attempts to log in or immediately after signing\n // up (as a verification that the user was successfully signed up).\n //\n // Everything returned by this script will be set as part of the user profile\n // and will be visible by any of the tenant admins. Avoid adding attributes\n // with values such as passwords, keys, secrets, etc.\n //\n // The `password` parameter of this function is in plain text. It must be\n // hashed/salted to match whatever is stored in your database. For example:\n //\n // var bcrypt = require('bcrypt@0.8.5');\n // bcrypt.compare(password, dbPasswordHash, function(err, res)) { ... }\n //\n // There are three ways this script can finish:\n // 1. The user's credentials are valid. The returned user profile should be in\n // the following format: https://auth0.com/docs/users/normalized/auth0/normalized-user-profile-schema\n // var profile = {\n // user_id: ..., // user_id is mandatory\n // email: ...,\n // [...]\n // };\n // callback(null, profile);\n // 2. The user's credentials are invalid\n // callback(new WrongUsernameOrPasswordError(email, \"my error message\"));\n // 3. Something went wrong while trying to reach your database\n // callback(new Error(\"my error message\"));\n //\n // A list of Node.js modules which can be referenced is available here:\n //\n // https://tehsis.github.io/webtaskio-canirequire/\n console.log('AYYYYYE');\n\n const msg =\n 'Please implement the Login script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "create": "function create(user, callback) {\n // This script should create a user entry in your existing database. It will\n // be executed when a user attempts to sign up, or when a user is created\n // through the Auth0 dashboard or API.\n // When this script has finished executing, the Login script will be\n // executed immediately afterwards, to verify that the user was created\n // successfully.\n //\n // The user object will always contain the following properties:\n // * email: the user's email\n // * password: the password entered by the user, in plain text\n // * tenant: the name of this Auth0 account\n // * client_id: the client ID of the application where the user signed up, or\n // API key if created through the API or Auth0 dashboard\n // * connection: the name of this database connection\n //\n // There are three ways this script can finish:\n // 1. A user was successfully created\n // callback(null);\n // 2. This user already exists in your database\n // callback(new ValidationError(\"user_exists\", \"my error message\"));\n // 3. Something went wrong while trying to reach your database\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Create script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "delete": "function remove(id, callback) {\n // This script remove a user from your existing database.\n // It is executed whenever a user is deleted from the API or Auth0 dashboard.\n //\n // There are two ways that this script can finish:\n // 1. The user was removed successfully:\n // callback(null);\n // 2. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Delete script for this database ' +\n 'connection at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "verify": "function verify(email, callback) {\n // This script should mark the current user's email address as verified in\n // your database.\n // It is executed whenever a user clicks the verification link sent by email.\n // These emails can be customized at https://manage.auth0.com/#/emails.\n // It is safe to assume that the user's email already exists in your database,\n // because verification emails, if enabled, are sent immediately after a\n // successful signup.\n //\n // There are two ways that this script can finish:\n // 1. The user's email was verified successfully\n // callback(null, true);\n // 2. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n //\n // If an error is returned, it will be passed to the query string of the page\n // where the user is being redirected to after clicking the verification link.\n // For example, returning `callback(new Error(\"error\"))` and redirecting to\n // https://example.com would redirect to the following URL:\n // https://example.com?email=alice%40example.com&message=error&success=false\n\n const msg =\n 'Please implement the Verify script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "get_user": "function getByEmail(email, callback) {\n // This script should retrieve a user profile from your existing database,\n // without authenticating the user.\n // It is used to check if a user exists before executing flows that do not\n // require authentication (signup and password reset).\n //\n // There are three ways this script can finish:\n // 1. A user was successfully found. The profile should be in the following\n // format: https://auth0.com/docs/users/normalized/auth0/normalized-user-profile-schema.\n // callback(null, profile);\n // 2. A user was not found\n // callback(null);\n // 3. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Get User script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "change_password": "function changePassword(email, newPassword, callback) {\n // This script should change the password stored for the current user in your\n // database. It is executed when the user clicks on the confirmation link\n // after a reset password request.\n // The content and behavior of password confirmation emails can be customized\n // here: https://manage.auth0.com/#/emails\n // The `newPassword` parameter of this function is in plain text. It must be\n // hashed/salted to match whatever is stored in your database.\n //\n // There are three ways that this script can finish:\n // 1. The user's password was updated successfully:\n // callback(null, true);\n // 2. The user's password was not updated:\n // callback(null, false);\n // 3. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n //\n // If an error is returned, it will be passed to the query string of the page\n // where the user is being redirected to after clicking the confirmation link.\n // For example, returning `callback(new Error(\"error\"))` and redirecting to\n // https://example.com would redirect to the following URL:\n // https://example.com?email=alice%40example.com&message=error&success=false\n\n const msg =\n 'Please implement the Change Password script for this database ' +\n 'connection at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n" - }, - "disable_signup": false, - "passwordPolicy": "low", - "passkey_options": { - "challenge_ui": "both", - "local_enrollment_enabled": true, - "progressive_enrollment_enabled": true - }, - "password_history": { - "size": 5, - "enable": false - }, - "strategy_version": 2, - "requires_username": true, - "password_dictionary": { - "enable": true, - "dictionary": [] - }, - "authentication_methods": { - "passkey": { - "enabled": false - }, - "password": { - "enabled": true, - "api_behavior": "required" - } - }, - "brute_force_protection": true, - "password_no_personal_info": { - "enable": true - }, - "password_complexity_options": { - "min_length": 8 - }, - "enabledDatabaseCustomization": true - }, - "strategy": "auth0", - "name": "boo-baz-db-connection-test", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "boo-baz-db-connection-test" - ], - "enabled_clients": [ - "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1", - "QwKFSZ87TYF89lXp66sVFpGzYGQ07OU6" - ] + "client_id": "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU" }, { - "id": "con_Ty3Nbl0J1Ddxat41", - "options": { - "mfa": { - "active": true, - "return_enroll_settings": true - }, - "passwordPolicy": "good", - "passkey_options": { - "challenge_ui": "both", - "local_enrollment_enabled": true, - "progressive_enrollment_enabled": true - }, - "strategy_version": 2, - "authentication_methods": { - "passkey": { - "enabled": false - }, - "password": { - "enabled": true, - "api_behavior": "required" - } - }, - "brute_force_protection": true - }, - "strategy": "auth0", - "name": "Username-Password-Authentication", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "Username-Password-Authentication" - ], - "enabled_clients": [ - "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", - "cLFFGtjp2Xe7HWQCHfCtQxmURfSu1lDH" - ] + "client_id": "KjqnjAT6PWajvX3XKVkWhFVaW8sFBWyv" } ] }, @@ -11732,120 +11324,16 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections?include_totals=true&take=50&strategy=auth0", + "path": "/api/v2/connections/con_3R2lX4rln4ArocW5/clients?take=50", "body": "", "status": 200, "response": { - "connections": [ + "clients": [ { - "id": "con_fuBNFcmY8aL3HDBT", - "options": { - "mfa": { - "active": true, - "return_enroll_settings": true - }, - "import_mode": false, - "customScripts": { - "login": "function login(email, password, callback) {\n // This script should authenticate a user against the credentials stored in\n // your database.\n // It is executed when a user attempts to log in or immediately after signing\n // up (as a verification that the user was successfully signed up).\n //\n // Everything returned by this script will be set as part of the user profile\n // and will be visible by any of the tenant admins. Avoid adding attributes\n // with values such as passwords, keys, secrets, etc.\n //\n // The `password` parameter of this function is in plain text. It must be\n // hashed/salted to match whatever is stored in your database. For example:\n //\n // var bcrypt = require('bcrypt@0.8.5');\n // bcrypt.compare(password, dbPasswordHash, function(err, res)) { ... }\n //\n // There are three ways this script can finish:\n // 1. The user's credentials are valid. The returned user profile should be in\n // the following format: https://auth0.com/docs/users/normalized/auth0/normalized-user-profile-schema\n // var profile = {\n // user_id: ..., // user_id is mandatory\n // email: ...,\n // [...]\n // };\n // callback(null, profile);\n // 2. The user's credentials are invalid\n // callback(new WrongUsernameOrPasswordError(email, \"my error message\"));\n // 3. Something went wrong while trying to reach your database\n // callback(new Error(\"my error message\"));\n //\n // A list of Node.js modules which can be referenced is available here:\n //\n // https://tehsis.github.io/webtaskio-canirequire/\n console.log('AYYYYYE');\n\n const msg =\n 'Please implement the Login script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "create": "function create(user, callback) {\n // This script should create a user entry in your existing database. It will\n // be executed when a user attempts to sign up, or when a user is created\n // through the Auth0 dashboard or API.\n // When this script has finished executing, the Login script will be\n // executed immediately afterwards, to verify that the user was created\n // successfully.\n //\n // The user object will always contain the following properties:\n // * email: the user's email\n // * password: the password entered by the user, in plain text\n // * tenant: the name of this Auth0 account\n // * client_id: the client ID of the application where the user signed up, or\n // API key if created through the API or Auth0 dashboard\n // * connection: the name of this database connection\n //\n // There are three ways this script can finish:\n // 1. A user was successfully created\n // callback(null);\n // 2. This user already exists in your database\n // callback(new ValidationError(\"user_exists\", \"my error message\"));\n // 3. Something went wrong while trying to reach your database\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Create script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "delete": "function remove(id, callback) {\n // This script remove a user from your existing database.\n // It is executed whenever a user is deleted from the API or Auth0 dashboard.\n //\n // There are two ways that this script can finish:\n // 1. The user was removed successfully:\n // callback(null);\n // 2. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Delete script for this database ' +\n 'connection at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "verify": "function verify(email, callback) {\n // This script should mark the current user's email address as verified in\n // your database.\n // It is executed whenever a user clicks the verification link sent by email.\n // These emails can be customized at https://manage.auth0.com/#/emails.\n // It is safe to assume that the user's email already exists in your database,\n // because verification emails, if enabled, are sent immediately after a\n // successful signup.\n //\n // There are two ways that this script can finish:\n // 1. The user's email was verified successfully\n // callback(null, true);\n // 2. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n //\n // If an error is returned, it will be passed to the query string of the page\n // where the user is being redirected to after clicking the verification link.\n // For example, returning `callback(new Error(\"error\"))` and redirecting to\n // https://example.com would redirect to the following URL:\n // https://example.com?email=alice%40example.com&message=error&success=false\n\n const msg =\n 'Please implement the Verify script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "get_user": "function getByEmail(email, callback) {\n // This script should retrieve a user profile from your existing database,\n // without authenticating the user.\n // It is used to check if a user exists before executing flows that do not\n // require authentication (signup and password reset).\n //\n // There are three ways this script can finish:\n // 1. A user was successfully found. The profile should be in the following\n // format: https://auth0.com/docs/users/normalized/auth0/normalized-user-profile-schema.\n // callback(null, profile);\n // 2. A user was not found\n // callback(null);\n // 3. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Get User script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "change_password": "function changePassword(email, newPassword, callback) {\n // This script should change the password stored for the current user in your\n // database. It is executed when the user clicks on the confirmation link\n // after a reset password request.\n // The content and behavior of password confirmation emails can be customized\n // here: https://manage.auth0.com/#/emails\n // The `newPassword` parameter of this function is in plain text. It must be\n // hashed/salted to match whatever is stored in your database.\n //\n // There are three ways that this script can finish:\n // 1. The user's password was updated successfully:\n // callback(null, true);\n // 2. The user's password was not updated:\n // callback(null, false);\n // 3. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n //\n // If an error is returned, it will be passed to the query string of the page\n // where the user is being redirected to after clicking the confirmation link.\n // For example, returning `callback(new Error(\"error\"))` and redirecting to\n // https://example.com would redirect to the following URL:\n // https://example.com?email=alice%40example.com&message=error&success=false\n\n const msg =\n 'Please implement the Change Password script for this database ' +\n 'connection at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n" - }, - "disable_signup": false, - "passwordPolicy": "low", - "passkey_options": { - "challenge_ui": "both", - "local_enrollment_enabled": true, - "progressive_enrollment_enabled": true - }, - "password_history": { - "size": 5, - "enable": false - }, - "strategy_version": 2, - "requires_username": true, - "password_dictionary": { - "enable": true, - "dictionary": [] - }, - "authentication_methods": { - "passkey": { - "enabled": false - }, - "password": { - "enabled": true, - "api_behavior": "required" - } - }, - "brute_force_protection": true, - "password_no_personal_info": { - "enable": true - }, - "password_complexity_options": { - "min_length": 8 - }, - "enabledDatabaseCustomization": true - }, - "strategy": "auth0", - "name": "boo-baz-db-connection-test", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "boo-baz-db-connection-test" - ], - "enabled_clients": [ - "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1", - "QwKFSZ87TYF89lXp66sVFpGzYGQ07OU6" - ] + "client_id": "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" }, { - "id": "con_Ty3Nbl0J1Ddxat41", - "options": { - "mfa": { - "active": true, - "return_enroll_settings": true - }, - "passwordPolicy": "good", - "passkey_options": { - "challenge_ui": "both", - "local_enrollment_enabled": true, - "progressive_enrollment_enabled": true - }, - "strategy_version": 2, - "authentication_methods": { - "passkey": { - "enabled": false - }, - "password": { - "enabled": true, - "api_behavior": "required" - } - }, - "brute_force_protection": true - }, - "strategy": "auth0", - "name": "Username-Password-Authentication", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "Username-Password-Authentication" - ], - "enabled_clients": [ - "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", - "cLFFGtjp2Xe7HWQCHfCtQxmURfSu1lDH" - ] + "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE" } ] }, @@ -11855,13 +11343,13 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections/con_Ty3Nbl0J1Ddxat41/clients?take=50", + "path": "/api/v2/connections/con_3R2lX4rln4ArocW5/clients?take=50", "body": "", "status": 200, "response": { "clients": [ { - "client_id": "cLFFGtjp2Xe7HWQCHfCtQxmURfSu1lDH" + "client_id": "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" }, { "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE" @@ -11874,16 +11362,16 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections/con_fuBNFcmY8aL3HDBT/clients?take=50", + "path": "/api/v2/connections/con_cxSOS7uLgPojtLBh/clients?take=50", "body": "", "status": 200, "response": { "clients": [ { - "client_id": "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1" + "client_id": "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU" }, { - "client_id": "QwKFSZ87TYF89lXp66sVFpGzYGQ07OU6" + "client_id": "KjqnjAT6PWajvX3XKVkWhFVaW8sFBWyv" } ] }, @@ -11893,11 +11381,11 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections/con_Ty3Nbl0J1Ddxat41", + "path": "/api/v2/connections/con_3R2lX4rln4ArocW5", "body": "", "status": 200, "response": { - "id": "con_Ty3Nbl0J1Ddxat41", + "id": "con_3R2lX4rln4ArocW5", "options": { "mfa": { "active": true, @@ -11932,7 +11420,7 @@ }, "enabled_clients": [ "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", - "cLFFGtjp2Xe7HWQCHfCtQxmURfSu1lDH" + "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" ], "realms": [ "Username-Password-Authentication" @@ -11944,11 +11432,11 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PATCH", - "path": "/api/v2/connections/con_Ty3Nbl0J1Ddxat41", + "path": "/api/v2/connections/con_3R2lX4rln4ArocW5", "body": { "enabled_clients": [ "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", - "cLFFGtjp2Xe7HWQCHfCtQxmURfSu1lDH" + "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" ], "is_domain_connection": false, "options": { @@ -11980,7 +11468,7 @@ }, "status": 200, "response": { - "id": "con_Ty3Nbl0J1Ddxat41", + "id": "con_3R2lX4rln4ArocW5", "options": { "mfa": { "active": true, @@ -12015,7 +11503,7 @@ }, "enabled_clients": [ "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", - "cLFFGtjp2Xe7HWQCHfCtQxmURfSu1lDH" + "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" ], "realms": [ "Username-Password-Authentication" @@ -12027,14 +11515,14 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PATCH", - "path": "/api/v2/connections/con_Ty3Nbl0J1Ddxat41/clients", + "path": "/api/v2/connections/con_3R2lX4rln4ArocW5/clients", "body": [ { "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", "status": true }, { - "client_id": "cLFFGtjp2Xe7HWQCHfCtQxmURfSu1lDH", + "client_id": "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V", "status": true } ], @@ -12136,7 +11624,7 @@ "subject": "deprecated" } ], - "client_id": "cLFFGtjp2Xe7HWQCHfCtQxmURfSu1lDH", + "client_id": "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -12189,7 +11677,7 @@ "subject": "deprecated" } ], - "client_id": "uf1Ju9xwQ09AWpcnRnwD91W3Sv3bf76S", + "client_id": "0ltKN06qv5WnNoNz2Fu6QvyOl2o6K6nE", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -12234,7 +11722,7 @@ "subject": "deprecated" } ], - "client_id": "WYPQxuqDdeNZHLcJeuPq0AvuNFtMiUgU", + "client_id": "HC5UXDFP5lEc2vbTkPQWJ1yYeiLRkmDg", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -12288,7 +11776,7 @@ } ], "allowed_origins": [], - "client_id": "QwKFSZ87TYF89lXp66sVFpGzYGQ07OU6", + "client_id": "KjqnjAT6PWajvX3XKVkWhFVaW8sFBWyv", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -12334,7 +11822,7 @@ "subject": "deprecated" } ], - "client_id": "VvKPDeB2QHhtG4tVBNcrRUuChB0jWefu", + "client_id": "GH55Wtak9aTrj6tjRFObq1cqnu5a8mtM", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -12353,14 +11841,9 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "Test SPA", + "name": "The Default App", "allowed_clients": [], - "allowed_logout_urls": [ - "http://localhost:3000" - ], - "callbacks": [ - "http://localhost:3000" - ], + "callbacks": [], "client_metadata": {}, "is_first_party": true, "native_social_login": { @@ -12371,16 +11854,17 @@ "enabled": false } }, - "oidc_conformant": true, + "oidc_conformant": false, "refresh_token": { - "expiration_type": "expiring", + "expiration_type": "non-expiring", "leeway": 0, + "infinite_token_lifetime": true, + "infinite_idle_token_lifetime": true, "token_lifetime": 2592000, "idle_token_lifetime": 1296000, - "infinite_token_lifetime": false, - "infinite_idle_token_lifetime": false, - "rotation_type": "rotating" + "rotation_type": "non-rotating" }, + "sso": false, "sso_disabled": false, "cross_origin_authentication": false, "cross_origin_auth": false, @@ -12391,7 +11875,7 @@ "subject": "deprecated" } ], - "client_id": "xODbqyam7rjqHDsYKjU9Tuo99yaBnR5T", + "client_id": "ahrUt7DkBom8m2EAs0zLSccaylYIuVfF", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -12400,15 +11884,12 @@ "secret_encoded": false }, "client_aliases": [], - "token_endpoint_auth_method": "none", - "app_type": "spa", + "token_endpoint_auth_method": "client_secret_post", "grant_types": [ "authorization_code", "implicit", - "refresh_token" - ], - "web_origins": [ - "http://localhost:3000" + "refresh_token", + "client_credentials" ], "custom_login_page_on": true }, @@ -12416,9 +11897,14 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "auth0-deploy-cli-extension", + "name": "Test SPA", "allowed_clients": [], - "callbacks": [], + "allowed_logout_urls": [ + "http://localhost:3000" + ], + "callbacks": [ + "http://localhost:3000" + ], "client_metadata": {}, "is_first_party": true, "native_social_login": { @@ -12431,13 +11917,13 @@ }, "oidc_conformant": true, "refresh_token": { - "expiration_type": "non-expiring", + "expiration_type": "expiring", "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" + "token_lifetime": 2592000, + "idle_token_lifetime": 1296000, + "infinite_token_lifetime": false, + "infinite_idle_token_lifetime": false, + "rotation_type": "rotating" }, "sso_disabled": false, "cross_origin_authentication": false, @@ -12449,7 +11935,7 @@ "subject": "deprecated" } ], - "client_id": "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1", + "client_id": "68Ty4a89yPogS0UGdX8aYaS6td9DXYjs", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -12458,10 +11944,15 @@ "secret_encoded": false }, "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", + "token_endpoint_auth_method": "none", + "app_type": "spa", "grant_types": [ - "client_credentials" + "authorization_code", + "implicit", + "refresh_token" + ], + "web_origins": [ + "http://localhost:3000" ], "custom_login_page_on": true }, @@ -12469,7 +11960,7 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "The Default App", + "name": "auth0-deploy-cli-extension", "allowed_clients": [], "callbacks": [], "client_metadata": {}, @@ -12482,17 +11973,16 @@ "enabled": false } }, - "oidc_conformant": false, + "oidc_conformant": true, "refresh_token": { "expiration_type": "non-expiring", "leeway": 0, "infinite_token_lifetime": true, "infinite_idle_token_lifetime": true, - "token_lifetime": 2592000, - "idle_token_lifetime": 1296000, + "token_lifetime": 31557600, + "idle_token_lifetime": 2592000, "rotation_type": "non-rotating" }, - "sso": false, "sso_disabled": false, "cross_origin_authentication": false, "cross_origin_auth": false, @@ -12503,7 +11993,7 @@ "subject": "deprecated" } ], - "client_id": "xYOv2UsoAuKptIEAjkeB62Oaeg1Jn2QX", + "client_id": "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -12513,10 +12003,8 @@ }, "client_aliases": [], "token_endpoint_auth_method": "client_secret_post", + "app_type": "non_interactive", "grant_types": [ - "authorization_code", - "implicit", - "refresh_token", "client_credentials" ], "custom_login_page_on": true @@ -12566,16 +12054,13 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections?include_totals=true", + "path": "/api/v2/connections?take=50", "body": "", "status": 200, "response": { - "total": 3, - "start": 0, - "limit": 50, "connections": [ { - "id": "con_fuBNFcmY8aL3HDBT", + "id": "con_cxSOS7uLgPojtLBh", "options": { "mfa": { "active": true, @@ -12638,12 +12123,12 @@ "boo-baz-db-connection-test" ], "enabled_clients": [ - "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1", - "QwKFSZ87TYF89lXp66sVFpGzYGQ07OU6" + "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU", + "KjqnjAT6PWajvX3XKVkWhFVaW8sFBWyv" ] }, { - "id": "con_URfc5OIXMzEJtZaz", + "id": "con_lfhXlIY73LFJlMks", "options": { "email": true, "scope": [ @@ -12665,12 +12150,12 @@ "google-oauth2" ], "enabled_clients": [ - "xYOv2UsoAuKptIEAjkeB62Oaeg1Jn2QX", - "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1" + "ahrUt7DkBom8m2EAs0zLSccaylYIuVfF", + "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU" ] }, { - "id": "con_Ty3Nbl0J1Ddxat41", + "id": "con_3R2lX4rln4ArocW5", "options": { "mfa": { "active": true, @@ -12708,7 +12193,7 @@ ], "enabled_clients": [ "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", - "cLFFGtjp2Xe7HWQCHfCtQxmURfSu1lDH" + "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" ] } ] @@ -12719,13 +12204,13 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections?include_totals=true&take=50", + "path": "/api/v2/connections?take=50", "body": "", "status": 200, "response": { "connections": [ { - "id": "con_fuBNFcmY8aL3HDBT", + "id": "con_cxSOS7uLgPojtLBh", "options": { "mfa": { "active": true, @@ -12788,12 +12273,12 @@ "boo-baz-db-connection-test" ], "enabled_clients": [ - "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1", - "QwKFSZ87TYF89lXp66sVFpGzYGQ07OU6" + "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU", + "KjqnjAT6PWajvX3XKVkWhFVaW8sFBWyv" ] }, { - "id": "con_URfc5OIXMzEJtZaz", + "id": "con_lfhXlIY73LFJlMks", "options": { "email": true, "scope": [ @@ -12815,12 +12300,12 @@ "google-oauth2" ], "enabled_clients": [ - "xYOv2UsoAuKptIEAjkeB62Oaeg1Jn2QX", - "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1" + "ahrUt7DkBom8m2EAs0zLSccaylYIuVfF", + "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU" ] }, { - "id": "con_Ty3Nbl0J1Ddxat41", + "id": "con_3R2lX4rln4ArocW5", "options": { "mfa": { "active": true, @@ -12858,7 +12343,7 @@ ], "enabled_clients": [ "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", - "cLFFGtjp2Xe7HWQCHfCtQxmURfSu1lDH" + "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" ] } ] @@ -12869,150 +12354,35 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections?include_totals=true", + "path": "/api/v2/connections/con_lfhXlIY73LFJlMks/clients?take=50", "body": "", "status": 200, "response": { - "total": 3, - "start": 0, - "limit": 50, - "connections": [ + "clients": [ { - "id": "con_fuBNFcmY8aL3HDBT", - "options": { - "mfa": { - "active": true, - "return_enroll_settings": true - }, - "import_mode": false, - "customScripts": { - "login": "function login(email, password, callback) {\n // This script should authenticate a user against the credentials stored in\n // your database.\n // It is executed when a user attempts to log in or immediately after signing\n // up (as a verification that the user was successfully signed up).\n //\n // Everything returned by this script will be set as part of the user profile\n // and will be visible by any of the tenant admins. Avoid adding attributes\n // with values such as passwords, keys, secrets, etc.\n //\n // The `password` parameter of this function is in plain text. It must be\n // hashed/salted to match whatever is stored in your database. For example:\n //\n // var bcrypt = require('bcrypt@0.8.5');\n // bcrypt.compare(password, dbPasswordHash, function(err, res)) { ... }\n //\n // There are three ways this script can finish:\n // 1. The user's credentials are valid. The returned user profile should be in\n // the following format: https://auth0.com/docs/users/normalized/auth0/normalized-user-profile-schema\n // var profile = {\n // user_id: ..., // user_id is mandatory\n // email: ...,\n // [...]\n // };\n // callback(null, profile);\n // 2. The user's credentials are invalid\n // callback(new WrongUsernameOrPasswordError(email, \"my error message\"));\n // 3. Something went wrong while trying to reach your database\n // callback(new Error(\"my error message\"));\n //\n // A list of Node.js modules which can be referenced is available here:\n //\n // https://tehsis.github.io/webtaskio-canirequire/\n console.log('AYYYYYE');\n\n const msg =\n 'Please implement the Login script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "create": "function create(user, callback) {\n // This script should create a user entry in your existing database. It will\n // be executed when a user attempts to sign up, or when a user is created\n // through the Auth0 dashboard or API.\n // When this script has finished executing, the Login script will be\n // executed immediately afterwards, to verify that the user was created\n // successfully.\n //\n // The user object will always contain the following properties:\n // * email: the user's email\n // * password: the password entered by the user, in plain text\n // * tenant: the name of this Auth0 account\n // * client_id: the client ID of the application where the user signed up, or\n // API key if created through the API or Auth0 dashboard\n // * connection: the name of this database connection\n //\n // There are three ways this script can finish:\n // 1. A user was successfully created\n // callback(null);\n // 2. This user already exists in your database\n // callback(new ValidationError(\"user_exists\", \"my error message\"));\n // 3. Something went wrong while trying to reach your database\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Create script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "delete": "function remove(id, callback) {\n // This script remove a user from your existing database.\n // It is executed whenever a user is deleted from the API or Auth0 dashboard.\n //\n // There are two ways that this script can finish:\n // 1. The user was removed successfully:\n // callback(null);\n // 2. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Delete script for this database ' +\n 'connection at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "verify": "function verify(email, callback) {\n // This script should mark the current user's email address as verified in\n // your database.\n // It is executed whenever a user clicks the verification link sent by email.\n // These emails can be customized at https://manage.auth0.com/#/emails.\n // It is safe to assume that the user's email already exists in your database,\n // because verification emails, if enabled, are sent immediately after a\n // successful signup.\n //\n // There are two ways that this script can finish:\n // 1. The user's email was verified successfully\n // callback(null, true);\n // 2. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n //\n // If an error is returned, it will be passed to the query string of the page\n // where the user is being redirected to after clicking the verification link.\n // For example, returning `callback(new Error(\"error\"))` and redirecting to\n // https://example.com would redirect to the following URL:\n // https://example.com?email=alice%40example.com&message=error&success=false\n\n const msg =\n 'Please implement the Verify script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "get_user": "function getByEmail(email, callback) {\n // This script should retrieve a user profile from your existing database,\n // without authenticating the user.\n // It is used to check if a user exists before executing flows that do not\n // require authentication (signup and password reset).\n //\n // There are three ways this script can finish:\n // 1. A user was successfully found. The profile should be in the following\n // format: https://auth0.com/docs/users/normalized/auth0/normalized-user-profile-schema.\n // callback(null, profile);\n // 2. A user was not found\n // callback(null);\n // 3. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Get User script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "change_password": "function changePassword(email, newPassword, callback) {\n // This script should change the password stored for the current user in your\n // database. It is executed when the user clicks on the confirmation link\n // after a reset password request.\n // The content and behavior of password confirmation emails can be customized\n // here: https://manage.auth0.com/#/emails\n // The `newPassword` parameter of this function is in plain text. It must be\n // hashed/salted to match whatever is stored in your database.\n //\n // There are three ways that this script can finish:\n // 1. The user's password was updated successfully:\n // callback(null, true);\n // 2. The user's password was not updated:\n // callback(null, false);\n // 3. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n //\n // If an error is returned, it will be passed to the query string of the page\n // where the user is being redirected to after clicking the confirmation link.\n // For example, returning `callback(new Error(\"error\"))` and redirecting to\n // https://example.com would redirect to the following URL:\n // https://example.com?email=alice%40example.com&message=error&success=false\n\n const msg =\n 'Please implement the Change Password script for this database ' +\n 'connection at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n" - }, - "disable_signup": false, - "passwordPolicy": "low", - "passkey_options": { - "challenge_ui": "both", - "local_enrollment_enabled": true, - "progressive_enrollment_enabled": true - }, - "password_history": { - "size": 5, - "enable": false - }, - "strategy_version": 2, - "requires_username": true, - "password_dictionary": { - "enable": true, - "dictionary": [] - }, - "authentication_methods": { - "passkey": { - "enabled": false - }, - "password": { - "enabled": true, - "api_behavior": "required" - } - }, - "brute_force_protection": true, - "password_no_personal_info": { - "enable": true - }, - "password_complexity_options": { - "min_length": 8 - }, - "enabledDatabaseCustomization": true - }, - "strategy": "auth0", - "name": "boo-baz-db-connection-test", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "boo-baz-db-connection-test" - ], - "enabled_clients": [ - "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1", - "QwKFSZ87TYF89lXp66sVFpGzYGQ07OU6" - ] + "client_id": "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU" }, { - "id": "con_URfc5OIXMzEJtZaz", - "options": { - "email": true, - "scope": [ - "email", - "profile" - ], - "profile": true - }, - "strategy": "google-oauth2", - "name": "google-oauth2", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "google-oauth2" - ], - "enabled_clients": [ - "xYOv2UsoAuKptIEAjkeB62Oaeg1Jn2QX", - "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1" - ] + "client_id": "ahrUt7DkBom8m2EAs0zLSccaylYIuVfF" + } + ] + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/connections/con_lfhXlIY73LFJlMks/clients?take=50", + "body": "", + "status": 200, + "response": { + "clients": [ + { + "client_id": "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU" }, { - "id": "con_Ty3Nbl0J1Ddxat41", - "options": { - "mfa": { - "active": true, - "return_enroll_settings": true - }, - "passwordPolicy": "good", - "passkey_options": { - "challenge_ui": "both", - "local_enrollment_enabled": true, - "progressive_enrollment_enabled": true - }, - "strategy_version": 2, - "authentication_methods": { - "passkey": { - "enabled": false - }, - "password": { - "enabled": true, - "api_behavior": "required" - } - }, - "brute_force_protection": true - }, - "strategy": "auth0", - "name": "Username-Password-Authentication", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "Username-Password-Authentication" - ], - "enabled_clients": [ - "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", - "cLFFGtjp2Xe7HWQCHfCtQxmURfSu1lDH" - ] + "client_id": "ahrUt7DkBom8m2EAs0zLSccaylYIuVfF" } ] }, @@ -13022,176 +12392,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections?include_totals=true&take=50", - "body": "", - "status": 200, - "response": { - "connections": [ - { - "id": "con_fuBNFcmY8aL3HDBT", - "options": { - "mfa": { - "active": true, - "return_enroll_settings": true - }, - "import_mode": false, - "customScripts": { - "login": "function login(email, password, callback) {\n // This script should authenticate a user against the credentials stored in\n // your database.\n // It is executed when a user attempts to log in or immediately after signing\n // up (as a verification that the user was successfully signed up).\n //\n // Everything returned by this script will be set as part of the user profile\n // and will be visible by any of the tenant admins. Avoid adding attributes\n // with values such as passwords, keys, secrets, etc.\n //\n // The `password` parameter of this function is in plain text. It must be\n // hashed/salted to match whatever is stored in your database. For example:\n //\n // var bcrypt = require('bcrypt@0.8.5');\n // bcrypt.compare(password, dbPasswordHash, function(err, res)) { ... }\n //\n // There are three ways this script can finish:\n // 1. The user's credentials are valid. The returned user profile should be in\n // the following format: https://auth0.com/docs/users/normalized/auth0/normalized-user-profile-schema\n // var profile = {\n // user_id: ..., // user_id is mandatory\n // email: ...,\n // [...]\n // };\n // callback(null, profile);\n // 2. The user's credentials are invalid\n // callback(new WrongUsernameOrPasswordError(email, \"my error message\"));\n // 3. Something went wrong while trying to reach your database\n // callback(new Error(\"my error message\"));\n //\n // A list of Node.js modules which can be referenced is available here:\n //\n // https://tehsis.github.io/webtaskio-canirequire/\n console.log('AYYYYYE');\n\n const msg =\n 'Please implement the Login script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "create": "function create(user, callback) {\n // This script should create a user entry in your existing database. It will\n // be executed when a user attempts to sign up, or when a user is created\n // through the Auth0 dashboard or API.\n // When this script has finished executing, the Login script will be\n // executed immediately afterwards, to verify that the user was created\n // successfully.\n //\n // The user object will always contain the following properties:\n // * email: the user's email\n // * password: the password entered by the user, in plain text\n // * tenant: the name of this Auth0 account\n // * client_id: the client ID of the application where the user signed up, or\n // API key if created through the API or Auth0 dashboard\n // * connection: the name of this database connection\n //\n // There are three ways this script can finish:\n // 1. A user was successfully created\n // callback(null);\n // 2. This user already exists in your database\n // callback(new ValidationError(\"user_exists\", \"my error message\"));\n // 3. Something went wrong while trying to reach your database\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Create script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "delete": "function remove(id, callback) {\n // This script remove a user from your existing database.\n // It is executed whenever a user is deleted from the API or Auth0 dashboard.\n //\n // There are two ways that this script can finish:\n // 1. The user was removed successfully:\n // callback(null);\n // 2. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Delete script for this database ' +\n 'connection at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "verify": "function verify(email, callback) {\n // This script should mark the current user's email address as verified in\n // your database.\n // It is executed whenever a user clicks the verification link sent by email.\n // These emails can be customized at https://manage.auth0.com/#/emails.\n // It is safe to assume that the user's email already exists in your database,\n // because verification emails, if enabled, are sent immediately after a\n // successful signup.\n //\n // There are two ways that this script can finish:\n // 1. The user's email was verified successfully\n // callback(null, true);\n // 2. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n //\n // If an error is returned, it will be passed to the query string of the page\n // where the user is being redirected to after clicking the verification link.\n // For example, returning `callback(new Error(\"error\"))` and redirecting to\n // https://example.com would redirect to the following URL:\n // https://example.com?email=alice%40example.com&message=error&success=false\n\n const msg =\n 'Please implement the Verify script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "get_user": "function getByEmail(email, callback) {\n // This script should retrieve a user profile from your existing database,\n // without authenticating the user.\n // It is used to check if a user exists before executing flows that do not\n // require authentication (signup and password reset).\n //\n // There are three ways this script can finish:\n // 1. A user was successfully found. The profile should be in the following\n // format: https://auth0.com/docs/users/normalized/auth0/normalized-user-profile-schema.\n // callback(null, profile);\n // 2. A user was not found\n // callback(null);\n // 3. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Get User script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "change_password": "function changePassword(email, newPassword, callback) {\n // This script should change the password stored for the current user in your\n // database. It is executed when the user clicks on the confirmation link\n // after a reset password request.\n // The content and behavior of password confirmation emails can be customized\n // here: https://manage.auth0.com/#/emails\n // The `newPassword` parameter of this function is in plain text. It must be\n // hashed/salted to match whatever is stored in your database.\n //\n // There are three ways that this script can finish:\n // 1. The user's password was updated successfully:\n // callback(null, true);\n // 2. The user's password was not updated:\n // callback(null, false);\n // 3. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n //\n // If an error is returned, it will be passed to the query string of the page\n // where the user is being redirected to after clicking the confirmation link.\n // For example, returning `callback(new Error(\"error\"))` and redirecting to\n // https://example.com would redirect to the following URL:\n // https://example.com?email=alice%40example.com&message=error&success=false\n\n const msg =\n 'Please implement the Change Password script for this database ' +\n 'connection at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n" - }, - "disable_signup": false, - "passwordPolicy": "low", - "passkey_options": { - "challenge_ui": "both", - "local_enrollment_enabled": true, - "progressive_enrollment_enabled": true - }, - "password_history": { - "size": 5, - "enable": false - }, - "strategy_version": 2, - "requires_username": true, - "password_dictionary": { - "enable": true, - "dictionary": [] - }, - "authentication_methods": { - "passkey": { - "enabled": false - }, - "password": { - "enabled": true, - "api_behavior": "required" - } - }, - "brute_force_protection": true, - "password_no_personal_info": { - "enable": true - }, - "password_complexity_options": { - "min_length": 8 - }, - "enabledDatabaseCustomization": true - }, - "strategy": "auth0", - "name": "boo-baz-db-connection-test", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "boo-baz-db-connection-test" - ], - "enabled_clients": [ - "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1", - "QwKFSZ87TYF89lXp66sVFpGzYGQ07OU6" - ] - }, - { - "id": "con_URfc5OIXMzEJtZaz", - "options": { - "email": true, - "scope": [ - "email", - "profile" - ], - "profile": true - }, - "strategy": "google-oauth2", - "name": "google-oauth2", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "google-oauth2" - ], - "enabled_clients": [ - "xYOv2UsoAuKptIEAjkeB62Oaeg1Jn2QX", - "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1" - ] - }, - { - "id": "con_Ty3Nbl0J1Ddxat41", - "options": { - "mfa": { - "active": true, - "return_enroll_settings": true - }, - "passwordPolicy": "good", - "passkey_options": { - "challenge_ui": "both", - "local_enrollment_enabled": true, - "progressive_enrollment_enabled": true - }, - "strategy_version": 2, - "authentication_methods": { - "passkey": { - "enabled": false - }, - "password": { - "enabled": true, - "api_behavior": "required" - } - }, - "brute_force_protection": true - }, - "strategy": "auth0", - "name": "Username-Password-Authentication", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "Username-Password-Authentication" - ], - "enabled_clients": [ - "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", - "cLFFGtjp2Xe7HWQCHfCtQxmURfSu1lDH" - ] - } - ] - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/connections/con_URfc5OIXMzEJtZaz/clients?take=50", - "body": "", - "status": 200, - "response": { - "clients": [ - { - "client_id": "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1" - }, - { - "client_id": "xYOv2UsoAuKptIEAjkeB62Oaeg1Jn2QX" - } - ] - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/emails/provider?fields=name%2Cenabled%2Ccredentials%2Csettings%2Cdefault_from_address&include_fields=true", + "path": "/api/v2/emails/provider?fields=name%2Cenabled%2Ccredentials%2Csettings%2Cdefault_from_address&include_fields=true", "body": "", "status": 200, "response": { @@ -13296,7 +12497,7 @@ "subject": "deprecated" } ], - "client_id": "cLFFGtjp2Xe7HWQCHfCtQxmURfSu1lDH", + "client_id": "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -13349,7 +12550,7 @@ "subject": "deprecated" } ], - "client_id": "uf1Ju9xwQ09AWpcnRnwD91W3Sv3bf76S", + "client_id": "0ltKN06qv5WnNoNz2Fu6QvyOl2o6K6nE", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -13394,7 +12595,7 @@ "subject": "deprecated" } ], - "client_id": "WYPQxuqDdeNZHLcJeuPq0AvuNFtMiUgU", + "client_id": "HC5UXDFP5lEc2vbTkPQWJ1yYeiLRkmDg", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -13448,7 +12649,7 @@ } ], "allowed_origins": [], - "client_id": "QwKFSZ87TYF89lXp66sVFpGzYGQ07OU6", + "client_id": "KjqnjAT6PWajvX3XKVkWhFVaW8sFBWyv", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -13494,7 +12695,7 @@ "subject": "deprecated" } ], - "client_id": "VvKPDeB2QHhtG4tVBNcrRUuChB0jWefu", + "client_id": "GH55Wtak9aTrj6tjRFObq1cqnu5a8mtM", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -13513,14 +12714,9 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "Test SPA", + "name": "The Default App", "allowed_clients": [], - "allowed_logout_urls": [ - "http://localhost:3000" - ], - "callbacks": [ - "http://localhost:3000" - ], + "callbacks": [], "client_metadata": {}, "is_first_party": true, "native_social_login": { @@ -13531,16 +12727,17 @@ "enabled": false } }, - "oidc_conformant": true, + "oidc_conformant": false, "refresh_token": { - "expiration_type": "expiring", + "expiration_type": "non-expiring", "leeway": 0, + "infinite_token_lifetime": true, + "infinite_idle_token_lifetime": true, "token_lifetime": 2592000, "idle_token_lifetime": 1296000, - "infinite_token_lifetime": false, - "infinite_idle_token_lifetime": false, - "rotation_type": "rotating" + "rotation_type": "non-rotating" }, + "sso": false, "sso_disabled": false, "cross_origin_authentication": false, "cross_origin_auth": false, @@ -13551,7 +12748,7 @@ "subject": "deprecated" } ], - "client_id": "xODbqyam7rjqHDsYKjU9Tuo99yaBnR5T", + "client_id": "ahrUt7DkBom8m2EAs0zLSccaylYIuVfF", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -13560,15 +12757,12 @@ "secret_encoded": false }, "client_aliases": [], - "token_endpoint_auth_method": "none", - "app_type": "spa", + "token_endpoint_auth_method": "client_secret_post", "grant_types": [ "authorization_code", "implicit", - "refresh_token" - ], - "web_origins": [ - "http://localhost:3000" + "refresh_token", + "client_credentials" ], "custom_login_page_on": true }, @@ -13576,9 +12770,14 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "auth0-deploy-cli-extension", + "name": "Test SPA", "allowed_clients": [], - "callbacks": [], + "allowed_logout_urls": [ + "http://localhost:3000" + ], + "callbacks": [ + "http://localhost:3000" + ], "client_metadata": {}, "is_first_party": true, "native_social_login": { @@ -13591,13 +12790,13 @@ }, "oidc_conformant": true, "refresh_token": { - "expiration_type": "non-expiring", + "expiration_type": "expiring", "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" + "token_lifetime": 2592000, + "idle_token_lifetime": 1296000, + "infinite_token_lifetime": false, + "infinite_idle_token_lifetime": false, + "rotation_type": "rotating" }, "sso_disabled": false, "cross_origin_authentication": false, @@ -13609,7 +12808,7 @@ "subject": "deprecated" } ], - "client_id": "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1", + "client_id": "68Ty4a89yPogS0UGdX8aYaS6td9DXYjs", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -13618,10 +12817,15 @@ "secret_encoded": false }, "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", + "token_endpoint_auth_method": "none", + "app_type": "spa", "grant_types": [ - "client_credentials" + "authorization_code", + "implicit", + "refresh_token" + ], + "web_origins": [ + "http://localhost:3000" ], "custom_login_page_on": true }, @@ -13629,7 +12833,7 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "The Default App", + "name": "auth0-deploy-cli-extension", "allowed_clients": [], "callbacks": [], "client_metadata": {}, @@ -13642,17 +12846,16 @@ "enabled": false } }, - "oidc_conformant": false, + "oidc_conformant": true, "refresh_token": { "expiration_type": "non-expiring", "leeway": 0, "infinite_token_lifetime": true, "infinite_idle_token_lifetime": true, - "token_lifetime": 2592000, - "idle_token_lifetime": 1296000, + "token_lifetime": 31557600, + "idle_token_lifetime": 2592000, "rotation_type": "non-rotating" }, - "sso": false, "sso_disabled": false, "cross_origin_authentication": false, "cross_origin_auth": false, @@ -13663,7 +12866,7 @@ "subject": "deprecated" } ], - "client_id": "xYOv2UsoAuKptIEAjkeB62Oaeg1Jn2QX", + "client_id": "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -13673,10 +12876,8 @@ }, "client_aliases": [], "token_endpoint_auth_method": "client_secret_post", + "app_type": "non_interactive", "grant_types": [ - "authorization_code", - "implicit", - "refresh_token", "client_credentials" ], "custom_login_page_on": true @@ -13726,17 +12927,14 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/client-grants?per_page=100&page=0&include_totals=true", + "path": "/api/v2/client-grants?take=50", "body": "", "status": 200, "response": { - "total": 3, - "start": 0, - "limit": 100, "client_grants": [ { - "id": "cgr_X9WoUpI87FLuMfUp", - "client_id": "VvKPDeB2QHhtG4tVBNcrRUuChB0jWefu", + "id": "cgr_S92D2BBPB2wQXFYC", + "client_id": "GH55Wtak9aTrj6tjRFObq1cqnu5a8mtM", "audience": "https://auth0-deploy-cli-e2e.us.auth0.com/api/v2/", "scope": [ "read:client_grants", @@ -13873,8 +13071,8 @@ "subject_type": "client" }, { - "id": "cgr_pbwejzhwoujrsNE8", - "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", + "id": "cgr_UQhGxDPGii0tSQcs", + "client_id": "0ltKN06qv5WnNoNz2Fu6QvyOl2o6K6nE", "audience": "https://auth0-deploy-cli-e2e.us.auth0.com/api/v2/", "scope": [ "read:client_grants", @@ -13901,10 +13099,6 @@ "update:client_keys", "delete:client_keys", "create:client_keys", - "read:client_credentials", - "update:client_credentials", - "delete:client_credentials", - "create:client_credentials", "read:connections", "update:connections", "delete:connections", @@ -13994,19 +13188,10 @@ "read:entitlements", "read:attack_protection", "update:attack_protection", - "read:organizations_summary", - "create:authentication_methods", - "read:authentication_methods", - "update:authentication_methods", - "delete:authentication_methods", "read:organizations", "update:organizations", "create:organizations", "delete:organizations", - "read:organization_discovery_domains", - "update:organization_discovery_domains", - "create:organization_discovery_domains", - "delete:organization_discovery_domains", "create:organization_members", "read:organization_members", "delete:organization_members", @@ -14019,97 +13204,13 @@ "delete:organization_member_roles", "create:organization_invitations", "read:organization_invitations", - "delete:organization_invitations", - "read:scim_config", - "create:scim_config", - "update:scim_config", - "delete:scim_config", - "create:scim_token", - "read:scim_token", - "delete:scim_token", - "delete:phone_providers", - "create:phone_providers", - "read:phone_providers", - "update:phone_providers", - "delete:phone_templates", - "create:phone_templates", - "read:phone_templates", - "update:phone_templates", - "create:encryption_keys", - "read:encryption_keys", - "update:encryption_keys", - "delete:encryption_keys", - "read:sessions", - "update:sessions", - "delete:sessions", - "read:refresh_tokens", - "delete:refresh_tokens", - "create:self_service_profiles", - "read:self_service_profiles", - "update:self_service_profiles", - "delete:self_service_profiles", - "create:sso_access_tickets", - "delete:sso_access_tickets", - "read:forms", - "update:forms", - "delete:forms", - "create:forms", - "read:flows", - "update:flows", - "delete:flows", - "create:flows", - "read:flows_vault", - "read:flows_vault_connections", - "update:flows_vault_connections", - "delete:flows_vault_connections", - "create:flows_vault_connections", - "read:flows_executions", - "delete:flows_executions", - "read:connections_options", - "update:connections_options", - "read:self_service_profile_custom_texts", - "update:self_service_profile_custom_texts", - "create:network_acls", - "update:network_acls", - "read:network_acls", - "delete:network_acls", - "delete:vdcs_templates", - "read:vdcs_templates", - "create:vdcs_templates", - "update:vdcs_templates", - "create:custom_signing_keys", - "read:custom_signing_keys", - "update:custom_signing_keys", - "delete:custom_signing_keys", - "read:federated_connections_tokens", - "delete:federated_connections_tokens", - "create:user_attribute_profiles", - "read:user_attribute_profiles", - "update:user_attribute_profiles", - "delete:user_attribute_profiles", - "read:event_streams", - "create:event_streams", - "delete:event_streams", - "update:event_streams", - "read:event_deliveries", - "update:event_deliveries", - "create:connection_profiles", - "read:connection_profiles", - "update:connection_profiles", - "delete:connection_profiles", - "read:organization_client_grants", - "create:organization_client_grants", - "delete:organization_client_grants", - "read:security_metrics", - "read:connections_keys", - "update:connections_keys", - "create:connections_keys" + "delete:organization_invitations" ], "subject_type": "client" }, { - "id": "cgr_s9W4N1r5PKXB4V8l", - "client_id": "uf1Ju9xwQ09AWpcnRnwD91W3Sv3bf76S", + "id": "cgr_pbwejzhwoujrsNE8", + "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", "audience": "https://auth0-deploy-cli-e2e.us.auth0.com/api/v2/", "scope": [ "read:client_grants", @@ -14136,6 +13237,10 @@ "update:client_keys", "delete:client_keys", "create:client_keys", + "read:client_credentials", + "update:client_credentials", + "delete:client_credentials", + "create:client_credentials", "read:connections", "update:connections", "delete:connections", @@ -14225,10 +13330,19 @@ "read:entitlements", "read:attack_protection", "update:attack_protection", + "read:organizations_summary", + "create:authentication_methods", + "read:authentication_methods", + "update:authentication_methods", + "delete:authentication_methods", "read:organizations", "update:organizations", "create:organizations", "delete:organizations", + "read:organization_discovery_domains", + "update:organization_discovery_domains", + "create:organization_discovery_domains", + "delete:organization_discovery_domains", "create:organization_members", "read:organization_members", "delete:organization_members", @@ -14241,7 +13355,91 @@ "delete:organization_member_roles", "create:organization_invitations", "read:organization_invitations", - "delete:organization_invitations" + "delete:organization_invitations", + "read:scim_config", + "create:scim_config", + "update:scim_config", + "delete:scim_config", + "create:scim_token", + "read:scim_token", + "delete:scim_token", + "delete:phone_providers", + "create:phone_providers", + "read:phone_providers", + "update:phone_providers", + "delete:phone_templates", + "create:phone_templates", + "read:phone_templates", + "update:phone_templates", + "create:encryption_keys", + "read:encryption_keys", + "update:encryption_keys", + "delete:encryption_keys", + "read:sessions", + "update:sessions", + "delete:sessions", + "read:refresh_tokens", + "delete:refresh_tokens", + "create:self_service_profiles", + "read:self_service_profiles", + "update:self_service_profiles", + "delete:self_service_profiles", + "create:sso_access_tickets", + "delete:sso_access_tickets", + "read:forms", + "update:forms", + "delete:forms", + "create:forms", + "read:flows", + "update:flows", + "delete:flows", + "create:flows", + "read:flows_vault", + "read:flows_vault_connections", + "update:flows_vault_connections", + "delete:flows_vault_connections", + "create:flows_vault_connections", + "read:flows_executions", + "delete:flows_executions", + "read:connections_options", + "update:connections_options", + "read:self_service_profile_custom_texts", + "update:self_service_profile_custom_texts", + "create:network_acls", + "update:network_acls", + "read:network_acls", + "delete:network_acls", + "delete:vdcs_templates", + "read:vdcs_templates", + "create:vdcs_templates", + "update:vdcs_templates", + "create:custom_signing_keys", + "read:custom_signing_keys", + "update:custom_signing_keys", + "delete:custom_signing_keys", + "read:federated_connections_tokens", + "delete:federated_connections_tokens", + "create:user_attribute_profiles", + "read:user_attribute_profiles", + "update:user_attribute_profiles", + "delete:user_attribute_profiles", + "read:event_streams", + "create:event_streams", + "delete:event_streams", + "update:event_streams", + "read:event_deliveries", + "update:event_deliveries", + "create:connection_profiles", + "read:connection_profiles", + "update:connection_profiles", + "delete:connection_profiles", + "read:organization_client_grants", + "create:organization_client_grants", + "delete:organization_client_grants", + "read:security_metrics", + "read:connections_keys", + "update:connections_keys", + "create:connections_keys" ], "subject_type": "client" } @@ -14259,22 +13457,22 @@ "response": { "roles": [ { - "id": "rol_fYWtGL9q5Foq7oJD", + "id": "rol_nvXgdsT2ksrlrQpN", "name": "Admin", "description": "Can read and write things" }, { - "id": "rol_iHF8WkcFPvQFJlvd", + "id": "rol_DW7eDROpAD03JEhC", "name": "Reader", "description": "Can only read things" }, { - "id": "rol_AHn82p4ofrvBg4g5", + "id": "rol_TDHVhZp26Ti7nQt2", "name": "read_only", "description": "Read Only" }, { - "id": "rol_J3tWLDMM6zuxlUiT", + "id": "rol_6uNKN3FdNBPgcRFM", "name": "read_osnly", "description": "Readz Only" } @@ -14289,7 +13487,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/roles/rol_fYWtGL9q5Foq7oJD/permissions?per_page=100&page=0&include_totals=true", + "path": "/api/v2/roles/rol_nvXgdsT2ksrlrQpN/permissions?per_page=100&page=0&include_totals=true", "body": "", "status": 200, "response": { @@ -14304,7 +13502,22 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/roles/rol_iHF8WkcFPvQFJlvd/permissions?per_page=100&page=0&include_totals=true", + "path": "/api/v2/roles/rol_nvXgdsT2ksrlrQpN/permissions?per_page=100&page=1&include_totals=true", + "body": "", + "status": 200, + "response": { + "permissions": [], + "start": 100, + "limit": 100, + "total": 0 + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/roles/rol_DW7eDROpAD03JEhC/permissions?per_page=100&page=0&include_totals=true", "body": "", "status": 200, "response": { @@ -14319,7 +13532,22 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/roles/rol_AHn82p4ofrvBg4g5/permissions?per_page=100&page=0&include_totals=true", + "path": "/api/v2/roles/rol_DW7eDROpAD03JEhC/permissions?per_page=100&page=1&include_totals=true", + "body": "", + "status": 200, + "response": { + "permissions": [], + "start": 100, + "limit": 100, + "total": 0 + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/roles/rol_TDHVhZp26Ti7nQt2/permissions?per_page=100&page=0&include_totals=true", "body": "", "status": 200, "response": { @@ -14334,7 +13562,22 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/roles/rol_J3tWLDMM6zuxlUiT/permissions?per_page=100&page=0&include_totals=true", + "path": "/api/v2/roles/rol_TDHVhZp26Ti7nQt2/permissions?per_page=100&page=1&include_totals=true", + "body": "", + "status": 200, + "response": { + "permissions": [], + "start": 100, + "limit": 100, + "total": 0 + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/roles/rol_6uNKN3FdNBPgcRFM/permissions?per_page=100&page=0&include_totals=true", "body": "", "status": 200, "response": { @@ -14349,13 +13592,33 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/organizations?include_totals=true", + "path": "/api/v2/roles/rol_6uNKN3FdNBPgcRFM/permissions?per_page=100&page=1&include_totals=true", + "body": "", + "status": 200, + "response": { + "permissions": [], + "start": 100, + "limit": 100, + "total": 0 + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/organizations?take=50", "body": "", "status": 200, "response": { "organizations": [ { - "id": "org_nSblOG7yUuWAHLOG", + "id": "org_rupfjUkVVvnPPk1y", + "name": "org2", + "display_name": "Organization2" + }, + { + "id": "org_YQGLuGuqRYrilmSQ", "name": "org1", "display_name": "Organization", "branding": { @@ -14364,16 +13627,8 @@ "primary": "#57ddff" } } - }, - { - "id": "org_vhEUeSlhgjQLTFPE", - "name": "org2", - "display_name": "Organization2" } - ], - "start": 0, - "limit": 50, - "total": 2 + ] }, "rawHeaders": [], "responseIsBinary": false @@ -14471,7 +13726,7 @@ "subject": "deprecated" } ], - "client_id": "cLFFGtjp2Xe7HWQCHfCtQxmURfSu1lDH", + "client_id": "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -14524,7 +13779,7 @@ "subject": "deprecated" } ], - "client_id": "uf1Ju9xwQ09AWpcnRnwD91W3Sv3bf76S", + "client_id": "0ltKN06qv5WnNoNz2Fu6QvyOl2o6K6nE", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -14569,7 +13824,7 @@ "subject": "deprecated" } ], - "client_id": "WYPQxuqDdeNZHLcJeuPq0AvuNFtMiUgU", + "client_id": "HC5UXDFP5lEc2vbTkPQWJ1yYeiLRkmDg", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -14623,7 +13878,7 @@ } ], "allowed_origins": [], - "client_id": "QwKFSZ87TYF89lXp66sVFpGzYGQ07OU6", + "client_id": "KjqnjAT6PWajvX3XKVkWhFVaW8sFBWyv", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -14669,7 +13924,7 @@ "subject": "deprecated" } ], - "client_id": "VvKPDeB2QHhtG4tVBNcrRUuChB0jWefu", + "client_id": "GH55Wtak9aTrj6tjRFObq1cqnu5a8mtM", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -14688,14 +13943,9 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "Test SPA", + "name": "The Default App", "allowed_clients": [], - "allowed_logout_urls": [ - "http://localhost:3000" - ], - "callbacks": [ - "http://localhost:3000" - ], + "callbacks": [], "client_metadata": {}, "is_first_party": true, "native_social_login": { @@ -14706,16 +13956,17 @@ "enabled": false } }, - "oidc_conformant": true, + "oidc_conformant": false, "refresh_token": { - "expiration_type": "expiring", + "expiration_type": "non-expiring", "leeway": 0, + "infinite_token_lifetime": true, + "infinite_idle_token_lifetime": true, "token_lifetime": 2592000, "idle_token_lifetime": 1296000, - "infinite_token_lifetime": false, - "infinite_idle_token_lifetime": false, - "rotation_type": "rotating" + "rotation_type": "non-rotating" }, + "sso": false, "sso_disabled": false, "cross_origin_authentication": false, "cross_origin_auth": false, @@ -14726,7 +13977,7 @@ "subject": "deprecated" } ], - "client_id": "xODbqyam7rjqHDsYKjU9Tuo99yaBnR5T", + "client_id": "ahrUt7DkBom8m2EAs0zLSccaylYIuVfF", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -14735,15 +13986,12 @@ "secret_encoded": false }, "client_aliases": [], - "token_endpoint_auth_method": "none", - "app_type": "spa", + "token_endpoint_auth_method": "client_secret_post", "grant_types": [ "authorization_code", "implicit", - "refresh_token" - ], - "web_origins": [ - "http://localhost:3000" + "refresh_token", + "client_credentials" ], "custom_login_page_on": true }, @@ -14751,9 +13999,14 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "auth0-deploy-cli-extension", + "name": "Test SPA", "allowed_clients": [], - "callbacks": [], + "allowed_logout_urls": [ + "http://localhost:3000" + ], + "callbacks": [ + "http://localhost:3000" + ], "client_metadata": {}, "is_first_party": true, "native_social_login": { @@ -14766,13 +14019,13 @@ }, "oidc_conformant": true, "refresh_token": { - "expiration_type": "non-expiring", + "expiration_type": "expiring", "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" + "token_lifetime": 2592000, + "idle_token_lifetime": 1296000, + "infinite_token_lifetime": false, + "infinite_idle_token_lifetime": false, + "rotation_type": "rotating" }, "sso_disabled": false, "cross_origin_authentication": false, @@ -14784,7 +14037,7 @@ "subject": "deprecated" } ], - "client_id": "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1", + "client_id": "68Ty4a89yPogS0UGdX8aYaS6td9DXYjs", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -14793,10 +14046,15 @@ "secret_encoded": false }, "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", + "token_endpoint_auth_method": "none", + "app_type": "spa", "grant_types": [ - "client_credentials" + "authorization_code", + "implicit", + "refresh_token" + ], + "web_origins": [ + "http://localhost:3000" ], "custom_login_page_on": true }, @@ -14804,7 +14062,7 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "The Default App", + "name": "auth0-deploy-cli-extension", "allowed_clients": [], "callbacks": [], "client_metadata": {}, @@ -14817,17 +14075,16 @@ "enabled": false } }, - "oidc_conformant": false, + "oidc_conformant": true, "refresh_token": { "expiration_type": "non-expiring", "leeway": 0, "infinite_token_lifetime": true, "infinite_idle_token_lifetime": true, - "token_lifetime": 2592000, - "idle_token_lifetime": 1296000, + "token_lifetime": 31557600, + "idle_token_lifetime": 2592000, "rotation_type": "non-rotating" }, - "sso": false, "sso_disabled": false, "cross_origin_authentication": false, "cross_origin_auth": false, @@ -14838,7 +14095,7 @@ "subject": "deprecated" } ], - "client_id": "xYOv2UsoAuKptIEAjkeB62Oaeg1Jn2QX", + "client_id": "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -14848,10 +14105,8 @@ }, "client_aliases": [], "token_endpoint_auth_method": "client_secret_post", + "app_type": "non_interactive", "grant_types": [ - "authorization_code", - "implicit", - "refresh_token", "client_credentials" ], "custom_login_page_on": true @@ -14901,28 +14156,14 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/organizations?include_totals=true&take=50", + "path": "/api/v2/organizations/org_rupfjUkVVvnPPk1y/enabled_connections?page=0&per_page=50&include_totals=true", "body": "", "status": 200, "response": { - "organizations": [ - { - "id": "org_nSblOG7yUuWAHLOG", - "name": "org1", - "display_name": "Organization", - "branding": { - "colors": { - "page_background": "#fff5f5", - "primary": "#57ddff" - } - } - }, - { - "id": "org_vhEUeSlhgjQLTFPE", - "name": "org2", - "display_name": "Organization2" - } - ] + "enabled_connections": [], + "start": 0, + "limit": 0, + "total": 0 }, "rawHeaders": [], "responseIsBinary": false @@ -14930,23 +14171,43 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/organizations/org_nSblOG7yUuWAHLOG/enabled_connections", + "path": "/api/v2/organizations/org_rupfjUkVVvnPPk1y/enabled_connections?page=1&per_page=50&include_totals=true", "body": "", "status": 200, - "response": [], + "response": { + "enabled_connections": [], + "start": 0, + "limit": 0, + "total": 0 + }, "rawHeaders": [], "responseIsBinary": false }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/organizations/org_nSblOG7yUuWAHLOG/client-grants?page=0&per_page=100&include_totals=true", + "path": "/api/v2/organizations/org_rupfjUkVVvnPPk1y/client-grants?page=0&per_page=50&include_totals=true", "body": "", "status": 200, "response": { "client_grants": [], "start": 0, - "limit": 100, + "limit": 50, + "total": 0 + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/organizations/org_rupfjUkVVvnPPk1y/client-grants?page=1&per_page=50&include_totals=true", + "body": "", + "status": 200, + "response": { + "client_grants": [], + "start": 50, + "limit": 50, "total": 0 }, "rawHeaders": [], @@ -14955,7 +14216,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/organizations/org_nSblOG7yUuWAHLOG/discovery-domains?take=50", + "path": "/api/v2/organizations/org_rupfjUkVVvnPPk1y/discovery-domains?take=50", "body": "", "status": 200, "response": { @@ -14967,23 +14228,25 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/organizations/org_vhEUeSlhgjQLTFPE/enabled_connections", + "path": "/api/v2/organizations/org_rupfjUkVVvnPPk1y/discovery-domains?take=50", "body": "", "status": 200, - "response": [], + "response": { + "domains": [] + }, "rawHeaders": [], "responseIsBinary": false }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/organizations/org_vhEUeSlhgjQLTFPE/client-grants?page=0&per_page=100&include_totals=true", + "path": "/api/v2/organizations/org_YQGLuGuqRYrilmSQ/enabled_connections?page=0&per_page=50&include_totals=true", "body": "", "status": 200, "response": { - "client_grants": [], + "enabled_connections": [], "start": 0, - "limit": 100, + "limit": 0, "total": 0 }, "rawHeaders": [], @@ -14992,11 +14255,14 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/organizations/org_vhEUeSlhgjQLTFPE/discovery-domains?take=50", + "path": "/api/v2/organizations/org_YQGLuGuqRYrilmSQ/enabled_connections?page=1&per_page=50&include_totals=true", "body": "", "status": 200, "response": { - "domains": [] + "enabled_connections": [], + "start": 0, + "limit": 0, + "total": 0 }, "rawHeaders": [], "responseIsBinary": false @@ -15004,152 +14270,53 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections?include_totals=true", + "path": "/api/v2/organizations/org_YQGLuGuqRYrilmSQ/client-grants?page=0&per_page=50&include_totals=true", "body": "", "status": 200, "response": { - "total": 3, + "client_grants": [], "start": 0, "limit": 50, - "connections": [ - { - "id": "con_fuBNFcmY8aL3HDBT", - "options": { - "mfa": { - "active": true, - "return_enroll_settings": true - }, - "import_mode": false, - "customScripts": { - "login": "function login(email, password, callback) {\n // This script should authenticate a user against the credentials stored in\n // your database.\n // It is executed when a user attempts to log in or immediately after signing\n // up (as a verification that the user was successfully signed up).\n //\n // Everything returned by this script will be set as part of the user profile\n // and will be visible by any of the tenant admins. Avoid adding attributes\n // with values such as passwords, keys, secrets, etc.\n //\n // The `password` parameter of this function is in plain text. It must be\n // hashed/salted to match whatever is stored in your database. For example:\n //\n // var bcrypt = require('bcrypt@0.8.5');\n // bcrypt.compare(password, dbPasswordHash, function(err, res)) { ... }\n //\n // There are three ways this script can finish:\n // 1. The user's credentials are valid. The returned user profile should be in\n // the following format: https://auth0.com/docs/users/normalized/auth0/normalized-user-profile-schema\n // var profile = {\n // user_id: ..., // user_id is mandatory\n // email: ...,\n // [...]\n // };\n // callback(null, profile);\n // 2. The user's credentials are invalid\n // callback(new WrongUsernameOrPasswordError(email, \"my error message\"));\n // 3. Something went wrong while trying to reach your database\n // callback(new Error(\"my error message\"));\n //\n // A list of Node.js modules which can be referenced is available here:\n //\n // https://tehsis.github.io/webtaskio-canirequire/\n console.log('AYYYYYE');\n\n const msg =\n 'Please implement the Login script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "create": "function create(user, callback) {\n // This script should create a user entry in your existing database. It will\n // be executed when a user attempts to sign up, or when a user is created\n // through the Auth0 dashboard or API.\n // When this script has finished executing, the Login script will be\n // executed immediately afterwards, to verify that the user was created\n // successfully.\n //\n // The user object will always contain the following properties:\n // * email: the user's email\n // * password: the password entered by the user, in plain text\n // * tenant: the name of this Auth0 account\n // * client_id: the client ID of the application where the user signed up, or\n // API key if created through the API or Auth0 dashboard\n // * connection: the name of this database connection\n //\n // There are three ways this script can finish:\n // 1. A user was successfully created\n // callback(null);\n // 2. This user already exists in your database\n // callback(new ValidationError(\"user_exists\", \"my error message\"));\n // 3. Something went wrong while trying to reach your database\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Create script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "delete": "function remove(id, callback) {\n // This script remove a user from your existing database.\n // It is executed whenever a user is deleted from the API or Auth0 dashboard.\n //\n // There are two ways that this script can finish:\n // 1. The user was removed successfully:\n // callback(null);\n // 2. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Delete script for this database ' +\n 'connection at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "verify": "function verify(email, callback) {\n // This script should mark the current user's email address as verified in\n // your database.\n // It is executed whenever a user clicks the verification link sent by email.\n // These emails can be customized at https://manage.auth0.com/#/emails.\n // It is safe to assume that the user's email already exists in your database,\n // because verification emails, if enabled, are sent immediately after a\n // successful signup.\n //\n // There are two ways that this script can finish:\n // 1. The user's email was verified successfully\n // callback(null, true);\n // 2. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n //\n // If an error is returned, it will be passed to the query string of the page\n // where the user is being redirected to after clicking the verification link.\n // For example, returning `callback(new Error(\"error\"))` and redirecting to\n // https://example.com would redirect to the following URL:\n // https://example.com?email=alice%40example.com&message=error&success=false\n\n const msg =\n 'Please implement the Verify script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "get_user": "function getByEmail(email, callback) {\n // This script should retrieve a user profile from your existing database,\n // without authenticating the user.\n // It is used to check if a user exists before executing flows that do not\n // require authentication (signup and password reset).\n //\n // There are three ways this script can finish:\n // 1. A user was successfully found. The profile should be in the following\n // format: https://auth0.com/docs/users/normalized/auth0/normalized-user-profile-schema.\n // callback(null, profile);\n // 2. A user was not found\n // callback(null);\n // 3. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Get User script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "change_password": "function changePassword(email, newPassword, callback) {\n // This script should change the password stored for the current user in your\n // database. It is executed when the user clicks on the confirmation link\n // after a reset password request.\n // The content and behavior of password confirmation emails can be customized\n // here: https://manage.auth0.com/#/emails\n // The `newPassword` parameter of this function is in plain text. It must be\n // hashed/salted to match whatever is stored in your database.\n //\n // There are three ways that this script can finish:\n // 1. The user's password was updated successfully:\n // callback(null, true);\n // 2. The user's password was not updated:\n // callback(null, false);\n // 3. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n //\n // If an error is returned, it will be passed to the query string of the page\n // where the user is being redirected to after clicking the confirmation link.\n // For example, returning `callback(new Error(\"error\"))` and redirecting to\n // https://example.com would redirect to the following URL:\n // https://example.com?email=alice%40example.com&message=error&success=false\n\n const msg =\n 'Please implement the Change Password script for this database ' +\n 'connection at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n" - }, - "disable_signup": false, - "passwordPolicy": "low", - "passkey_options": { - "challenge_ui": "both", - "local_enrollment_enabled": true, - "progressive_enrollment_enabled": true - }, - "password_history": { - "size": 5, - "enable": false - }, - "strategy_version": 2, - "requires_username": true, - "password_dictionary": { - "enable": true, - "dictionary": [] - }, - "authentication_methods": { - "passkey": { - "enabled": false - }, - "password": { - "enabled": true, - "api_behavior": "required" - } - }, - "brute_force_protection": true, - "password_no_personal_info": { - "enable": true - }, - "password_complexity_options": { - "min_length": 8 - }, - "enabledDatabaseCustomization": true - }, - "strategy": "auth0", - "name": "boo-baz-db-connection-test", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "boo-baz-db-connection-test" - ], - "enabled_clients": [ - "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1", - "QwKFSZ87TYF89lXp66sVFpGzYGQ07OU6" - ] - }, - { - "id": "con_URfc5OIXMzEJtZaz", - "options": { - "email": true, - "scope": [ - "email", - "profile" - ], - "profile": true - }, - "strategy": "google-oauth2", - "name": "google-oauth2", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "google-oauth2" - ], - "enabled_clients": [ - "xYOv2UsoAuKptIEAjkeB62Oaeg1Jn2QX", - "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1" - ] - }, - { - "id": "con_Ty3Nbl0J1Ddxat41", - "options": { - "mfa": { - "active": true, - "return_enroll_settings": true - }, - "passwordPolicy": "good", - "passkey_options": { - "challenge_ui": "both", - "local_enrollment_enabled": true, - "progressive_enrollment_enabled": true - }, - "strategy_version": 2, - "authentication_methods": { - "passkey": { - "enabled": false - }, - "password": { - "enabled": true, - "api_behavior": "required" - } - }, - "brute_force_protection": true - }, - "strategy": "auth0", - "name": "Username-Password-Authentication", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "Username-Password-Authentication" - ], - "enabled_clients": [ - "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", - "cLFFGtjp2Xe7HWQCHfCtQxmURfSu1lDH" - ] - } - ] + "total": 0 + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/organizations/org_YQGLuGuqRYrilmSQ/client-grants?page=1&per_page=50&include_totals=true", + "body": "", + "status": 200, + "response": { + "client_grants": [], + "start": 50, + "limit": 50, + "total": 0 + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/organizations/org_YQGLuGuqRYrilmSQ/discovery-domains?take=50", + "body": "", + "status": 200, + "response": { + "domains": [] + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/organizations/org_YQGLuGuqRYrilmSQ/discovery-domains?take=50", + "body": "", + "status": 200, + "response": { + "domains": [] }, "rawHeaders": [], "responseIsBinary": false @@ -15157,13 +14324,13 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections?include_totals=true&take=50", + "path": "/api/v2/connections?take=50", "body": "", "status": 200, "response": { "connections": [ { - "id": "con_fuBNFcmY8aL3HDBT", + "id": "con_cxSOS7uLgPojtLBh", "options": { "mfa": { "active": true, @@ -15226,12 +14393,12 @@ "boo-baz-db-connection-test" ], "enabled_clients": [ - "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1", - "QwKFSZ87TYF89lXp66sVFpGzYGQ07OU6" + "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU", + "KjqnjAT6PWajvX3XKVkWhFVaW8sFBWyv" ] }, { - "id": "con_URfc5OIXMzEJtZaz", + "id": "con_lfhXlIY73LFJlMks", "options": { "email": true, "scope": [ @@ -15253,12 +14420,12 @@ "google-oauth2" ], "enabled_clients": [ - "xYOv2UsoAuKptIEAjkeB62Oaeg1Jn2QX", - "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1" + "ahrUt7DkBom8m2EAs0zLSccaylYIuVfF", + "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU" ] }, { - "id": "con_Ty3Nbl0J1Ddxat41", + "id": "con_3R2lX4rln4ArocW5", "options": { "mfa": { "active": true, @@ -15296,7 +14463,7 @@ ], "enabled_clients": [ "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", - "cLFFGtjp2Xe7HWQCHfCtQxmURfSu1lDH" + "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" ] } ] @@ -15307,17 +14474,14 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/client-grants?per_page=100&page=0&include_totals=true", + "path": "/api/v2/client-grants?take=50", "body": "", "status": 200, "response": { - "total": 3, - "start": 0, - "limit": 100, "client_grants": [ { - "id": "cgr_X9WoUpI87FLuMfUp", - "client_id": "VvKPDeB2QHhtG4tVBNcrRUuChB0jWefu", + "id": "cgr_S92D2BBPB2wQXFYC", + "client_id": "GH55Wtak9aTrj6tjRFObq1cqnu5a8mtM", "audience": "https://auth0-deploy-cli-e2e.us.auth0.com/api/v2/", "scope": [ "read:client_grants", @@ -15454,8 +14618,8 @@ "subject_type": "client" }, { - "id": "cgr_pbwejzhwoujrsNE8", - "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", + "id": "cgr_UQhGxDPGii0tSQcs", + "client_id": "0ltKN06qv5WnNoNz2Fu6QvyOl2o6K6nE", "audience": "https://auth0-deploy-cli-e2e.us.auth0.com/api/v2/", "scope": [ "read:client_grants", @@ -15482,10 +14646,6 @@ "update:client_keys", "delete:client_keys", "create:client_keys", - "read:client_credentials", - "update:client_credentials", - "delete:client_credentials", - "create:client_credentials", "read:connections", "update:connections", "delete:connections", @@ -15575,19 +14735,10 @@ "read:entitlements", "read:attack_protection", "update:attack_protection", - "read:organizations_summary", - "create:authentication_methods", - "read:authentication_methods", - "update:authentication_methods", - "delete:authentication_methods", "read:organizations", "update:organizations", "create:organizations", "delete:organizations", - "read:organization_discovery_domains", - "update:organization_discovery_domains", - "create:organization_discovery_domains", - "delete:organization_discovery_domains", "create:organization_members", "read:organization_members", "delete:organization_members", @@ -15600,97 +14751,13 @@ "delete:organization_member_roles", "create:organization_invitations", "read:organization_invitations", - "delete:organization_invitations", - "read:scim_config", - "create:scim_config", - "update:scim_config", - "delete:scim_config", - "create:scim_token", - "read:scim_token", - "delete:scim_token", - "delete:phone_providers", - "create:phone_providers", - "read:phone_providers", - "update:phone_providers", - "delete:phone_templates", - "create:phone_templates", - "read:phone_templates", - "update:phone_templates", - "create:encryption_keys", - "read:encryption_keys", - "update:encryption_keys", - "delete:encryption_keys", - "read:sessions", - "update:sessions", - "delete:sessions", - "read:refresh_tokens", - "delete:refresh_tokens", - "create:self_service_profiles", - "read:self_service_profiles", - "update:self_service_profiles", - "delete:self_service_profiles", - "create:sso_access_tickets", - "delete:sso_access_tickets", - "read:forms", - "update:forms", - "delete:forms", - "create:forms", - "read:flows", - "update:flows", - "delete:flows", - "create:flows", - "read:flows_vault", - "read:flows_vault_connections", - "update:flows_vault_connections", - "delete:flows_vault_connections", - "create:flows_vault_connections", - "read:flows_executions", - "delete:flows_executions", - "read:connections_options", - "update:connections_options", - "read:self_service_profile_custom_texts", - "update:self_service_profile_custom_texts", - "create:network_acls", - "update:network_acls", - "read:network_acls", - "delete:network_acls", - "delete:vdcs_templates", - "read:vdcs_templates", - "create:vdcs_templates", - "update:vdcs_templates", - "create:custom_signing_keys", - "read:custom_signing_keys", - "update:custom_signing_keys", - "delete:custom_signing_keys", - "read:federated_connections_tokens", - "delete:federated_connections_tokens", - "create:user_attribute_profiles", - "read:user_attribute_profiles", - "update:user_attribute_profiles", - "delete:user_attribute_profiles", - "read:event_streams", - "create:event_streams", - "delete:event_streams", - "update:event_streams", - "read:event_deliveries", - "update:event_deliveries", - "create:connection_profiles", - "read:connection_profiles", - "update:connection_profiles", - "delete:connection_profiles", - "read:organization_client_grants", - "create:organization_client_grants", - "delete:organization_client_grants", - "read:security_metrics", - "read:connections_keys", - "update:connections_keys", - "create:connections_keys" + "delete:organization_invitations" ], "subject_type": "client" }, { - "id": "cgr_s9W4N1r5PKXB4V8l", - "client_id": "uf1Ju9xwQ09AWpcnRnwD91W3Sv3bf76S", + "id": "cgr_pbwejzhwoujrsNE8", + "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", "audience": "https://auth0-deploy-cli-e2e.us.auth0.com/api/v2/", "scope": [ "read:client_grants", @@ -15717,6 +14784,10 @@ "update:client_keys", "delete:client_keys", "create:client_keys", + "read:client_credentials", + "update:client_credentials", + "delete:client_credentials", + "create:client_credentials", "read:connections", "update:connections", "delete:connections", @@ -15806,10 +14877,19 @@ "read:entitlements", "read:attack_protection", "update:attack_protection", + "read:organizations_summary", + "create:authentication_methods", + "read:authentication_methods", + "update:authentication_methods", + "delete:authentication_methods", "read:organizations", "update:organizations", "create:organizations", "delete:organizations", + "read:organization_discovery_domains", + "update:organization_discovery_domains", + "create:organization_discovery_domains", + "delete:organization_discovery_domains", "create:organization_members", "read:organization_members", "delete:organization_members", @@ -15822,7 +14902,91 @@ "delete:organization_member_roles", "create:organization_invitations", "read:organization_invitations", - "delete:organization_invitations" + "delete:organization_invitations", + "read:scim_config", + "create:scim_config", + "update:scim_config", + "delete:scim_config", + "create:scim_token", + "read:scim_token", + "delete:scim_token", + "delete:phone_providers", + "create:phone_providers", + "read:phone_providers", + "update:phone_providers", + "delete:phone_templates", + "create:phone_templates", + "read:phone_templates", + "update:phone_templates", + "create:encryption_keys", + "read:encryption_keys", + "update:encryption_keys", + "delete:encryption_keys", + "read:sessions", + "update:sessions", + "delete:sessions", + "read:refresh_tokens", + "delete:refresh_tokens", + "create:self_service_profiles", + "read:self_service_profiles", + "update:self_service_profiles", + "delete:self_service_profiles", + "create:sso_access_tickets", + "delete:sso_access_tickets", + "read:forms", + "update:forms", + "delete:forms", + "create:forms", + "read:flows", + "update:flows", + "delete:flows", + "create:flows", + "read:flows_vault", + "read:flows_vault_connections", + "update:flows_vault_connections", + "delete:flows_vault_connections", + "create:flows_vault_connections", + "read:flows_executions", + "delete:flows_executions", + "read:connections_options", + "update:connections_options", + "read:self_service_profile_custom_texts", + "update:self_service_profile_custom_texts", + "create:network_acls", + "update:network_acls", + "read:network_acls", + "delete:network_acls", + "delete:vdcs_templates", + "read:vdcs_templates", + "create:vdcs_templates", + "update:vdcs_templates", + "create:custom_signing_keys", + "read:custom_signing_keys", + "update:custom_signing_keys", + "delete:custom_signing_keys", + "read:federated_connections_tokens", + "delete:federated_connections_tokens", + "create:user_attribute_profiles", + "read:user_attribute_profiles", + "update:user_attribute_profiles", + "delete:user_attribute_profiles", + "read:event_streams", + "create:event_streams", + "delete:event_streams", + "update:event_streams", + "read:event_deliveries", + "update:event_deliveries", + "create:connection_profiles", + "read:connection_profiles", + "update:connection_profiles", + "delete:connection_profiles", + "read:organization_client_grants", + "create:organization_client_grants", + "delete:organization_client_grants", + "read:security_metrics", + "read:connections_keys", + "update:connections_keys", + "create:connections_keys" ], "subject_type": "client" } @@ -15924,7 +15088,7 @@ "subject": "deprecated" } ], - "client_id": "cLFFGtjp2Xe7HWQCHfCtQxmURfSu1lDH", + "client_id": "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -15977,7 +15141,7 @@ "subject": "deprecated" } ], - "client_id": "uf1Ju9xwQ09AWpcnRnwD91W3Sv3bf76S", + "client_id": "0ltKN06qv5WnNoNz2Fu6QvyOl2o6K6nE", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -16022,7 +15186,7 @@ "subject": "deprecated" } ], - "client_id": "WYPQxuqDdeNZHLcJeuPq0AvuNFtMiUgU", + "client_id": "HC5UXDFP5lEc2vbTkPQWJ1yYeiLRkmDg", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -16076,7 +15240,7 @@ } ], "allowed_origins": [], - "client_id": "QwKFSZ87TYF89lXp66sVFpGzYGQ07OU6", + "client_id": "KjqnjAT6PWajvX3XKVkWhFVaW8sFBWyv", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -16122,7 +15286,7 @@ "subject": "deprecated" } ], - "client_id": "VvKPDeB2QHhtG4tVBNcrRUuChB0jWefu", + "client_id": "GH55Wtak9aTrj6tjRFObq1cqnu5a8mtM", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -16141,14 +15305,9 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "Test SPA", + "name": "The Default App", "allowed_clients": [], - "allowed_logout_urls": [ - "http://localhost:3000" - ], - "callbacks": [ - "http://localhost:3000" - ], + "callbacks": [], "client_metadata": {}, "is_first_party": true, "native_social_login": { @@ -16159,16 +15318,17 @@ "enabled": false } }, - "oidc_conformant": true, + "oidc_conformant": false, "refresh_token": { - "expiration_type": "expiring", + "expiration_type": "non-expiring", "leeway": 0, + "infinite_token_lifetime": true, + "infinite_idle_token_lifetime": true, "token_lifetime": 2592000, "idle_token_lifetime": 1296000, - "infinite_token_lifetime": false, - "infinite_idle_token_lifetime": false, - "rotation_type": "rotating" + "rotation_type": "non-rotating" }, + "sso": false, "sso_disabled": false, "cross_origin_authentication": false, "cross_origin_auth": false, @@ -16179,7 +15339,7 @@ "subject": "deprecated" } ], - "client_id": "xODbqyam7rjqHDsYKjU9Tuo99yaBnR5T", + "client_id": "ahrUt7DkBom8m2EAs0zLSccaylYIuVfF", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -16188,15 +15348,12 @@ "secret_encoded": false }, "client_aliases": [], - "token_endpoint_auth_method": "none", - "app_type": "spa", + "token_endpoint_auth_method": "client_secret_post", "grant_types": [ "authorization_code", "implicit", - "refresh_token" - ], - "web_origins": [ - "http://localhost:3000" + "refresh_token", + "client_credentials" ], "custom_login_page_on": true }, @@ -16204,9 +15361,14 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "auth0-deploy-cli-extension", + "name": "Test SPA", "allowed_clients": [], - "callbacks": [], + "allowed_logout_urls": [ + "http://localhost:3000" + ], + "callbacks": [ + "http://localhost:3000" + ], "client_metadata": {}, "is_first_party": true, "native_social_login": { @@ -16219,13 +15381,13 @@ }, "oidc_conformant": true, "refresh_token": { - "expiration_type": "non-expiring", + "expiration_type": "expiring", "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" + "token_lifetime": 2592000, + "idle_token_lifetime": 1296000, + "infinite_token_lifetime": false, + "infinite_idle_token_lifetime": false, + "rotation_type": "rotating" }, "sso_disabled": false, "cross_origin_authentication": false, @@ -16237,7 +15399,7 @@ "subject": "deprecated" } ], - "client_id": "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1", + "client_id": "68Ty4a89yPogS0UGdX8aYaS6td9DXYjs", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -16246,10 +15408,15 @@ "secret_encoded": false }, "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", + "token_endpoint_auth_method": "none", + "app_type": "spa", "grant_types": [ - "client_credentials" + "authorization_code", + "implicit", + "refresh_token" + ], + "web_origins": [ + "http://localhost:3000" ], "custom_login_page_on": true }, @@ -16257,7 +15424,7 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "The Default App", + "name": "auth0-deploy-cli-extension", "allowed_clients": [], "callbacks": [], "client_metadata": {}, @@ -16270,17 +15437,16 @@ "enabled": false } }, - "oidc_conformant": false, + "oidc_conformant": true, "refresh_token": { "expiration_type": "non-expiring", "leeway": 0, "infinite_token_lifetime": true, "infinite_idle_token_lifetime": true, - "token_lifetime": 2592000, - "idle_token_lifetime": 1296000, + "token_lifetime": 31557600, + "idle_token_lifetime": 2592000, "rotation_type": "non-rotating" }, - "sso": false, "sso_disabled": false, "cross_origin_authentication": false, "cross_origin_auth": false, @@ -16291,7 +15457,7 @@ "subject": "deprecated" } ], - "client_id": "xYOv2UsoAuKptIEAjkeB62Oaeg1Jn2QX", + "client_id": "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -16301,10 +15467,8 @@ }, "client_aliases": [], "token_endpoint_auth_method": "client_secret_post", + "app_type": "non_interactive", "grant_types": [ - "authorization_code", - "implicit", - "refresh_token", "client_credentials" ], "custom_login_page_on": true @@ -16359,7 +15523,7 @@ "status": 200, "response": [ { - "id": "lst_0000000000025415", + "id": "lst_0000000000025597", "name": "Suspended DD Log Stream", "type": "datadog", "status": "active", @@ -16370,14 +15534,14 @@ "isPriority": false }, { - "id": "lst_0000000000025416", + "id": "lst_0000000000025598", "name": "Amazon EventBridge", "type": "eventbridge", "status": "active", "sink": { "awsAccountId": "123456789012", "awsRegion": "us-east-2", - "awsPartnerEventSource": "aws.partner/auth0.com/auth0-deploy-cli-e2e-48aadbd2-ae4f-4553-9c92-75eebc8c63cd/auth0.logs" + "awsPartnerEventSource": "aws.partner/auth0.com/auth0-deploy-cli-e2e-7022a134-25ea-40c6-8164-cf25c35ee97d/auth0.logs" }, "filters": [ { @@ -17591,6 +16755,22 @@ "value": "delete:organization_client_grants", "description": "Delete Organization Client Grants" }, + { + "value": "create:token_exchange_profiles", + "description": "Create Token Exchange Profile" + }, + { + "value": "read:token_exchange_profiles", + "description": "Read Token Exchange Profiles" + }, + { + "value": "update:token_exchange_profiles", + "description": "Update Token Exchange Profile" + }, + { + "value": "delete:token_exchange_profiles", + "description": "Delete Token Exchange Profile" + }, { "value": "read:security_metrics", "description": "Read Security Metrics" @@ -17708,7 +16888,7 @@ "subject": "deprecated" } ], - "client_id": "cLFFGtjp2Xe7HWQCHfCtQxmURfSu1lDH", + "client_id": "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -17761,7 +16941,7 @@ "subject": "deprecated" } ], - "client_id": "uf1Ju9xwQ09AWpcnRnwD91W3Sv3bf76S", + "client_id": "0ltKN06qv5WnNoNz2Fu6QvyOl2o6K6nE", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -17806,7 +16986,7 @@ "subject": "deprecated" } ], - "client_id": "WYPQxuqDdeNZHLcJeuPq0AvuNFtMiUgU", + "client_id": "HC5UXDFP5lEc2vbTkPQWJ1yYeiLRkmDg", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -17860,7 +17040,7 @@ } ], "allowed_origins": [], - "client_id": "QwKFSZ87TYF89lXp66sVFpGzYGQ07OU6", + "client_id": "KjqnjAT6PWajvX3XKVkWhFVaW8sFBWyv", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -17906,7 +17086,7 @@ "subject": "deprecated" } ], - "client_id": "VvKPDeB2QHhtG4tVBNcrRUuChB0jWefu", + "client_id": "GH55Wtak9aTrj6tjRFObq1cqnu5a8mtM", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -17925,14 +17105,9 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "Test SPA", + "name": "The Default App", "allowed_clients": [], - "allowed_logout_urls": [ - "http://localhost:3000" - ], - "callbacks": [ - "http://localhost:3000" - ], + "callbacks": [], "client_metadata": {}, "is_first_party": true, "native_social_login": { @@ -17943,16 +17118,17 @@ "enabled": false } }, - "oidc_conformant": true, + "oidc_conformant": false, "refresh_token": { - "expiration_type": "expiring", + "expiration_type": "non-expiring", "leeway": 0, + "infinite_token_lifetime": true, + "infinite_idle_token_lifetime": true, "token_lifetime": 2592000, "idle_token_lifetime": 1296000, - "infinite_token_lifetime": false, - "infinite_idle_token_lifetime": false, - "rotation_type": "rotating" + "rotation_type": "non-rotating" }, + "sso": false, "sso_disabled": false, "cross_origin_authentication": false, "cross_origin_auth": false, @@ -17963,7 +17139,7 @@ "subject": "deprecated" } ], - "client_id": "xODbqyam7rjqHDsYKjU9Tuo99yaBnR5T", + "client_id": "ahrUt7DkBom8m2EAs0zLSccaylYIuVfF", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -17972,15 +17148,12 @@ "secret_encoded": false }, "client_aliases": [], - "token_endpoint_auth_method": "none", - "app_type": "spa", + "token_endpoint_auth_method": "client_secret_post", "grant_types": [ "authorization_code", "implicit", - "refresh_token" - ], - "web_origins": [ - "http://localhost:3000" + "refresh_token", + "client_credentials" ], "custom_login_page_on": true }, @@ -17988,9 +17161,14 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "auth0-deploy-cli-extension", + "name": "Test SPA", "allowed_clients": [], - "callbacks": [], + "allowed_logout_urls": [ + "http://localhost:3000" + ], + "callbacks": [ + "http://localhost:3000" + ], "client_metadata": {}, "is_first_party": true, "native_social_login": { @@ -18003,13 +17181,13 @@ }, "oidc_conformant": true, "refresh_token": { - "expiration_type": "non-expiring", + "expiration_type": "expiring", "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" + "token_lifetime": 2592000, + "idle_token_lifetime": 1296000, + "infinite_token_lifetime": false, + "infinite_idle_token_lifetime": false, + "rotation_type": "rotating" }, "sso_disabled": false, "cross_origin_authentication": false, @@ -18021,7 +17199,7 @@ "subject": "deprecated" } ], - "client_id": "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1", + "client_id": "68Ty4a89yPogS0UGdX8aYaS6td9DXYjs", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -18030,10 +17208,15 @@ "secret_encoded": false }, "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", + "token_endpoint_auth_method": "none", + "app_type": "spa", "grant_types": [ - "client_credentials" + "authorization_code", + "implicit", + "refresh_token" + ], + "web_origins": [ + "http://localhost:3000" ], "custom_login_page_on": true }, @@ -18041,7 +17224,7 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "The Default App", + "name": "auth0-deploy-cli-extension", "allowed_clients": [], "callbacks": [], "client_metadata": {}, @@ -18054,170 +17237,41 @@ "enabled": false } }, - "oidc_conformant": false, + "oidc_conformant": true, "refresh_token": { "expiration_type": "non-expiring", "leeway": 0, "infinite_token_lifetime": true, "infinite_idle_token_lifetime": true, - "token_lifetime": 2592000, - "idle_token_lifetime": 1296000, - "rotation_type": "non-rotating" - }, - "sso": false, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "xYOv2UsoAuKptIEAjkeB62Oaeg1Jn2QX", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "grant_types": [ - "authorization_code", - "implicit", - "refresh_token", - "client_credentials" - ], - "custom_login_page_on": true - } - ] - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/connections?include_totals=true&strategy=auth0", - "body": "", - "status": 200, - "response": { - "total": 2, - "start": 0, - "limit": 50, - "connections": [ - { - "id": "con_fuBNFcmY8aL3HDBT", - "options": { - "mfa": { - "active": true, - "return_enroll_settings": true - }, - "import_mode": false, - "customScripts": { - "login": "function login(email, password, callback) {\n // This script should authenticate a user against the credentials stored in\n // your database.\n // It is executed when a user attempts to log in or immediately after signing\n // up (as a verification that the user was successfully signed up).\n //\n // Everything returned by this script will be set as part of the user profile\n // and will be visible by any of the tenant admins. Avoid adding attributes\n // with values such as passwords, keys, secrets, etc.\n //\n // The `password` parameter of this function is in plain text. It must be\n // hashed/salted to match whatever is stored in your database. For example:\n //\n // var bcrypt = require('bcrypt@0.8.5');\n // bcrypt.compare(password, dbPasswordHash, function(err, res)) { ... }\n //\n // There are three ways this script can finish:\n // 1. The user's credentials are valid. The returned user profile should be in\n // the following format: https://auth0.com/docs/users/normalized/auth0/normalized-user-profile-schema\n // var profile = {\n // user_id: ..., // user_id is mandatory\n // email: ...,\n // [...]\n // };\n // callback(null, profile);\n // 2. The user's credentials are invalid\n // callback(new WrongUsernameOrPasswordError(email, \"my error message\"));\n // 3. Something went wrong while trying to reach your database\n // callback(new Error(\"my error message\"));\n //\n // A list of Node.js modules which can be referenced is available here:\n //\n // https://tehsis.github.io/webtaskio-canirequire/\n console.log('AYYYYYE');\n\n const msg =\n 'Please implement the Login script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "create": "function create(user, callback) {\n // This script should create a user entry in your existing database. It will\n // be executed when a user attempts to sign up, or when a user is created\n // through the Auth0 dashboard or API.\n // When this script has finished executing, the Login script will be\n // executed immediately afterwards, to verify that the user was created\n // successfully.\n //\n // The user object will always contain the following properties:\n // * email: the user's email\n // * password: the password entered by the user, in plain text\n // * tenant: the name of this Auth0 account\n // * client_id: the client ID of the application where the user signed up, or\n // API key if created through the API or Auth0 dashboard\n // * connection: the name of this database connection\n //\n // There are three ways this script can finish:\n // 1. A user was successfully created\n // callback(null);\n // 2. This user already exists in your database\n // callback(new ValidationError(\"user_exists\", \"my error message\"));\n // 3. Something went wrong while trying to reach your database\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Create script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "delete": "function remove(id, callback) {\n // This script remove a user from your existing database.\n // It is executed whenever a user is deleted from the API or Auth0 dashboard.\n //\n // There are two ways that this script can finish:\n // 1. The user was removed successfully:\n // callback(null);\n // 2. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Delete script for this database ' +\n 'connection at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "verify": "function verify(email, callback) {\n // This script should mark the current user's email address as verified in\n // your database.\n // It is executed whenever a user clicks the verification link sent by email.\n // These emails can be customized at https://manage.auth0.com/#/emails.\n // It is safe to assume that the user's email already exists in your database,\n // because verification emails, if enabled, are sent immediately after a\n // successful signup.\n //\n // There are two ways that this script can finish:\n // 1. The user's email was verified successfully\n // callback(null, true);\n // 2. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n //\n // If an error is returned, it will be passed to the query string of the page\n // where the user is being redirected to after clicking the verification link.\n // For example, returning `callback(new Error(\"error\"))` and redirecting to\n // https://example.com would redirect to the following URL:\n // https://example.com?email=alice%40example.com&message=error&success=false\n\n const msg =\n 'Please implement the Verify script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "get_user": "function getByEmail(email, callback) {\n // This script should retrieve a user profile from your existing database,\n // without authenticating the user.\n // It is used to check if a user exists before executing flows that do not\n // require authentication (signup and password reset).\n //\n // There are three ways this script can finish:\n // 1. A user was successfully found. The profile should be in the following\n // format: https://auth0.com/docs/users/normalized/auth0/normalized-user-profile-schema.\n // callback(null, profile);\n // 2. A user was not found\n // callback(null);\n // 3. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Get User script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "change_password": "function changePassword(email, newPassword, callback) {\n // This script should change the password stored for the current user in your\n // database. It is executed when the user clicks on the confirmation link\n // after a reset password request.\n // The content and behavior of password confirmation emails can be customized\n // here: https://manage.auth0.com/#/emails\n // The `newPassword` parameter of this function is in plain text. It must be\n // hashed/salted to match whatever is stored in your database.\n //\n // There are three ways that this script can finish:\n // 1. The user's password was updated successfully:\n // callback(null, true);\n // 2. The user's password was not updated:\n // callback(null, false);\n // 3. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n //\n // If an error is returned, it will be passed to the query string of the page\n // where the user is being redirected to after clicking the confirmation link.\n // For example, returning `callback(new Error(\"error\"))` and redirecting to\n // https://example.com would redirect to the following URL:\n // https://example.com?email=alice%40example.com&message=error&success=false\n\n const msg =\n 'Please implement the Change Password script for this database ' +\n 'connection at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n" - }, - "disable_signup": false, - "passwordPolicy": "low", - "passkey_options": { - "challenge_ui": "both", - "local_enrollment_enabled": true, - "progressive_enrollment_enabled": true - }, - "password_history": { - "size": 5, - "enable": false - }, - "strategy_version": 2, - "requires_username": true, - "password_dictionary": { - "enable": true, - "dictionary": [] - }, - "authentication_methods": { - "passkey": { - "enabled": false - }, - "password": { - "enabled": true, - "api_behavior": "required" - } - }, - "brute_force_protection": true, - "password_no_personal_info": { - "enable": true - }, - "password_complexity_options": { - "min_length": 8 - }, - "enabledDatabaseCustomization": true - }, - "strategy": "auth0", - "name": "boo-baz-db-connection-test", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "boo-baz-db-connection-test" - ], - "enabled_clients": [ - "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1", - "QwKFSZ87TYF89lXp66sVFpGzYGQ07OU6" - ] - }, - { - "id": "con_Ty3Nbl0J1Ddxat41", - "options": { - "mfa": { - "active": true, - "return_enroll_settings": true - }, - "passwordPolicy": "good", - "passkey_options": { - "challenge_ui": "both", - "local_enrollment_enabled": true, - "progressive_enrollment_enabled": true - }, - "strategy_version": 2, - "authentication_methods": { - "passkey": { - "enabled": false - }, - "password": { - "enabled": true, - "api_behavior": "required" - } - }, - "brute_force_protection": true - }, - "strategy": "auth0", - "name": "Username-Password-Authentication", - "is_domain_connection": false, - "authentication": { - "active": true + "token_lifetime": 31557600, + "idle_token_lifetime": 2592000, + "rotation_type": "non-rotating" }, - "connected_accounts": { - "active": false + "sso_disabled": false, + "cross_origin_authentication": false, + "cross_origin_auth": false, + "signing_keys": [ + { + "cert": "[REDACTED]", + "pkcs7": "[REDACTED]", + "subject": "deprecated" + } + ], + "client_id": "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU", + "callback_url_template": false, + "client_secret": "[REDACTED]", + "jwt_configuration": { + "alg": "RS256", + "lifetime_in_seconds": 36000, + "secret_encoded": false }, - "realms": [ - "Username-Password-Authentication" + "client_aliases": [], + "token_endpoint_auth_method": "client_secret_post", + "app_type": "non_interactive", + "grant_types": [ + "client_credentials" ], - "enabled_clients": [ - "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", - "cLFFGtjp2Xe7HWQCHfCtQxmURfSu1lDH" - ] + "custom_login_page_on": true } ] }, @@ -18227,13 +17281,13 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections?include_totals=true&take=50&strategy=auth0", + "path": "/api/v2/connections?take=50&strategy=auth0", "body": "", "status": 200, "response": { "connections": [ { - "id": "con_fuBNFcmY8aL3HDBT", + "id": "con_cxSOS7uLgPojtLBh", "options": { "mfa": { "active": true, @@ -18296,12 +17350,12 @@ "boo-baz-db-connection-test" ], "enabled_clients": [ - "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1", - "QwKFSZ87TYF89lXp66sVFpGzYGQ07OU6" + "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU", + "KjqnjAT6PWajvX3XKVkWhFVaW8sFBWyv" ] }, { - "id": "con_Ty3Nbl0J1Ddxat41", + "id": "con_3R2lX4rln4ArocW5", "options": { "mfa": { "active": true, @@ -18339,7 +17393,7 @@ ], "enabled_clients": [ "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", - "cLFFGtjp2Xe7HWQCHfCtQxmURfSu1lDH" + "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" ] } ] @@ -18350,16 +17404,16 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections/con_fuBNFcmY8aL3HDBT/clients?take=50", + "path": "/api/v2/connections/con_cxSOS7uLgPojtLBh/clients?take=50", "body": "", "status": 200, "response": { "clients": [ { - "client_id": "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1" + "client_id": "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU" }, { - "client_id": "QwKFSZ87TYF89lXp66sVFpGzYGQ07OU6" + "client_id": "KjqnjAT6PWajvX3XKVkWhFVaW8sFBWyv" } ] }, @@ -18369,13 +17423,13 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections/con_Ty3Nbl0J1Ddxat41/clients?take=50", + "path": "/api/v2/connections/con_3R2lX4rln4ArocW5/clients?take=50", "body": "", "status": 200, "response": { "clients": [ { - "client_id": "cLFFGtjp2Xe7HWQCHfCtQxmURfSu1lDH" + "client_id": "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" }, { "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE" @@ -18388,150 +17442,35 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections?include_totals=true", + "path": "/api/v2/connections/con_cxSOS7uLgPojtLBh/clients?take=50", "body": "", "status": 200, "response": { - "total": 3, - "start": 0, - "limit": 50, - "connections": [ + "clients": [ { - "id": "con_fuBNFcmY8aL3HDBT", - "options": { - "mfa": { - "active": true, - "return_enroll_settings": true - }, - "import_mode": false, - "customScripts": { - "login": "function login(email, password, callback) {\n // This script should authenticate a user against the credentials stored in\n // your database.\n // It is executed when a user attempts to log in or immediately after signing\n // up (as a verification that the user was successfully signed up).\n //\n // Everything returned by this script will be set as part of the user profile\n // and will be visible by any of the tenant admins. Avoid adding attributes\n // with values such as passwords, keys, secrets, etc.\n //\n // The `password` parameter of this function is in plain text. It must be\n // hashed/salted to match whatever is stored in your database. For example:\n //\n // var bcrypt = require('bcrypt@0.8.5');\n // bcrypt.compare(password, dbPasswordHash, function(err, res)) { ... }\n //\n // There are three ways this script can finish:\n // 1. The user's credentials are valid. The returned user profile should be in\n // the following format: https://auth0.com/docs/users/normalized/auth0/normalized-user-profile-schema\n // var profile = {\n // user_id: ..., // user_id is mandatory\n // email: ...,\n // [...]\n // };\n // callback(null, profile);\n // 2. The user's credentials are invalid\n // callback(new WrongUsernameOrPasswordError(email, \"my error message\"));\n // 3. Something went wrong while trying to reach your database\n // callback(new Error(\"my error message\"));\n //\n // A list of Node.js modules which can be referenced is available here:\n //\n // https://tehsis.github.io/webtaskio-canirequire/\n console.log('AYYYYYE');\n\n const msg =\n 'Please implement the Login script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "create": "function create(user, callback) {\n // This script should create a user entry in your existing database. It will\n // be executed when a user attempts to sign up, or when a user is created\n // through the Auth0 dashboard or API.\n // When this script has finished executing, the Login script will be\n // executed immediately afterwards, to verify that the user was created\n // successfully.\n //\n // The user object will always contain the following properties:\n // * email: the user's email\n // * password: the password entered by the user, in plain text\n // * tenant: the name of this Auth0 account\n // * client_id: the client ID of the application where the user signed up, or\n // API key if created through the API or Auth0 dashboard\n // * connection: the name of this database connection\n //\n // There are three ways this script can finish:\n // 1. A user was successfully created\n // callback(null);\n // 2. This user already exists in your database\n // callback(new ValidationError(\"user_exists\", \"my error message\"));\n // 3. Something went wrong while trying to reach your database\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Create script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "delete": "function remove(id, callback) {\n // This script remove a user from your existing database.\n // It is executed whenever a user is deleted from the API or Auth0 dashboard.\n //\n // There are two ways that this script can finish:\n // 1. The user was removed successfully:\n // callback(null);\n // 2. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Delete script for this database ' +\n 'connection at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "verify": "function verify(email, callback) {\n // This script should mark the current user's email address as verified in\n // your database.\n // It is executed whenever a user clicks the verification link sent by email.\n // These emails can be customized at https://manage.auth0.com/#/emails.\n // It is safe to assume that the user's email already exists in your database,\n // because verification emails, if enabled, are sent immediately after a\n // successful signup.\n //\n // There are two ways that this script can finish:\n // 1. The user's email was verified successfully\n // callback(null, true);\n // 2. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n //\n // If an error is returned, it will be passed to the query string of the page\n // where the user is being redirected to after clicking the verification link.\n // For example, returning `callback(new Error(\"error\"))` and redirecting to\n // https://example.com would redirect to the following URL:\n // https://example.com?email=alice%40example.com&message=error&success=false\n\n const msg =\n 'Please implement the Verify script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "get_user": "function getByEmail(email, callback) {\n // This script should retrieve a user profile from your existing database,\n // without authenticating the user.\n // It is used to check if a user exists before executing flows that do not\n // require authentication (signup and password reset).\n //\n // There are three ways this script can finish:\n // 1. A user was successfully found. The profile should be in the following\n // format: https://auth0.com/docs/users/normalized/auth0/normalized-user-profile-schema.\n // callback(null, profile);\n // 2. A user was not found\n // callback(null);\n // 3. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Get User script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "change_password": "function changePassword(email, newPassword, callback) {\n // This script should change the password stored for the current user in your\n // database. It is executed when the user clicks on the confirmation link\n // after a reset password request.\n // The content and behavior of password confirmation emails can be customized\n // here: https://manage.auth0.com/#/emails\n // The `newPassword` parameter of this function is in plain text. It must be\n // hashed/salted to match whatever is stored in your database.\n //\n // There are three ways that this script can finish:\n // 1. The user's password was updated successfully:\n // callback(null, true);\n // 2. The user's password was not updated:\n // callback(null, false);\n // 3. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n //\n // If an error is returned, it will be passed to the query string of the page\n // where the user is being redirected to after clicking the confirmation link.\n // For example, returning `callback(new Error(\"error\"))` and redirecting to\n // https://example.com would redirect to the following URL:\n // https://example.com?email=alice%40example.com&message=error&success=false\n\n const msg =\n 'Please implement the Change Password script for this database ' +\n 'connection at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n" - }, - "disable_signup": false, - "passwordPolicy": "low", - "passkey_options": { - "challenge_ui": "both", - "local_enrollment_enabled": true, - "progressive_enrollment_enabled": true - }, - "password_history": { - "size": 5, - "enable": false - }, - "strategy_version": 2, - "requires_username": true, - "password_dictionary": { - "enable": true, - "dictionary": [] - }, - "authentication_methods": { - "passkey": { - "enabled": false - }, - "password": { - "enabled": true, - "api_behavior": "required" - } - }, - "brute_force_protection": true, - "password_no_personal_info": { - "enable": true - }, - "password_complexity_options": { - "min_length": 8 - }, - "enabledDatabaseCustomization": true - }, - "strategy": "auth0", - "name": "boo-baz-db-connection-test", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "boo-baz-db-connection-test" - ], - "enabled_clients": [ - "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1", - "QwKFSZ87TYF89lXp66sVFpGzYGQ07OU6" - ] + "client_id": "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU" }, { - "id": "con_URfc5OIXMzEJtZaz", - "options": { - "email": true, - "scope": [ - "email", - "profile" - ], - "profile": true - }, - "strategy": "google-oauth2", - "name": "google-oauth2", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "google-oauth2" - ], - "enabled_clients": [ - "xYOv2UsoAuKptIEAjkeB62Oaeg1Jn2QX", - "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1" - ] + "client_id": "KjqnjAT6PWajvX3XKVkWhFVaW8sFBWyv" + } + ] + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/connections/con_3R2lX4rln4ArocW5/clients?take=50", + "body": "", + "status": 200, + "response": { + "clients": [ + { + "client_id": "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" }, { - "id": "con_Ty3Nbl0J1Ddxat41", - "options": { - "mfa": { - "active": true, - "return_enroll_settings": true - }, - "passwordPolicy": "good", - "passkey_options": { - "challenge_ui": "both", - "local_enrollment_enabled": true, - "progressive_enrollment_enabled": true - }, - "strategy_version": 2, - "authentication_methods": { - "passkey": { - "enabled": false - }, - "password": { - "enabled": true, - "api_behavior": "required" - } - }, - "brute_force_protection": true - }, - "strategy": "auth0", - "name": "Username-Password-Authentication", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "Username-Password-Authentication" - ], - "enabled_clients": [ - "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", - "cLFFGtjp2Xe7HWQCHfCtQxmURfSu1lDH" - ] + "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE" } ] }, @@ -18541,13 +17480,13 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections?include_totals=true&take=50", + "path": "/api/v2/connections?take=50", "body": "", "status": 200, "response": { "connections": [ { - "id": "con_fuBNFcmY8aL3HDBT", + "id": "con_cxSOS7uLgPojtLBh", "options": { "mfa": { "active": true, @@ -18610,12 +17549,12 @@ "boo-baz-db-connection-test" ], "enabled_clients": [ - "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1", - "QwKFSZ87TYF89lXp66sVFpGzYGQ07OU6" + "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU", + "KjqnjAT6PWajvX3XKVkWhFVaW8sFBWyv" ] }, { - "id": "con_URfc5OIXMzEJtZaz", + "id": "con_lfhXlIY73LFJlMks", "options": { "email": true, "scope": [ @@ -18637,12 +17576,12 @@ "google-oauth2" ], "enabled_clients": [ - "xYOv2UsoAuKptIEAjkeB62Oaeg1Jn2QX", - "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1" + "ahrUt7DkBom8m2EAs0zLSccaylYIuVfF", + "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU" ] }, { - "id": "con_Ty3Nbl0J1Ddxat41", + "id": "con_3R2lX4rln4ArocW5", "options": { "mfa": { "active": true, @@ -18680,7 +17619,7 @@ ], "enabled_clients": [ "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", - "cLFFGtjp2Xe7HWQCHfCtQxmURfSu1lDH" + "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" ] } ] @@ -18691,16 +17630,35 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections/con_URfc5OIXMzEJtZaz/clients?take=50", + "path": "/api/v2/connections/con_lfhXlIY73LFJlMks/clients?take=50", + "body": "", + "status": 200, + "response": { + "clients": [ + { + "client_id": "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU" + }, + { + "client_id": "ahrUt7DkBom8m2EAs0zLSccaylYIuVfF" + } + ] + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/connections/con_lfhXlIY73LFJlMks/clients?take=50", "body": "", "status": 200, "response": { "clients": [ { - "client_id": "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1" + "client_id": "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU" }, { - "client_id": "xYOv2UsoAuKptIEAjkeB62Oaeg1Jn2QX" + "client_id": "ahrUt7DkBom8m2EAs0zLSccaylYIuVfF" } ] }, @@ -18794,21 +17752,6 @@ "rawHeaders": [], "responseIsBinary": false }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/email-templates/verify_email_by_code", - "body": "", - "status": 404, - "response": { - "statusCode": 404, - "error": "Not Found", - "message": "The template does not exist.", - "errorCode": "inexistent_email_template" - }, - "rawHeaders": [], - "responseIsBinary": false - }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", @@ -18830,7 +17773,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/email-templates/reset_email", + "path": "/api/v2/email-templates/verify_email_by_code", "body": "", "status": 404, "response": { @@ -18845,7 +17788,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/email-templates/change_password", + "path": "/api/v2/email-templates/reset_email", "body": "", "status": 404, "response": { @@ -18860,7 +17803,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/email-templates/enrollment_email", + "path": "/api/v2/email-templates/stolen_credentials", "body": "", "status": 404, "response": { @@ -18875,7 +17818,26 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/email-templates/mfa_oob_code", + "path": "/api/v2/email-templates/welcome_email", + "body": "", + "status": 200, + "response": { + "template": "welcome_email", + "body": "\n \n

Welcome!

\n \n\n", + "from": "", + "resultUrl": "https://example.com/welcome", + "subject": "Welcome", + "syntax": "liquid", + "urlLifetimeInSeconds": 3600, + "enabled": false + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/email-templates/user_invitation", "body": "", "status": 404, "response": { @@ -18890,7 +17852,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/email-templates/stolen_credentials", + "path": "/api/v2/email-templates/enrollment_email", "body": "", "status": 404, "response": { @@ -18905,18 +17867,14 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/email-templates/welcome_email", + "path": "/api/v2/email-templates/reset_email_by_code", "body": "", - "status": 200, + "status": 404, "response": { - "template": "welcome_email", - "body": "\n \n

Welcome!

\n \n\n", - "from": "", - "resultUrl": "https://example.com/welcome", - "subject": "Welcome", - "syntax": "liquid", - "urlLifetimeInSeconds": 3600, - "enabled": false + "statusCode": 404, + "error": "Not Found", + "message": "The template does not exist.", + "errorCode": "inexistent_email_template" }, "rawHeaders": [], "responseIsBinary": false @@ -18939,7 +17897,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/email-templates/reset_email_by_code", + "path": "/api/v2/email-templates/password_reset", "body": "", "status": 404, "response": { @@ -18954,7 +17912,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/email-templates/user_invitation", + "path": "/api/v2/email-templates/change_password", "body": "", "status": 404, "response": { @@ -18969,7 +17927,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/email-templates/password_reset", + "path": "/api/v2/email-templates/mfa_oob_code", "body": "", "status": 404, "response": { @@ -18999,17 +17957,14 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/client-grants?per_page=100&page=0&include_totals=true", + "path": "/api/v2/client-grants?take=50", "body": "", "status": 200, "response": { - "total": 3, - "start": 0, - "limit": 100, "client_grants": [ { - "id": "cgr_X9WoUpI87FLuMfUp", - "client_id": "VvKPDeB2QHhtG4tVBNcrRUuChB0jWefu", + "id": "cgr_S92D2BBPB2wQXFYC", + "client_id": "GH55Wtak9aTrj6tjRFObq1cqnu5a8mtM", "audience": "https://auth0-deploy-cli-e2e.us.auth0.com/api/v2/", "scope": [ "read:client_grants", @@ -19146,8 +18101,8 @@ "subject_type": "client" }, { - "id": "cgr_pbwejzhwoujrsNE8", - "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", + "id": "cgr_UQhGxDPGii0tSQcs", + "client_id": "0ltKN06qv5WnNoNz2Fu6QvyOl2o6K6nE", "audience": "https://auth0-deploy-cli-e2e.us.auth0.com/api/v2/", "scope": [ "read:client_grants", @@ -19174,10 +18129,6 @@ "update:client_keys", "delete:client_keys", "create:client_keys", - "read:client_credentials", - "update:client_credentials", - "delete:client_credentials", - "create:client_credentials", "read:connections", "update:connections", "delete:connections", @@ -19267,19 +18218,10 @@ "read:entitlements", "read:attack_protection", "update:attack_protection", - "read:organizations_summary", - "create:authentication_methods", - "read:authentication_methods", - "update:authentication_methods", - "delete:authentication_methods", "read:organizations", "update:organizations", "create:organizations", "delete:organizations", - "read:organization_discovery_domains", - "update:organization_discovery_domains", - "create:organization_discovery_domains", - "delete:organization_discovery_domains", "create:organization_members", "read:organization_members", "delete:organization_members", @@ -19292,97 +18234,13 @@ "delete:organization_member_roles", "create:organization_invitations", "read:organization_invitations", - "delete:organization_invitations", - "read:scim_config", - "create:scim_config", - "update:scim_config", - "delete:scim_config", - "create:scim_token", - "read:scim_token", - "delete:scim_token", - "delete:phone_providers", - "create:phone_providers", - "read:phone_providers", - "update:phone_providers", - "delete:phone_templates", - "create:phone_templates", - "read:phone_templates", - "update:phone_templates", - "create:encryption_keys", - "read:encryption_keys", - "update:encryption_keys", - "delete:encryption_keys", - "read:sessions", - "update:sessions", - "delete:sessions", - "read:refresh_tokens", - "delete:refresh_tokens", - "create:self_service_profiles", - "read:self_service_profiles", - "update:self_service_profiles", - "delete:self_service_profiles", - "create:sso_access_tickets", - "delete:sso_access_tickets", - "read:forms", - "update:forms", - "delete:forms", - "create:forms", - "read:flows", - "update:flows", - "delete:flows", - "create:flows", - "read:flows_vault", - "read:flows_vault_connections", - "update:flows_vault_connections", - "delete:flows_vault_connections", - "create:flows_vault_connections", - "read:flows_executions", - "delete:flows_executions", - "read:connections_options", - "update:connections_options", - "read:self_service_profile_custom_texts", - "update:self_service_profile_custom_texts", - "create:network_acls", - "update:network_acls", - "read:network_acls", - "delete:network_acls", - "delete:vdcs_templates", - "read:vdcs_templates", - "create:vdcs_templates", - "update:vdcs_templates", - "create:custom_signing_keys", - "read:custom_signing_keys", - "update:custom_signing_keys", - "delete:custom_signing_keys", - "read:federated_connections_tokens", - "delete:federated_connections_tokens", - "create:user_attribute_profiles", - "read:user_attribute_profiles", - "update:user_attribute_profiles", - "delete:user_attribute_profiles", - "read:event_streams", - "create:event_streams", - "delete:event_streams", - "update:event_streams", - "read:event_deliveries", - "update:event_deliveries", - "create:connection_profiles", - "read:connection_profiles", - "update:connection_profiles", - "delete:connection_profiles", - "read:organization_client_grants", - "create:organization_client_grants", - "delete:organization_client_grants", - "read:security_metrics", - "read:connections_keys", - "update:connections_keys", - "create:connections_keys" + "delete:organization_invitations" ], "subject_type": "client" }, { - "id": "cgr_s9W4N1r5PKXB4V8l", - "client_id": "uf1Ju9xwQ09AWpcnRnwD91W3Sv3bf76S", + "id": "cgr_pbwejzhwoujrsNE8", + "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", "audience": "https://auth0-deploy-cli-e2e.us.auth0.com/api/v2/", "scope": [ "read:client_grants", @@ -19409,6 +18267,10 @@ "update:client_keys", "delete:client_keys", "create:client_keys", + "read:client_credentials", + "update:client_credentials", + "delete:client_credentials", + "create:client_credentials", "read:connections", "update:connections", "delete:connections", @@ -19498,10 +18360,19 @@ "read:entitlements", "read:attack_protection", "update:attack_protection", + "read:organizations_summary", + "create:authentication_methods", + "read:authentication_methods", + "update:authentication_methods", + "delete:authentication_methods", "read:organizations", "update:organizations", "create:organizations", "delete:organizations", + "read:organization_discovery_domains", + "update:organization_discovery_domains", + "create:organization_discovery_domains", + "delete:organization_discovery_domains", "create:organization_members", "read:organization_members", "delete:organization_members", @@ -19514,7 +18385,91 @@ "delete:organization_member_roles", "create:organization_invitations", "read:organization_invitations", - "delete:organization_invitations" + "delete:organization_invitations", + "read:scim_config", + "create:scim_config", + "update:scim_config", + "delete:scim_config", + "create:scim_token", + "read:scim_token", + "delete:scim_token", + "delete:phone_providers", + "create:phone_providers", + "read:phone_providers", + "update:phone_providers", + "delete:phone_templates", + "create:phone_templates", + "read:phone_templates", + "update:phone_templates", + "create:encryption_keys", + "read:encryption_keys", + "update:encryption_keys", + "delete:encryption_keys", + "read:sessions", + "update:sessions", + "delete:sessions", + "read:refresh_tokens", + "delete:refresh_tokens", + "create:self_service_profiles", + "read:self_service_profiles", + "update:self_service_profiles", + "delete:self_service_profiles", + "create:sso_access_tickets", + "delete:sso_access_tickets", + "read:forms", + "update:forms", + "delete:forms", + "create:forms", + "read:flows", + "update:flows", + "delete:flows", + "create:flows", + "read:flows_vault", + "read:flows_vault_connections", + "update:flows_vault_connections", + "delete:flows_vault_connections", + "create:flows_vault_connections", + "read:flows_executions", + "delete:flows_executions", + "read:connections_options", + "update:connections_options", + "read:self_service_profile_custom_texts", + "update:self_service_profile_custom_texts", + "create:network_acls", + "update:network_acls", + "read:network_acls", + "delete:network_acls", + "delete:vdcs_templates", + "read:vdcs_templates", + "create:vdcs_templates", + "update:vdcs_templates", + "create:custom_signing_keys", + "read:custom_signing_keys", + "update:custom_signing_keys", + "delete:custom_signing_keys", + "read:federated_connections_tokens", + "delete:federated_connections_tokens", + "create:user_attribute_profiles", + "read:user_attribute_profiles", + "update:user_attribute_profiles", + "delete:user_attribute_profiles", + "read:event_streams", + "create:event_streams", + "delete:event_streams", + "update:event_streams", + "read:event_deliveries", + "update:event_deliveries", + "create:connection_profiles", + "read:connection_profiles", + "update:connection_profiles", + "delete:connection_profiles", + "read:organization_client_grants", + "create:organization_client_grants", + "delete:organization_client_grants", + "read:security_metrics", + "read:connections_keys", + "update:connections_keys", + "create:connections_keys" ], "subject_type": "client" } @@ -19650,22 +18605,22 @@ "response": { "roles": [ { - "id": "rol_fYWtGL9q5Foq7oJD", + "id": "rol_nvXgdsT2ksrlrQpN", "name": "Admin", "description": "Can read and write things" }, { - "id": "rol_iHF8WkcFPvQFJlvd", + "id": "rol_DW7eDROpAD03JEhC", "name": "Reader", "description": "Can only read things" }, { - "id": "rol_AHn82p4ofrvBg4g5", + "id": "rol_TDHVhZp26Ti7nQt2", "name": "read_only", "description": "Read Only" }, { - "id": "rol_J3tWLDMM6zuxlUiT", + "id": "rol_6uNKN3FdNBPgcRFM", "name": "read_osnly", "description": "Readz Only" } @@ -19680,7 +18635,67 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/roles/rol_fYWtGL9q5Foq7oJD/permissions?per_page=100&page=0&include_totals=true", + "path": "/api/v2/roles/rol_nvXgdsT2ksrlrQpN/permissions?per_page=100&page=0&include_totals=true", + "body": "", + "status": 200, + "response": { + "permissions": [], + "start": 0, + "limit": 100, + "total": 0 + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/roles/rol_nvXgdsT2ksrlrQpN/permissions?per_page=100&page=1&include_totals=true", + "body": "", + "status": 200, + "response": { + "permissions": [], + "start": 100, + "limit": 100, + "total": 0 + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/roles/rol_DW7eDROpAD03JEhC/permissions?per_page=100&page=0&include_totals=true", + "body": "", + "status": 200, + "response": { + "permissions": [], + "start": 0, + "limit": 100, + "total": 0 + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/roles/rol_DW7eDROpAD03JEhC/permissions?per_page=100&page=1&include_totals=true", + "body": "", + "status": 200, + "response": { + "permissions": [], + "start": 100, + "limit": 100, + "total": 0 + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/roles/rol_TDHVhZp26Ti7nQt2/permissions?per_page=100&page=0&include_totals=true", "body": "", "status": 200, "response": { @@ -19695,12 +18710,12 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/roles/rol_iHF8WkcFPvQFJlvd/permissions?per_page=100&page=0&include_totals=true", + "path": "/api/v2/roles/rol_TDHVhZp26Ti7nQt2/permissions?per_page=100&page=1&include_totals=true", "body": "", "status": 200, "response": { "permissions": [], - "start": 0, + "start": 100, "limit": 100, "total": 0 }, @@ -19710,7 +18725,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/roles/rol_AHn82p4ofrvBg4g5/permissions?per_page=100&page=0&include_totals=true", + "path": "/api/v2/roles/rol_6uNKN3FdNBPgcRFM/permissions?per_page=100&page=0&include_totals=true", "body": "", "status": 200, "response": { @@ -19725,12 +18740,12 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/roles/rol_J3tWLDMM6zuxlUiT/permissions?per_page=100&page=0&include_totals=true", + "path": "/api/v2/roles/rol_6uNKN3FdNBPgcRFM/permissions?per_page=100&page=1&include_totals=true", "body": "", "status": 200, "response": { "permissions": [], - "start": 0, + "start": 100, "limit": 100, "total": 0 }, @@ -19770,7 +18785,101 @@ "body": "", "status": 200, "response": { - "providers": [] + "providers": [ + { + "id": "pro_mY3L5BP6iVUUzpv22opofm", + "tenant": "auth0-deploy-cli-e2e", + "name": "custom", + "channel": "phone", + "disabled": false, + "configuration": { + "delivery_methods": [ + "text" + ] + }, + "credentials": null, + "created_at": "2025-12-09T12:24:00.604Z", + "updated_at": "2025-12-16T10:11:48.093Z" + } + ] + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/branding/phone/templates", + "body": "", + "status": 200, + "response": { + "templates": [ + { + "id": "tem_o4LBTt4NQyX8K4vC9dPafR", + "tenant": "auth0-deploy-cli-e2e", + "channel": "phone", + "type": "otp_verify", + "disabled": false, + "created_at": "2025-12-09T12:26:30.547Z", + "updated_at": "2025-12-16T10:11:50.208Z", + "content": { + "syntax": "liquid", + "body": { + "text": "{{ code | escape }} is your verification code for {{ friendly_name | escape }}", + "voice": "Hello. Your verification code for {{ friendly_name | escape }} is {{ pause }} {{ code | escape }}. I repeat, your verification code is {{ pause }} {{ code | escape }}" + } + } + }, + { + "id": "tem_xqbUSF83fpnRv8r8rqXFDZ", + "tenant": "auth0-deploy-cli-e2e", + "channel": "phone", + "type": "change_password", + "disabled": false, + "created_at": "2025-12-09T12:26:20.243Z", + "updated_at": "2025-12-16T10:11:50.047Z", + "content": { + "syntax": "liquid", + "body": { + "text": "{{ code | escape }} is your password change code for {{ friendly_name | escape }}", + "voice": "Hello. Your password change code for {{ friendly_name | escape }} is {{ pause }} {{ code | escape }}. I repeat, your password change code is {{ pause }} {{ code | escape }}" + } + } + }, + { + "id": "tem_dL83uTmWn8moGzm8UgAk4Q", + "tenant": "auth0-deploy-cli-e2e", + "channel": "phone", + "type": "blocked_account", + "disabled": false, + "created_at": "2025-12-09T12:22:47.683Z", + "updated_at": "2025-12-16T10:11:50.118Z", + "content": { + "syntax": "liquid", + "body": { + "text": "We detected suspicious activity on your account from the ip {{user.source_ip}}{% if user.city %} from {{user.city}}, {{user.country}}{% elsif user.country %} from {{user.country}}{% endif %}. Logins from this IP have been blocked on your account. If this is your IP, please reset your password to unblock your account. Otherwise, disregard this message.", + "voice": "We detected suspicious activity on your account from the ip {{user.source_ip}}{% if user.city %} from {{user.city}}, {{user.country}}{% elsif user.country %} from {{user.country}}{% endif %}. Logins from this IP have been blocked on your account. If this is your IP, please reset your password to unblock your account. Otherwise, disregard this message." + }, + "from": "0032232323" + } + }, + { + "id": "tem_qarYST5TTE5pbMNB5NHZAj", + "tenant": "auth0-deploy-cli-e2e", + "channel": "phone", + "type": "otp_enroll", + "disabled": false, + "created_at": "2025-12-09T12:26:25.327Z", + "updated_at": "2025-12-16T10:11:50.397Z", + "content": { + "syntax": "liquid", + "body": { + "text": "{{ code | escape }} is your verification code for {{ friendly_name | escape }}. Please enter this code to verify your enrollment.", + "voice": "Hello. Your verification code for {{ friendly_name | escape }} is {{ pause }} {{ code | escape }}. I repeat, your verification code is {{ pause }} {{ code | escape }}" + } + } + } + ] }, "rawHeaders": [], "responseIsBinary": false @@ -19873,7 +18982,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/prompts/login-id/custom-text/en", + "path": "/api/v2/prompts/login-password/custom-text/en", "body": "", "status": 200, "response": {}, @@ -19883,7 +18992,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/prompts/login-password/custom-text/en", + "path": "/api/v2/prompts/login-id/custom-text/en", "body": "", "status": 200, "response": {}, @@ -19923,7 +19032,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/prompts/signup-id/custom-text/en", + "path": "/api/v2/prompts/signup-password/custom-text/en", "body": "", "status": 200, "response": {}, @@ -19933,7 +19042,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/prompts/signup-password/custom-text/en", + "path": "/api/v2/prompts/signup-id/custom-text/en", "body": "", "status": 200, "response": {}, @@ -19943,7 +19052,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/prompts/phone-identifier-challenge/custom-text/en", + "path": "/api/v2/prompts/phone-identifier-enrollment/custom-text/en", "body": "", "status": 200, "response": {}, @@ -19953,7 +19062,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/prompts/phone-identifier-enrollment/custom-text/en", + "path": "/api/v2/prompts/phone-identifier-challenge/custom-text/en", "body": "", "status": 200, "response": {}, @@ -20043,7 +19152,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/prompts/mfa-webauthn/custom-text/en", + "path": "/api/v2/prompts/mfa-voice/custom-text/en", "body": "", "status": 200, "response": {}, @@ -20053,7 +19162,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/prompts/mfa-voice/custom-text/en", + "path": "/api/v2/prompts/mfa-phone/custom-text/en", "body": "", "status": 200, "response": {}, @@ -20063,7 +19172,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/prompts/mfa-phone/custom-text/en", + "path": "/api/v2/prompts/mfa-webauthn/custom-text/en", "body": "", "status": 200, "response": {}, @@ -20113,7 +19222,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/prompts/device-flow/custom-text/en", + "path": "/api/v2/prompts/status/custom-text/en", "body": "", "status": 200, "response": {}, @@ -20123,7 +19232,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/prompts/status/custom-text/en", + "path": "/api/v2/prompts/device-flow/custom-text/en", "body": "", "status": 200, "response": {}, @@ -20183,7 +19292,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/prompts/passkeys/custom-text/en", + "path": "/api/v2/prompts/captcha/custom-text/en", "body": "", "status": 200, "response": {}, @@ -20193,7 +19302,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/prompts/captcha/custom-text/en", + "path": "/api/v2/prompts/passkeys/custom-text/en", "body": "", "status": 200, "response": {}, @@ -20203,7 +19312,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/prompts/login-id/partials", + "path": "/api/v2/prompts/brute-force-protection/custom-text/en", "body": "", "status": 200, "response": {}, @@ -20220,6 +19329,16 @@ "rawHeaders": [], "responseIsBinary": false }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/prompts/login-id/partials", + "body": "", + "status": 200, + "response": {}, + "rawHeaders": [], + "responseIsBinary": false + }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", @@ -20243,7 +19362,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/prompts/signup-id/partials", + "path": "/api/v2/prompts/signup/partials", "body": "", "status": 200, "response": {}, @@ -20253,7 +19372,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/prompts/signup/partials", + "path": "/api/v2/prompts/signup-id/partials", "body": "", "status": 200, "response": {}, @@ -20273,10 +19392,15 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/prompts/rendering", + "path": "/api/v2/prompts/rendering?page=0&per_page=100&include_totals=true", "body": "", "status": 200, - "response": [], + "response": { + "configs": [], + "start": 0, + "limit": 100, + "total": 0 + }, "rawHeaders": [], "responseIsBinary": false }, @@ -20289,7 +19413,54 @@ "response": { "actions": [ { - "id": "d67e0c5e-5be5-4ea1-8b75-29c65f79b7fe", + "id": "ead7d2a3-5a93-43e2-9ec3-455f3c39daf9", + "name": "Custom Phone Provider", + "supported_triggers": [ + { + "id": "custom-phone-provider", + "version": "v1" + } + ], + "created_at": "2025-12-16T10:10:30.752146844Z", + "updated_at": "2025-12-16T10:11:36.910288525Z", + "code": "/**\n* Handler to be executed while sending a phone notification\n* @param {Event} event - Details about the user and the context in which they are logging in.\n* @param {CustomPhoneProviderAPI} api - Methods and utilities to help change the behavior of sending a phone notification.\n*/\nexports.onExecuteCustomPhoneProvider = async (event, api) => {\n // Code goes here\n return;\n};", + "dependencies": [], + "runtime": "node22", + "status": "built", + "secrets": [], + "current_version": { + "id": "83a87aec-f6f7-42bb-b6ad-6fa170f652d1", + "code": "/**\n* Handler to be executed while sending a phone notification\n* @param {Event} event - Details about the user and the context in which they are logging in.\n* @param {CustomPhoneProviderAPI} api - Methods and utilities to help change the behavior of sending a phone notification.\n*/\nexports.onExecuteCustomPhoneProvider = async (event, api) => {\n // Code goes here\n return;\n};", + "runtime": "node22", + "status": "BUILT", + "number": 2, + "build_time": "2025-12-16T10:11:37.710742601Z", + "created_at": "2025-12-16T10:11:37.627490560Z", + "updated_at": "2025-12-16T10:11:37.712144713Z" + }, + "deployed_version": { + "code": "/**\n* Handler to be executed while sending a phone notification\n* @param {Event} event - Details about the user and the context in which they are logging in.\n* @param {CustomPhoneProviderAPI} api - Methods and utilities to help change the behavior of sending a phone notification.\n*/\nexports.onExecuteCustomPhoneProvider = async (event, api) => {\n // Code goes here\n return;\n};", + "dependencies": [], + "id": "83a87aec-f6f7-42bb-b6ad-6fa170f652d1", + "deployed": true, + "number": 2, + "built_at": "2025-12-16T10:11:37.710742601Z", + "secrets": [], + "status": "built", + "created_at": "2025-12-16T10:11:37.627490560Z", + "updated_at": "2025-12-16T10:11:37.712144713Z", + "runtime": "node22", + "supported_triggers": [ + { + "id": "custom-phone-provider", + "version": "v1" + } + ] + }, + "all_changes_deployed": true + }, + { + "id": "9cc78117-5697-42a8-9c1f-03bf8e5a3689", "name": "My Custom Action", "supported_triggers": [ { @@ -20297,34 +19468,34 @@ "version": "v2" } ], - "created_at": "2025-12-05T07:01:47.853050355Z", - "updated_at": "2025-12-05T07:01:47.866830407Z", + "created_at": "2025-12-16T10:12:49.378691946Z", + "updated_at": "2025-12-16T10:12:49.386633985Z", "code": "/**\n * Handler that will be called during the execution of a PostLogin flow.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\nexports.onExecutePostLogin = async (event, api) => {\n console.log('Some custom action!');\n};\n\n/**\n * Handler that will be invoked when this action is resuming after an external redirect. If your\n * onExecutePostLogin function does not perform a redirect, this function can be safely ignored.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\n// exports.onContinuePostLogin = async (event, api) => {\n// };\n", "dependencies": [], "runtime": "node18", "status": "built", "secrets": [], "current_version": { - "id": "5b00cfd8-995b-428f-a908-7b162477d1eb", + "id": "9f712c5b-390c-46d5-92f1-899d62f0e892", "code": "/**\n * Handler that will be called during the execution of a PostLogin flow.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\nexports.onExecutePostLogin = async (event, api) => {\n console.log('Some custom action!');\n};\n\n/**\n * Handler that will be invoked when this action is resuming after an external redirect. If your\n * onExecutePostLogin function does not perform a redirect, this function can be safely ignored.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\n// exports.onContinuePostLogin = async (event, api) => {\n// };\n", "runtime": "node18", "status": "BUILT", "number": 1, - "build_time": "2025-12-05T07:01:48.911433236Z", - "created_at": "2025-12-05T07:01:48.828404196Z", - "updated_at": "2025-12-05T07:01:48.912374903Z" + "build_time": "2025-12-16T10:12:50.304956456Z", + "created_at": "2025-12-16T10:12:50.209634926Z", + "updated_at": "2025-12-16T10:12:50.307080188Z" }, "deployed_version": { "code": "/**\n * Handler that will be called during the execution of a PostLogin flow.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\nexports.onExecutePostLogin = async (event, api) => {\n console.log('Some custom action!');\n};\n\n/**\n * Handler that will be invoked when this action is resuming after an external redirect. If your\n * onExecutePostLogin function does not perform a redirect, this function can be safely ignored.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\n// exports.onContinuePostLogin = async (event, api) => {\n// };\n", "dependencies": [], - "id": "5b00cfd8-995b-428f-a908-7b162477d1eb", + "id": "9f712c5b-390c-46d5-92f1-899d62f0e892", "deployed": true, "number": 1, - "built_at": "2025-12-05T07:01:48.911433236Z", + "built_at": "2025-12-16T10:12:50.304956456Z", "secrets": [], "status": "built", - "created_at": "2025-12-05T07:01:48.828404196Z", - "updated_at": "2025-12-05T07:01:48.912374903Z", + "created_at": "2025-12-16T10:12:50.209634926Z", + "updated_at": "2025-12-16T10:12:50.307080188Z", "runtime": "node18", "supported_triggers": [ { @@ -20336,7 +19507,7 @@ "all_changes_deployed": true } ], - "total": 1, + "total": 2, "per_page": 100 }, "rawHeaders": [], @@ -20350,6 +19521,17 @@ "status": 200, "response": { "triggers": [ + { + "id": "post-login", + "version": "v2", + "status": "DEPRECATED", + "runtimes": [ + "node18" + ], + "default_runtime": "node16", + "binding_policy": "trigger-bound", + "compatible_triggers": [] + }, { "id": "post-login", "version": "v3", @@ -20367,33 +19549,12 @@ } ] }, - { - "id": "post-login", - "version": "v2", - "status": "DEPRECATED", - "runtimes": [ - "node18" - ], - "default_runtime": "node16", - "binding_policy": "trigger-bound", - "compatible_triggers": [] - }, - { - "id": "credentials-exchange", - "version": "v1", - "status": "DEPRECATED", - "runtimes": [ - "node12" - ], - "default_runtime": "node12", - "binding_policy": "trigger-bound", - "compatible_triggers": [] - }, { "id": "credentials-exchange", "version": "v2", "status": "CURRENT", "runtimes": [ + "node12", "node18-actions", "node22" ], @@ -20419,6 +19580,7 @@ "version": "v2", "status": "CURRENT", "runtimes": [ + "node12", "node18-actions", "node22" ], @@ -20426,22 +19588,12 @@ "binding_policy": "trigger-bound", "compatible_triggers": [] }, - { - "id": "post-change-password", - "version": "v1", - "status": "DEPRECATED", - "runtimes": [ - "node12" - ], - "default_runtime": "node12", - "binding_policy": "trigger-bound", - "compatible_triggers": [] - }, { "id": "post-change-password", "version": "v2", "status": "CURRENT", "runtimes": [ + "node12", "node18-actions", "node22" ], @@ -20532,6 +19684,17 @@ "default_runtime": "node22", "binding_policy": "entity-bound", "compatible_triggers": [] + }, + { + "id": "password-hash-migration", + "version": "v1", + "status": "CURRENT", + "runtimes": [ + "node22" + ], + "default_runtime": "node22", + "binding_policy": "entity-bound", + "compatible_triggers": [] } ] }, @@ -20541,12 +19704,12 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/actions/triggers/post-login/bindings", + "path": "/api/v2/actions/triggers/post-login/bindings?page=0&per_page=50", "body": "", "status": 200, "response": { "bindings": [], - "per_page": 20 + "per_page": 50 }, "rawHeaders": [], "responseIsBinary": false @@ -20554,12 +19717,12 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/actions/triggers/credentials-exchange/bindings", + "path": "/api/v2/actions/triggers/credentials-exchange/bindings?page=0&per_page=50", "body": "", "status": 200, "response": { "bindings": [], - "per_page": 20 + "per_page": 50 }, "rawHeaders": [], "responseIsBinary": false @@ -20567,12 +19730,12 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/actions/triggers/pre-user-registration/bindings", + "path": "/api/v2/actions/triggers/pre-user-registration/bindings?page=0&per_page=50", "body": "", "status": 200, "response": { "bindings": [], - "per_page": 20 + "per_page": 50 }, "rawHeaders": [], "responseIsBinary": false @@ -20580,12 +19743,12 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/actions/triggers/post-user-registration/bindings", + "path": "/api/v2/actions/triggers/post-user-registration/bindings?page=0&per_page=50", "body": "", "status": 200, "response": { "bindings": [], - "per_page": 20 + "per_page": 50 }, "rawHeaders": [], "responseIsBinary": false @@ -20593,12 +19756,12 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/actions/triggers/post-change-password/bindings", + "path": "/api/v2/actions/triggers/post-change-password/bindings?page=0&per_page=50", "body": "", "status": 200, "response": { "bindings": [], - "per_page": 20 + "per_page": 50 }, "rawHeaders": [], "responseIsBinary": false @@ -20606,12 +19769,12 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/actions/triggers/send-phone-message/bindings", + "path": "/api/v2/actions/triggers/send-phone-message/bindings?page=0&per_page=50", "body": "", "status": 200, "response": { "bindings": [], - "per_page": 20 + "per_page": 50 }, "rawHeaders": [], "responseIsBinary": false @@ -20619,12 +19782,12 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/actions/triggers/password-reset-post-challenge/bindings", + "path": "/api/v2/actions/triggers/password-reset-post-challenge/bindings?page=0&per_page=50", "body": "", "status": 200, "response": { "bindings": [], - "per_page": 20 + "per_page": 50 }, "rawHeaders": [], "responseIsBinary": false @@ -20632,12 +19795,76 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/actions/triggers/login-post-identifier/bindings", + "path": "/api/v2/actions/triggers/login-post-identifier/bindings?page=0&per_page=50", "body": "", "status": 200, "response": { "bindings": [], - "per_page": 20 + "per_page": 50 + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/actions/triggers/custom-phone-provider/bindings?page=0&per_page=50", + "body": "", + "status": 200, + "response": { + "bindings": [ + { + "id": "8685b798-7d18-47d3-9b3b-d1854a4525d0", + "trigger_id": "custom-phone-provider", + "action": { + "id": "ead7d2a3-5a93-43e2-9ec3-455f3c39daf9", + "name": "Custom Phone Provider", + "supported_triggers": [ + { + "id": "custom-phone-provider", + "version": "v1" + } + ], + "created_at": "2025-12-16T10:10:30.752146844Z", + "updated_at": "2025-12-16T10:11:36.902340019Z", + "current_version": { + "id": "83a87aec-f6f7-42bb-b6ad-6fa170f652d1", + "code": "/**\n* Handler to be executed while sending a phone notification\n* @param {Event} event - Details about the user and the context in which they are logging in.\n* @param {CustomPhoneProviderAPI} api - Methods and utilities to help change the behavior of sending a phone notification.\n*/\nexports.onExecuteCustomPhoneProvider = async (event, api) => {\n // Code goes here\n return;\n};", + "runtime": "node22", + "status": "BUILT", + "number": 2, + "build_time": "2025-12-16T10:11:37.710742601Z", + "created_at": "2025-12-16T10:11:37.627490560Z", + "updated_at": "2025-12-16T10:11:37.712144713Z" + }, + "deployed_version": { + "code": "/**\n* Handler to be executed while sending a phone notification\n* @param {Event} event - Details about the user and the context in which they are logging in.\n* @param {CustomPhoneProviderAPI} api - Methods and utilities to help change the behavior of sending a phone notification.\n*/\nexports.onExecuteCustomPhoneProvider = async (event, api) => {\n // Code goes here\n return;\n};", + "dependencies": [], + "id": "83a87aec-f6f7-42bb-b6ad-6fa170f652d1", + "deployed": true, + "number": 2, + "built_at": "2025-12-16T10:11:37.710742601Z", + "secrets": [], + "status": "built", + "created_at": "2025-12-16T10:11:37.627490560Z", + "updated_at": "2025-12-16T10:11:37.712144713Z", + "runtime": "node22", + "supported_triggers": [ + { + "id": "custom-phone-provider", + "version": "v1" + } + ] + }, + "all_changes_deployed": false + }, + "created_at": "2025-12-16T10:11:56.497757149Z", + "updated_at": "2025-12-16T10:11:56.497757149Z", + "display_name": "Custom Phone Provider" + } + ], + "total": 1, + "per_page": 50 }, "rawHeaders": [], "responseIsBinary": false @@ -20645,12 +19872,12 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/actions/triggers/custom-phone-provider/bindings", + "path": "/api/v2/actions/triggers/custom-email-provider/bindings?page=0&per_page=50", "body": "", "status": 200, "response": { "bindings": [], - "per_page": 20 + "per_page": 50 }, "rawHeaders": [], "responseIsBinary": false @@ -20658,12 +19885,12 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/actions/triggers/custom-email-provider/bindings", + "path": "/api/v2/actions/triggers/custom-token-exchange/bindings?page=0&per_page=50", "body": "", "status": 200, "response": { "bindings": [], - "per_page": 20 + "per_page": 50 }, "rawHeaders": [], "responseIsBinary": false @@ -20671,12 +19898,12 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/actions/triggers/custom-token-exchange/bindings", + "path": "/api/v2/actions/triggers/event-stream/bindings?page=0&per_page=50", "body": "", "status": 200, "response": { "bindings": [], - "per_page": 20 + "per_page": 50 }, "rawHeaders": [], "responseIsBinary": false @@ -20684,12 +19911,12 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/actions/triggers/event-stream/bindings", + "path": "/api/v2/actions/triggers/password-hash-migration/bindings?page=0&per_page=50", "body": "", "status": 200, "response": { "bindings": [], - "per_page": 20 + "per_page": 50 }, "rawHeaders": [], "responseIsBinary": false @@ -20697,13 +19924,18 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/organizations?include_totals=true", + "path": "/api/v2/organizations?take=50", "body": "", "status": 200, "response": { "organizations": [ { - "id": "org_nSblOG7yUuWAHLOG", + "id": "org_rupfjUkVVvnPPk1y", + "name": "org2", + "display_name": "Organization2" + }, + { + "id": "org_YQGLuGuqRYrilmSQ", "name": "org1", "display_name": "Organization", "branding": { @@ -20712,16 +19944,8 @@ "primary": "#57ddff" } } - }, - { - "id": "org_vhEUeSlhgjQLTFPE", - "name": "org2", - "display_name": "Organization2" } - ], - "start": 0, - "limit": 50, - "total": 2 + ] }, "rawHeaders": [], "responseIsBinary": false @@ -20819,7 +20043,7 @@ "subject": "deprecated" } ], - "client_id": "cLFFGtjp2Xe7HWQCHfCtQxmURfSu1lDH", + "client_id": "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -20872,7 +20096,7 @@ "subject": "deprecated" } ], - "client_id": "uf1Ju9xwQ09AWpcnRnwD91W3Sv3bf76S", + "client_id": "0ltKN06qv5WnNoNz2Fu6QvyOl2o6K6nE", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -20917,7 +20141,7 @@ "subject": "deprecated" } ], - "client_id": "WYPQxuqDdeNZHLcJeuPq0AvuNFtMiUgU", + "client_id": "HC5UXDFP5lEc2vbTkPQWJ1yYeiLRkmDg", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -20971,7 +20195,7 @@ } ], "allowed_origins": [], - "client_id": "QwKFSZ87TYF89lXp66sVFpGzYGQ07OU6", + "client_id": "KjqnjAT6PWajvX3XKVkWhFVaW8sFBWyv", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -21017,7 +20241,7 @@ "subject": "deprecated" } ], - "client_id": "VvKPDeB2QHhtG4tVBNcrRUuChB0jWefu", + "client_id": "GH55Wtak9aTrj6tjRFObq1cqnu5a8mtM", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -21036,14 +20260,9 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "Test SPA", + "name": "The Default App", "allowed_clients": [], - "allowed_logout_urls": [ - "http://localhost:3000" - ], - "callbacks": [ - "http://localhost:3000" - ], + "callbacks": [], "client_metadata": {}, "is_first_party": true, "native_social_login": { @@ -21054,16 +20273,17 @@ "enabled": false } }, - "oidc_conformant": true, + "oidc_conformant": false, "refresh_token": { - "expiration_type": "expiring", + "expiration_type": "non-expiring", "leeway": 0, + "infinite_token_lifetime": true, + "infinite_idle_token_lifetime": true, "token_lifetime": 2592000, "idle_token_lifetime": 1296000, - "infinite_token_lifetime": false, - "infinite_idle_token_lifetime": false, - "rotation_type": "rotating" + "rotation_type": "non-rotating" }, + "sso": false, "sso_disabled": false, "cross_origin_authentication": false, "cross_origin_auth": false, @@ -21074,7 +20294,7 @@ "subject": "deprecated" } ], - "client_id": "xODbqyam7rjqHDsYKjU9Tuo99yaBnR5T", + "client_id": "ahrUt7DkBom8m2EAs0zLSccaylYIuVfF", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -21083,15 +20303,12 @@ "secret_encoded": false }, "client_aliases": [], - "token_endpoint_auth_method": "none", - "app_type": "spa", + "token_endpoint_auth_method": "client_secret_post", "grant_types": [ "authorization_code", "implicit", - "refresh_token" - ], - "web_origins": [ - "http://localhost:3000" + "refresh_token", + "client_credentials" ], "custom_login_page_on": true }, @@ -21099,9 +20316,14 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "auth0-deploy-cli-extension", + "name": "Test SPA", "allowed_clients": [], - "callbacks": [], + "allowed_logout_urls": [ + "http://localhost:3000" + ], + "callbacks": [ + "http://localhost:3000" + ], "client_metadata": {}, "is_first_party": true, "native_social_login": { @@ -21114,13 +20336,13 @@ }, "oidc_conformant": true, "refresh_token": { - "expiration_type": "non-expiring", + "expiration_type": "expiring", "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" + "token_lifetime": 2592000, + "idle_token_lifetime": 1296000, + "infinite_token_lifetime": false, + "infinite_idle_token_lifetime": false, + "rotation_type": "rotating" }, "sso_disabled": false, "cross_origin_authentication": false, @@ -21132,7 +20354,7 @@ "subject": "deprecated" } ], - "client_id": "gGel1LbswqDqdnqQ39oHycLldkhJZ8c1", + "client_id": "68Ty4a89yPogS0UGdX8aYaS6td9DXYjs", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -21141,10 +20363,15 @@ "secret_encoded": false }, "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", + "token_endpoint_auth_method": "none", + "app_type": "spa", "grant_types": [ - "client_credentials" + "authorization_code", + "implicit", + "refresh_token" + ], + "web_origins": [ + "http://localhost:3000" ], "custom_login_page_on": true }, @@ -21152,7 +20379,7 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "The Default App", + "name": "auth0-deploy-cli-extension", "allowed_clients": [], "callbacks": [], "client_metadata": {}, @@ -21165,17 +20392,16 @@ "enabled": false } }, - "oidc_conformant": false, + "oidc_conformant": true, "refresh_token": { "expiration_type": "non-expiring", "leeway": 0, "infinite_token_lifetime": true, "infinite_idle_token_lifetime": true, - "token_lifetime": 2592000, - "idle_token_lifetime": 1296000, + "token_lifetime": 31557600, + "idle_token_lifetime": 2592000, "rotation_type": "non-rotating" }, - "sso": false, "sso_disabled": false, "cross_origin_authentication": false, "cross_origin_auth": false, @@ -21186,7 +20412,7 @@ "subject": "deprecated" } ], - "client_id": "xYOv2UsoAuKptIEAjkeB62Oaeg1Jn2QX", + "client_id": "1TbnVO0y41cPrTLC7HvGKQswbGETjlOU", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -21196,10 +20422,8 @@ }, "client_aliases": [], "token_endpoint_auth_method": "client_secret_post", + "app_type": "non_interactive", "grant_types": [ - "authorization_code", - "implicit", - "refresh_token", "client_credentials" ], "custom_login_page_on": true @@ -21249,28 +20473,14 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/organizations?include_totals=true&take=50", + "path": "/api/v2/organizations/org_rupfjUkVVvnPPk1y/enabled_connections?page=0&per_page=50&include_totals=true", "body": "", "status": 200, "response": { - "organizations": [ - { - "id": "org_nSblOG7yUuWAHLOG", - "name": "org1", - "display_name": "Organization", - "branding": { - "colors": { - "page_background": "#fff5f5", - "primary": "#57ddff" - } - } - }, - { - "id": "org_vhEUeSlhgjQLTFPE", - "name": "org2", - "display_name": "Organization2" - } - ] + "enabled_connections": [], + "start": 0, + "limit": 0, + "total": 0 }, "rawHeaders": [], "responseIsBinary": false @@ -21278,23 +20488,43 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/organizations/org_nSblOG7yUuWAHLOG/enabled_connections", + "path": "/api/v2/organizations/org_rupfjUkVVvnPPk1y/enabled_connections?page=1&per_page=50&include_totals=true", "body": "", "status": 200, - "response": [], + "response": { + "enabled_connections": [], + "start": 0, + "limit": 0, + "total": 0 + }, "rawHeaders": [], "responseIsBinary": false }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/organizations/org_nSblOG7yUuWAHLOG/client-grants?page=0&per_page=100&include_totals=true", + "path": "/api/v2/organizations/org_rupfjUkVVvnPPk1y/client-grants?page=0&per_page=50&include_totals=true", "body": "", "status": 200, "response": { "client_grants": [], "start": 0, - "limit": 100, + "limit": 50, + "total": 0 + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/organizations/org_rupfjUkVVvnPPk1y/client-grants?page=1&per_page=50&include_totals=true", + "body": "", + "status": 200, + "response": { + "client_grants": [], + "start": 50, + "limit": 50, "total": 0 }, "rawHeaders": [], @@ -21303,7 +20533,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/organizations/org_nSblOG7yUuWAHLOG/discovery-domains?take=50", + "path": "/api/v2/organizations/org_rupfjUkVVvnPPk1y/discovery-domains?take=50", "body": "", "status": 200, "response": { @@ -21315,23 +20545,70 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/organizations/org_vhEUeSlhgjQLTFPE/enabled_connections", + "path": "/api/v2/organizations/org_rupfjUkVVvnPPk1y/discovery-domains?take=50", "body": "", "status": 200, - "response": [], + "response": { + "domains": [] + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/organizations/org_YQGLuGuqRYrilmSQ/enabled_connections?page=0&per_page=50&include_totals=true", + "body": "", + "status": 200, + "response": { + "enabled_connections": [], + "start": 0, + "limit": 0, + "total": 0 + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/organizations/org_YQGLuGuqRYrilmSQ/enabled_connections?page=1&per_page=50&include_totals=true", + "body": "", + "status": 200, + "response": { + "enabled_connections": [], + "start": 0, + "limit": 0, + "total": 0 + }, "rawHeaders": [], "responseIsBinary": false }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/organizations/org_vhEUeSlhgjQLTFPE/client-grants?page=0&per_page=100&include_totals=true", + "path": "/api/v2/organizations/org_YQGLuGuqRYrilmSQ/client-grants?page=0&per_page=50&include_totals=true", "body": "", "status": 200, "response": { "client_grants": [], "start": 0, - "limit": 100, + "limit": 50, + "total": 0 + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/organizations/org_YQGLuGuqRYrilmSQ/client-grants?page=1&per_page=50&include_totals=true", + "body": "", + "status": 200, + "response": { + "client_grants": [], + "start": 50, + "limit": 50, "total": 0 }, "rawHeaders": [], @@ -21340,7 +20617,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/organizations/org_vhEUeSlhgjQLTFPE/discovery-domains?take=50", + "path": "/api/v2/organizations/org_YQGLuGuqRYrilmSQ/discovery-domains?take=50", "body": "", "status": 200, "response": { @@ -21352,22 +20629,11 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/attack-protection/breached-password-detection", + "path": "/api/v2/organizations/org_YQGLuGuqRYrilmSQ/discovery-domains?take=50", "body": "", "status": 200, "response": { - "enabled": false, - "shields": [], - "admin_notification_frequency": [], - "method": "standard", - "stage": { - "pre-user-registration": { - "shields": [] - }, - "pre-change-password": { - "shields": [] - } - } + "domains": [] }, "rawHeaders": [], "responseIsBinary": false @@ -21391,6 +20657,29 @@ "rawHeaders": [], "responseIsBinary": false }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/attack-protection/breached-password-detection", + "body": "", + "status": 200, + "response": { + "enabled": false, + "shields": [], + "admin_notification_frequency": [], + "method": "standard", + "stage": { + "pre-user-registration": { + "shields": [] + }, + "pre-change-password": { + "shields": [] + } + } + }, + "rawHeaders": [], + "responseIsBinary": false + }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", @@ -21412,6 +20701,10 @@ "pre-user-registration": { "max_attempts": 50, "rate": 1200 + }, + "pre-custom-token-exchange": { + "max_attempts": 10, + "rate": 600000 } } }, @@ -21478,7 +20771,7 @@ "status": 200, "response": [ { - "id": "lst_0000000000025415", + "id": "lst_0000000000025597", "name": "Suspended DD Log Stream", "type": "datadog", "status": "active", @@ -21489,14 +20782,14 @@ "isPriority": false }, { - "id": "lst_0000000000025416", + "id": "lst_0000000000025598", "name": "Amazon EventBridge", "type": "eventbridge", "status": "active", "sink": { "awsAccountId": "123456789012", "awsRegion": "us-east-2", - "awsPartnerEventSource": "aws.partner/auth0.com/auth0-deploy-cli-e2e-48aadbd2-ae4f-4553-9c92-75eebc8c63cd/auth0.logs" + "awsPartnerEventSource": "aws.partner/auth0.com/auth0-deploy-cli-e2e-7022a134-25ea-40c6-8164-cf25c35ee97d/auth0.logs" }, "filters": [ { @@ -21555,11 +20848,14 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/custom-domains?take=50", + "path": "/api/v2/branding/themes/default", "body": "", - "status": 200, + "status": 404, "response": { - "custom_domains": [] + "statusCode": 404, + "error": "Not Found", + "message": "There was an error retrieving branding settings: invalid theme ID", + "errorCode": "theme_not_found" }, "rawHeaders": [], "responseIsBinary": false @@ -21567,14 +20863,14 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/branding/themes/default", + "path": "/api/v2/flows?page=0&per_page=100&include_totals=true", "body": "", - "status": 404, + "status": 200, "response": { - "statusCode": 404, - "error": "Not Found", - "message": "There was an error retrieving branding settings: invalid theme ID", - "errorCode": "theme_not_found" + "limit": 100, + "start": 0, + "total": 0, + "flows": [] }, "rawHeaders": [], "responseIsBinary": false @@ -21595,28 +20891,13 @@ "name": "Blank-form", "flow_count": 0, "created_at": "2024-11-26T11:58:18.187Z", - "updated_at": "2025-12-05T07:02:16.657Z" + "updated_at": "2025-12-16T10:13:11.443Z" } ] }, "rawHeaders": [], "responseIsBinary": false }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/flows?page=0&per_page=100&include_totals=true", - "body": "", - "status": 200, - "response": { - "limit": 100, - "start": 0, - "total": 0, - "flows": [] - }, - "rawHeaders": [], - "responseIsBinary": false - }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", @@ -21681,7 +20962,7 @@ } }, "created_at": "2024-11-26T11:58:18.187Z", - "updated_at": "2025-12-05T07:02:16.657Z" + "updated_at": "2025-12-16T10:13:11.443Z" }, "rawHeaders": [], "responseIsBinary": false @@ -21704,11 +20985,11 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/flows/vault/connections?page=0&per_page=100&include_totals=true", + "path": "/api/v2/flows/vault/connections?page=0&per_page=50&include_totals=true", "body": "", "status": 200, "response": { - "limit": 100, + "limit": 50, "start": 0, "total": 0, "connections": [] @@ -21719,11 +21000,26 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/flows/vault/connections?page=0&per_page=100&include_totals=true", + "path": "/api/v2/flows/vault/connections?page=1&per_page=50&include_totals=true", "body": "", "status": 200, "response": { - "limit": 100, + "limit": 50, + "start": 50, + "total": 0, + "connections": [] + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/flows/vault/connections?page=0&per_page=50&include_totals=true", + "body": "", + "status": 200, + "response": { + "limit": 50, "start": 0, "total": 0, "connections": [] @@ -21731,6 +21027,21 @@ "rawHeaders": [], "responseIsBinary": false }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/flows/vault/connections?page=1&per_page=50&include_totals=true", + "body": "", + "status": 200, + "response": { + "limit": 50, + "start": 50, + "total": 0, + "connections": [] + }, + "rawHeaders": [], + "responseIsBinary": false + }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", @@ -21760,7 +21071,7 @@ "okta" ], "created_at": "2024-11-26T11:58:18.962Z", - "updated_at": "2025-12-05T07:02:09.046Z", + "updated_at": "2025-12-16T10:13:05.041Z", "branding": { "colors": { "primary": "#19aecc" @@ -21812,7 +21123,7 @@ } }, "created_at": "2025-09-09T04:41:43.671Z", - "updated_at": "2025-12-05T07:01:50.211Z", + "updated_at": "2025-12-16T10:12:51.416Z", "id": "acl_wpZ6oScRU5L6QKAxMUMHmx" } ] @@ -21875,61 +21186,6 @@ "rawHeaders": [], "responseIsBinary": false }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/user-attribute-profiles?take=10", - "body": "", - "status": 200, - "response": { - "user_attribute_profiles": [ - { - "id": "uap_1csDj3szFsgxGS1oTZTdFm", - "name": "test-user-attribute-profile-2", - "user_id": { - "oidc_mapping": "sub", - "saml_mapping": [ - "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier", - "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn", - "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name" - ], - "scim_mapping": "externalId" - }, - "user_attributes": { - "email": { - "label": "Email", - "description": "Email of the User", - "auth0_mapping": "email", - "profile_required": true - } - } - }, - { - "id": "uap_1csDj3sAVu6n5eTzLw6XZg", - "name": "test-user-attribute-profile", - "user_id": { - "oidc_mapping": "sub", - "saml_mapping": [ - "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier", - "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn", - "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name" - ], - "scim_mapping": "externalId" - }, - "user_attributes": { - "email": { - "label": "Email", - "description": "Email of the User", - "auth0_mapping": "email", - "profile_required": true - } - } - } - ] - }, - "rawHeaders": [], - "responseIsBinary": false - }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", @@ -21945,11 +21201,14 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connection-profiles?take=10", + "path": "/api/v2/token-exchange-profiles?take=50", "body": "", - "status": 200, + "status": 403, "response": { - "connection_profiles": [] + "statusCode": 403, + "error": "Forbidden", + "message": "Insufficient scope, expected any of: read:token_exchange_profiles", + "errorCode": "insufficient_scope" }, "rawHeaders": [], "responseIsBinary": false diff --git a/test/e2e/recordings/should-deploy-without-throwing-an-error.json b/test/e2e/recordings/should-deploy-without-throwing-an-error.json index 45e1f1594..7b9090a4c 100644 --- a/test/e2e/recordings/should-deploy-without-throwing-an-error.json +++ b/test/e2e/recordings/should-deploy-without-throwing-an-error.json @@ -924,6 +924,22 @@ "value": "delete:organization_client_grants", "description": "Delete Organization Client Grants" }, + { + "value": "create:token_exchange_profiles", + "description": "Create Token Exchange Profile" + }, + { + "value": "read:token_exchange_profiles", + "description": "Read Token Exchange Profiles" + }, + { + "value": "update:token_exchange_profiles", + "description": "Update Token Exchange Profile" + }, + { + "value": "delete:token_exchange_profiles", + "description": "Delete Token Exchange Profile" + }, { "value": "read:security_metrics", "description": "Read Security Metrics" @@ -955,7 +971,7 @@ "body": "", "status": 200, "response": { - "total": 9, + "total": 2, "start": 0, "limit": 100, "clients": [ @@ -1020,7 +1036,6 @@ "is_token_endpoint_ip_header_trusted": false, "name": "Default App", "callbacks": [], - "cross_origin_auth": false, "is_first_party": true, "oidc_conformant": true, "refresh_token": { @@ -1034,112 +1049,6 @@ }, "sso_disabled": false, "cross_origin_authentication": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "dMsTNDvIh3YcBOuWaSGDLKJeI6pUcWwZ", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "grant_types": [ - "authorization_code", - "implicit", - "refresh_token", - "client_credentials" - ], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "API Explorer Application", - "allowed_clients": [], - "callbacks": [], - "client_metadata": {}, - "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "uuEKiBwEtHSFm9qiQoUrnbFg55ZD63QW", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", - "grant_types": [ - "client_credentials" - ], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Node App", - "allowed_clients": [], - "allowed_logout_urls": [], - "callbacks": [], - "client_metadata": {}, - "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, "cross_origin_auth": false, "signing_keys": [ { @@ -1148,8 +1057,7 @@ "subject": "deprecated" } ], - "allowed_origins": [], - "client_id": "k15LH4UseegSadRNaQhwB1sRTLPSLBTo", + "client_id": "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -1157,342 +1065,81 @@ "lifetime_in_seconds": 36000, "secret_encoded": false }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "regular_web", "grant_types": [ "authorization_code", "implicit", "refresh_token", "client_credentials" ], - "web_origins": [], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Quickstarts API (Test Application)", - "client_metadata": { - "foo": "bar" - }, - "is_first_party": true, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "PLgyapzr13G0aryQTRzgSsMJ9dbbYvqp", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", - "grant_types": [ - "client_credentials" - ], "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "The Default App", - "allowed_clients": [], - "callbacks": [], - "client_metadata": {}, - "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "oidc_conformant": false, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 2592000, - "idle_token_lifetime": 1296000, - "rotation_type": "non-rotating" - }, - "sso": false, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "uw8hjIHcxeL2LaKGbBtFGwEdPXkzhWl3", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "grant_types": [ - "authorization_code", - "implicit", - "refresh_token", - "client_credentials" - ], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Terraform Provider", - "is_first_party": true, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "KsK8Stn8v2U4JSoYY6QEcDcSFyDqratO", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", - "grant_types": [ - "client_credentials" - ], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Test SPA", - "allowed_clients": [], - "allowed_logout_urls": [ - "http://localhost:3000" - ], - "callbacks": [ - "http://localhost:3000" - ], - "client_metadata": {}, - "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "expiring", - "leeway": 0, - "token_lifetime": 2592000, - "idle_token_lifetime": 1296000, - "infinite_token_lifetime": false, - "infinite_idle_token_lifetime": false, - "rotation_type": "rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "WM7pCOae5czoa1vUFr8vLEnX8pyoNgYV", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "client_aliases": [], - "token_endpoint_auth_method": "none", - "app_type": "spa", - "grant_types": [ - "authorization_code", - "implicit", - "refresh_token" - ], - "web_origins": [ - "http://localhost:3000" - ], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "auth0-deploy-cli-extension", - "allowed_clients": [], - "callbacks": [], - "client_metadata": {}, - "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "CFSqJJvGh1dleeE9m7FXd52VbNTG6z5g", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", - "grant_types": [ - "client_credentials" - ], - "custom_login_page_on": true - } - ] - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "PATCH", - "path": "/api/v2/clients/dMsTNDvIh3YcBOuWaSGDLKJeI6pUcWwZ", - "body": { - "name": "Default App", - "callbacks": [], - "custom_login_page_on": true, - "grant_types": [ - "authorization_code", - "implicit", - "refresh_token", - "client_credentials" - ], - "is_first_party": true, - "is_token_endpoint_ip_header_trusted": false, - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000 - }, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 2592000, - "idle_token_lifetime": 1296000, - "rotation_type": "non-rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false - }, - "status": 200, - "response": { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Default App", - "callbacks": [], - "cross_origin_auth": false, - "is_first_party": true, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 2592000, - "idle_token_lifetime": 1296000, - "rotation_type": "non-rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "signing_keys": [ + } + ] + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "PATCH", + "path": "/api/v2/clients/lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V", + "body": { + "name": "Default App", + "callbacks": [], + "custom_login_page_on": true, + "grant_types": [ + "authorization_code", + "implicit", + "refresh_token", + "client_credentials" + ], + "is_first_party": true, + "is_token_endpoint_ip_header_trusted": false, + "jwt_configuration": { + "alg": "RS256", + "lifetime_in_seconds": 36000 + }, + "oidc_conformant": true, + "refresh_token": { + "expiration_type": "non-expiring", + "leeway": 0, + "infinite_token_lifetime": true, + "infinite_idle_token_lifetime": true, + "token_lifetime": 2592000, + "idle_token_lifetime": 1296000, + "rotation_type": "non-rotating" + }, + "sso_disabled": false, + "cross_origin_authentication": false + }, + "status": 200, + "response": { + "tenant": "auth0-deploy-cli-e2e", + "global": false, + "is_token_endpoint_ip_header_trusted": false, + "name": "Default App", + "callbacks": [], + "is_first_party": true, + "oidc_conformant": true, + "refresh_token": { + "expiration_type": "non-expiring", + "leeway": 0, + "infinite_token_lifetime": true, + "infinite_idle_token_lifetime": true, + "token_lifetime": 2592000, + "idle_token_lifetime": 1296000, + "rotation_type": "non-rotating" + }, + "sso_disabled": false, + "cross_origin_authentication": false, + "cross_origin_auth": false, + "signing_keys": [ { "cert": "[REDACTED]", "pkcs7": "[REDACTED]", "subject": "/CN=auth0-deploy-cli-e2e.us.auth0.com" } ], - "client_id": "dMsTNDvIh3YcBOuWaSGDLKJeI6pUcWwZ", + "client_id": "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -1528,7 +1175,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PUT", - "path": "/api/v2/guardian/factors/otp", + "path": "/api/v2/guardian/factors/webauthn-platform", "body": { "enabled": false }, @@ -1542,7 +1189,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PUT", - "path": "/api/v2/guardian/factors/sms", + "path": "/api/v2/guardian/factors/push-notification", "body": { "enabled": false }, @@ -1556,7 +1203,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PUT", - "path": "/api/v2/guardian/factors/push-notification", + "path": "/api/v2/guardian/factors/otp", "body": { "enabled": false }, @@ -1570,7 +1217,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PUT", - "path": "/api/v2/guardian/factors/webauthn-platform", + "path": "/api/v2/guardian/factors/recovery-code", "body": { "enabled": false }, @@ -1584,7 +1231,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PUT", - "path": "/api/v2/guardian/factors/email", + "path": "/api/v2/guardian/factors/sms", "body": { "enabled": false }, @@ -1598,7 +1245,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PUT", - "path": "/api/v2/guardian/factors/recovery-code", + "path": "/api/v2/guardian/factors/email", "body": { "enabled": false }, @@ -1683,56 +1330,7 @@ "body": "", "status": 200, "response": { - "actions": [ - { - "id": "c2e2e98a-3975-485c-8e1e-0603b4ba550b", - "name": "My Custom Action", - "supported_triggers": [ - { - "id": "post-login", - "version": "v2" - } - ], - "created_at": "2025-12-04T09:14:37.431728383Z", - "updated_at": "2025-12-04T09:14:37.443728176Z", - "code": "/**\n * Handler that will be called during the execution of a PostLogin flow.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\nexports.onExecutePostLogin = async (event, api) => {\n console.log('Some custom action!');\n};\n\n/**\n * Handler that will be invoked when this action is resuming after an external redirect. If your\n * onExecutePostLogin function does not perform a redirect, this function can be safely ignored.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\n// exports.onContinuePostLogin = async (event, api) => {\n// };\n", - "dependencies": [], - "runtime": "node18", - "status": "built", - "secrets": [], - "current_version": { - "id": "b4d48cba-8883-45e3-b9c7-e0f4c4df0002", - "code": "/**\n * Handler that will be called during the execution of a PostLogin flow.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\nexports.onExecutePostLogin = async (event, api) => {\n console.log('Some custom action!');\n};\n\n/**\n * Handler that will be invoked when this action is resuming after an external redirect. If your\n * onExecutePostLogin function does not perform a redirect, this function can be safely ignored.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\n// exports.onContinuePostLogin = async (event, api) => {\n// };\n", - "runtime": "node18", - "status": "BUILT", - "number": 1, - "build_time": "2025-12-04T09:14:38.259756785Z", - "created_at": "2025-12-04T09:14:38.200367599Z", - "updated_at": "2025-12-04T09:14:38.260099232Z" - }, - "deployed_version": { - "code": "/**\n * Handler that will be called during the execution of a PostLogin flow.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\nexports.onExecutePostLogin = async (event, api) => {\n console.log('Some custom action!');\n};\n\n/**\n * Handler that will be invoked when this action is resuming after an external redirect. If your\n * onExecutePostLogin function does not perform a redirect, this function can be safely ignored.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\n// exports.onContinuePostLogin = async (event, api) => {\n// };\n", - "dependencies": [], - "id": "b4d48cba-8883-45e3-b9c7-e0f4c4df0002", - "deployed": true, - "number": 1, - "built_at": "2025-12-04T09:14:38.259756785Z", - "secrets": [], - "status": "built", - "created_at": "2025-12-04T09:14:38.200367599Z", - "updated_at": "2025-12-04T09:14:38.260099232Z", - "runtime": "node18", - "supported_triggers": [ - { - "id": "post-login", - "version": "v2" - } - ] - }, - "all_changes_deployed": true - } - ], - "total": 1, + "actions": [], "per_page": 100 }, "rawHeaders": [], @@ -1745,56 +1343,7 @@ "body": "", "status": 200, "response": { - "actions": [ - { - "id": "c2e2e98a-3975-485c-8e1e-0603b4ba550b", - "name": "My Custom Action", - "supported_triggers": [ - { - "id": "post-login", - "version": "v2" - } - ], - "created_at": "2025-12-04T09:14:37.431728383Z", - "updated_at": "2025-12-04T09:14:37.443728176Z", - "code": "/**\n * Handler that will be called during the execution of a PostLogin flow.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\nexports.onExecutePostLogin = async (event, api) => {\n console.log('Some custom action!');\n};\n\n/**\n * Handler that will be invoked when this action is resuming after an external redirect. If your\n * onExecutePostLogin function does not perform a redirect, this function can be safely ignored.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\n// exports.onContinuePostLogin = async (event, api) => {\n// };\n", - "dependencies": [], - "runtime": "node18", - "status": "built", - "secrets": [], - "current_version": { - "id": "b4d48cba-8883-45e3-b9c7-e0f4c4df0002", - "code": "/**\n * Handler that will be called during the execution of a PostLogin flow.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\nexports.onExecutePostLogin = async (event, api) => {\n console.log('Some custom action!');\n};\n\n/**\n * Handler that will be invoked when this action is resuming after an external redirect. If your\n * onExecutePostLogin function does not perform a redirect, this function can be safely ignored.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\n// exports.onContinuePostLogin = async (event, api) => {\n// };\n", - "runtime": "node18", - "status": "BUILT", - "number": 1, - "build_time": "2025-12-04T09:14:38.259756785Z", - "created_at": "2025-12-04T09:14:38.200367599Z", - "updated_at": "2025-12-04T09:14:38.260099232Z" - }, - "deployed_version": { - "code": "/**\n * Handler that will be called during the execution of a PostLogin flow.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\nexports.onExecutePostLogin = async (event, api) => {\n console.log('Some custom action!');\n};\n\n/**\n * Handler that will be invoked when this action is resuming after an external redirect. If your\n * onExecutePostLogin function does not perform a redirect, this function can be safely ignored.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\n// exports.onContinuePostLogin = async (event, api) => {\n// };\n", - "dependencies": [], - "id": "b4d48cba-8883-45e3-b9c7-e0f4c4df0002", - "deployed": true, - "number": 1, - "built_at": "2025-12-04T09:14:38.259756785Z", - "secrets": [], - "status": "built", - "created_at": "2025-12-04T09:14:38.200367599Z", - "updated_at": "2025-12-04T09:14:38.260099232Z", - "runtime": "node18", - "supported_triggers": [ - { - "id": "post-login", - "version": "v2" - } - ] - }, - "all_changes_deployed": true - } - ], - "total": 1, + "actions": [], "per_page": 100 }, "rawHeaders": [], @@ -1803,42 +1352,14 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PATCH", - "path": "/api/v2/attack-protection/breached-password-detection", + "path": "/api/v2/attack-protection/suspicious-ip-throttling", "body": { - "enabled": false, - "shields": [], - "admin_notification_frequency": [], - "method": "standard" - }, - "status": 200, - "response": { - "enabled": false, - "shields": [], - "admin_notification_frequency": [], - "method": "standard", - "stage": { - "pre-user-registration": { - "shields": [] - }, - "pre-change-password": { - "shields": [] - } - } - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "PATCH", - "path": "/api/v2/attack-protection/suspicious-ip-throttling", - "body": { - "enabled": true, - "shields": [ - "admin_notification", - "block" - ], - "allowlist": [], + "enabled": true, + "shields": [ + "admin_notification", + "block" + ], + "allowlist": [], "stage": { "pre-login": { "max_attempts": 100, @@ -1866,6 +1387,10 @@ "pre-user-registration": { "max_attempts": 50, "rate": 1200 + }, + "pre-custom-token-exchange": { + "max_attempts": 10, + "rate": 600000 } } }, @@ -1902,23 +1427,39 @@ }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/custom-domains", - "body": "", + "method": "PATCH", + "path": "/api/v2/attack-protection/breached-password-detection", + "body": { + "enabled": false, + "shields": [], + "admin_notification_frequency": [], + "method": "standard" + }, "status": 200, - "response": [], + "response": { + "enabled": false, + "shields": [], + "admin_notification_frequency": [], + "method": "standard", + "stage": { + "pre-user-registration": { + "shields": [] + }, + "pre-change-password": { + "shields": [] + } + } + }, "rawHeaders": [], "responseIsBinary": false }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/custom-domains?take=50", + "path": "/api/v2/custom-domains", "body": "", "status": 200, - "response": { - "custom_domains": [] - }, + "response": [], "rawHeaders": [], "responseIsBinary": false }, @@ -1929,7 +1470,7 @@ "body": "", "status": 200, "response": { - "total": 10, + "total": 3, "start": 0, "limit": 100, "clients": [ @@ -1994,7 +1535,6 @@ "is_token_endpoint_ip_header_trusted": false, "name": "Default App", "callbacks": [], - "cross_origin_auth": false, "is_first_party": true, "oidc_conformant": true, "refresh_token": { @@ -2008,6 +1548,7 @@ }, "sso_disabled": false, "cross_origin_authentication": false, + "cross_origin_auth": false, "signing_keys": [ { "cert": "[REDACTED]", @@ -2015,7 +1556,7 @@ "subject": "deprecated" } ], - "client_id": "dMsTNDvIh3YcBOuWaSGDLKJeI6pUcWwZ", + "client_id": "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -2033,34 +1574,30 @@ }, { "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "API Explorer Application", - "allowed_clients": [], + "global": true, "callbacks": [], - "client_metadata": {}, "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "oidc_conformant": true, + "name": "All Applications", "refresh_token": { "expiration_type": "non-expiring", "leeway": 0, "infinite_token_lifetime": true, "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, + "token_lifetime": 2592000, + "idle_token_lifetime": 1296000, "rotation_type": "non-rotating" }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, + "owners": [ + "mr|samlp|okta|will.vedder@auth0.com", + "mr|google-oauth2|102002633619863830825", + "mr|samlp|okta|frederik.prijck@auth0.com", + "mr|google-oauth2|109614534713742077035", + "mr|google-oauth2|116771660953104383819", + "mr|google-oauth2|112839029247827700155", + "mr|samlp|okta|ewan.harris@auth0.com" + ], + "custom_login_page": "TEST123\n", + "cross_origin_authentication": true, "signing_keys": [ { "cert": "[REDACTED]", @@ -2068,134 +1605,348 @@ "subject": "deprecated" } ], - "client_id": "uuEKiBwEtHSFm9qiQoUrnbFg55ZD63QW", - "callback_url_template": false, + "client_id": "Isi93ibGHIGwmdYjsLwTOn7Gu7nwxU3V", "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", - "grant_types": [ - "client_credentials" - ], "custom_login_page_on": true - }, + } + ] + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/connections?take=50&strategy=auth0", + "body": "", + "status": 200, + "response": { + "connections": [ { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Node App", - "allowed_clients": [], - "allowed_logout_urls": [], - "callbacks": [], - "client_metadata": {}, - "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false + "id": "con_3R2lX4rln4ArocW5", + "options": { + "mfa": { + "active": true, + "return_enroll_settings": true }, - "facebook": { - "enabled": false - } + "passwordPolicy": "good", + "passkey_options": { + "challenge_ui": "both", + "local_enrollment_enabled": true, + "progressive_enrollment_enabled": true + }, + "strategy_version": 2, + "authentication_methods": { + "passkey": { + "enabled": false + }, + "password": { + "enabled": true, + "api_behavior": "required" + } + }, + "brute_force_protection": true }, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" + "strategy": "auth0", + "name": "Username-Password-Authentication", + "is_domain_connection": false, + "authentication": { + "active": true }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "allowed_origins": [], - "client_id": "k15LH4UseegSadRNaQhwB1sRTLPSLBTo", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false + "connected_accounts": { + "active": false }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "regular_web", - "grant_types": [ - "authorization_code", - "implicit", - "refresh_token", - "client_credentials" + "realms": [ + "Username-Password-Authentication" ], - "web_origins": [], - "custom_login_page_on": true - }, + "enabled_clients": [ + "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", + "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" + ] + } + ] + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/connections?take=50&strategy=auth0", + "body": "", + "status": 200, + "response": { + "connections": [ { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Quickstarts API (Test Application)", - "client_metadata": { - "foo": "bar" + "id": "con_3R2lX4rln4ArocW5", + "options": { + "mfa": { + "active": true, + "return_enroll_settings": true + }, + "passwordPolicy": "good", + "passkey_options": { + "challenge_ui": "both", + "local_enrollment_enabled": true, + "progressive_enrollment_enabled": true + }, + "strategy_version": 2, + "authentication_methods": { + "passkey": { + "enabled": false + }, + "password": { + "enabled": true, + "api_behavior": "required" + } + }, + "brute_force_protection": true }, - "is_first_party": true, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" + "strategy": "auth0", + "name": "Username-Password-Authentication", + "is_domain_connection": false, + "authentication": { + "active": true }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "PLgyapzr13G0aryQTRzgSsMJ9dbbYvqp", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false + "connected_accounts": { + "active": false }, - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", - "grant_types": [ - "client_credentials" + "realms": [ + "Username-Password-Authentication" ], - "custom_login_page_on": true + "enabled_clients": [ + "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", + "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" + ] + } + ] + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/connections/con_3R2lX4rln4ArocW5/clients?take=50", + "body": "", + "status": 200, + "response": { + "clients": [ + { + "client_id": "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" + }, + { + "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE" + } + ] + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/connections/con_3R2lX4rln4ArocW5/clients?take=50", + "body": "", + "status": 200, + "response": { + "clients": [ + { + "client_id": "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" + }, + { + "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE" + } + ] + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/connections/con_3R2lX4rln4ArocW5", + "body": "", + "status": 200, + "response": { + "id": "con_3R2lX4rln4ArocW5", + "options": { + "mfa": { + "active": true, + "return_enroll_settings": true + }, + "passwordPolicy": "good", + "passkey_options": { + "challenge_ui": "both", + "local_enrollment_enabled": true, + "progressive_enrollment_enabled": true + }, + "strategy_version": 2, + "authentication_methods": { + "passkey": { + "enabled": false + }, + "password": { + "enabled": true, + "api_behavior": "required" + } + }, + "brute_force_protection": true + }, + "strategy": "auth0", + "name": "Username-Password-Authentication", + "is_domain_connection": false, + "authentication": { + "active": true + }, + "connected_accounts": { + "active": false + }, + "enabled_clients": [ + "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", + "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" + ], + "realms": [ + "Username-Password-Authentication" + ] + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "PATCH", + "path": "/api/v2/connections/con_3R2lX4rln4ArocW5", + "body": { + "enabled_clients": [ + "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", + "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" + ], + "is_domain_connection": false, + "options": { + "mfa": { + "active": true, + "return_enroll_settings": true + }, + "passwordPolicy": "good", + "passkey_options": { + "challenge_ui": "both", + "local_enrollment_enabled": true, + "progressive_enrollment_enabled": true + }, + "strategy_version": 2, + "authentication_methods": { + "passkey": { + "enabled": false + }, + "password": { + "enabled": true, + "api_behavior": "required" + } + }, + "brute_force_protection": true + }, + "realms": [ + "Username-Password-Authentication" + ] + }, + "status": 200, + "response": { + "id": "con_3R2lX4rln4ArocW5", + "options": { + "mfa": { + "active": true, + "return_enroll_settings": true + }, + "passwordPolicy": "good", + "passkey_options": { + "challenge_ui": "both", + "local_enrollment_enabled": true, + "progressive_enrollment_enabled": true + }, + "strategy_version": 2, + "authentication_methods": { + "passkey": { + "enabled": false + }, + "password": { + "enabled": true, + "api_behavior": "required" + } }, + "brute_force_protection": true + }, + "strategy": "auth0", + "name": "Username-Password-Authentication", + "is_domain_connection": false, + "authentication": { + "active": true + }, + "connected_accounts": { + "active": false + }, + "enabled_clients": [ + "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", + "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" + ], + "realms": [ + "Username-Password-Authentication" + ] + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "PATCH", + "path": "/api/v2/connections/con_3R2lX4rln4ArocW5/clients", + "body": [ + { + "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", + "status": true + }, + { + "client_id": "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V", + "status": true + } + ], + "status": 204, + "response": "", + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/clients?page=0&per_page=100&include_totals=true", + "body": "", + "status": 200, + "response": { + "total": 3, + "start": 0, + "limit": 100, + "clients": [ { "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "The Default App", + "name": "Deploy CLI", + "is_first_party": true, + "oidc_conformant": true, + "sso_disabled": false, + "cross_origin_auth": false, + "refresh_token": { + "expiration_type": "non-expiring", + "leeway": 0, + "infinite_token_lifetime": true, + "infinite_idle_token_lifetime": true, + "token_lifetime": 31557600, + "idle_token_lifetime": 2592000, + "rotation_type": "non-rotating" + }, + "cross_origin_authentication": true, "allowed_clients": [], "callbacks": [], - "client_metadata": {}, - "is_first_party": true, "native_social_login": { "apple": { "enabled": false @@ -2204,20 +1955,6 @@ "enabled": false } }, - "oidc_conformant": false, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 2592000, - "idle_token_lifetime": 1296000, - "rotation_type": "non-rotating" - }, - "sso": false, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, "signing_keys": [ { "cert": "[REDACTED]", @@ -2225,7 +1962,7 @@ "subject": "deprecated" } ], - "client_id": "uw8hjIHcxeL2LaKGbBtFGwEdPXkzhWl3", + "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -2235,11 +1972,12 @@ }, "client_aliases": [], "token_endpoint_auth_method": "client_secret_post", + "app_type": "non_interactive", "grant_types": [ - "authorization_code", + "client_credentials", "implicit", - "refresh_token", - "client_credentials" + "authorization_code", + "refresh_token" ], "custom_login_page_on": true }, @@ -2247,7 +1985,8 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "Terraform Provider", + "name": "Default App", + "callbacks": [], "is_first_party": true, "oidc_conformant": true, "refresh_token": { @@ -2255,8 +1994,8 @@ "leeway": 0, "infinite_token_lifetime": true, "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, + "token_lifetime": 2592000, + "idle_token_lifetime": 1296000, "rotation_type": "non-rotating" }, "sso_disabled": false, @@ -2269,7 +2008,7 @@ "subject": "deprecated" } ], - "client_id": "KsK8Stn8v2U4JSoYY6QEcDcSFyDqratO", + "client_id": "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -2277,125 +2016,10 @@ "lifetime_in_seconds": 36000, "secret_encoded": false }, - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", - "grant_types": [ - "client_credentials" - ], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Test SPA", - "allowed_clients": [], - "allowed_logout_urls": [ - "http://localhost:3000" - ], - "callbacks": [ - "http://localhost:3000" - ], - "client_metadata": {}, - "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "expiring", - "leeway": 0, - "token_lifetime": 2592000, - "idle_token_lifetime": 1296000, - "infinite_token_lifetime": false, - "infinite_idle_token_lifetime": false, - "rotation_type": "rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "WM7pCOae5czoa1vUFr8vLEnX8pyoNgYV", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "client_aliases": [], - "token_endpoint_auth_method": "none", - "app_type": "spa", "grant_types": [ "authorization_code", "implicit", - "refresh_token" - ], - "web_origins": [ - "http://localhost:3000" - ], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "auth0-deploy-cli-extension", - "allowed_clients": [], - "callbacks": [], - "client_metadata": {}, - "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "CFSqJJvGh1dleeE9m7FXd52VbNTG6z5g", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", - "grant_types": [ + "refresh_token", "client_credentials" ], "custom_login_page_on": true @@ -2445,84 +2069,13 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections?include_totals=true&strategy=auth0", + "path": "/api/v2/connections?take=50", "body": "", "status": 200, "response": { - "total": 2, - "start": 0, - "limit": 50, "connections": [ { - "id": "con_dbGeR0csgLy1hKRe", - "options": { - "mfa": { - "active": true, - "return_enroll_settings": true - }, - "import_mode": false, - "customScripts": { - "login": "function login(email, password, callback) {\n // This script should authenticate a user against the credentials stored in\n // your database.\n // It is executed when a user attempts to log in or immediately after signing\n // up (as a verification that the user was successfully signed up).\n //\n // Everything returned by this script will be set as part of the user profile\n // and will be visible by any of the tenant admins. Avoid adding attributes\n // with values such as passwords, keys, secrets, etc.\n //\n // The `password` parameter of this function is in plain text. It must be\n // hashed/salted to match whatever is stored in your database. For example:\n //\n // var bcrypt = require('bcrypt@0.8.5');\n // bcrypt.compare(password, dbPasswordHash, function(err, res)) { ... }\n //\n // There are three ways this script can finish:\n // 1. The user's credentials are valid. The returned user profile should be in\n // the following format: https://auth0.com/docs/users/normalized/auth0/normalized-user-profile-schema\n // var profile = {\n // user_id: ..., // user_id is mandatory\n // email: ...,\n // [...]\n // };\n // callback(null, profile);\n // 2. The user's credentials are invalid\n // callback(new WrongUsernameOrPasswordError(email, \"my error message\"));\n // 3. Something went wrong while trying to reach your database\n // callback(new Error(\"my error message\"));\n //\n // A list of Node.js modules which can be referenced is available here:\n //\n // https://tehsis.github.io/webtaskio-canirequire/\n console.log('AYYYYYE');\n\n const msg =\n 'Please implement the Login script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "create": "function create(user, callback) {\n // This script should create a user entry in your existing database. It will\n // be executed when a user attempts to sign up, or when a user is created\n // through the Auth0 dashboard or API.\n // When this script has finished executing, the Login script will be\n // executed immediately afterwards, to verify that the user was created\n // successfully.\n //\n // The user object will always contain the following properties:\n // * email: the user's email\n // * password: the password entered by the user, in plain text\n // * tenant: the name of this Auth0 account\n // * client_id: the client ID of the application where the user signed up, or\n // API key if created through the API or Auth0 dashboard\n // * connection: the name of this database connection\n //\n // There are three ways this script can finish:\n // 1. A user was successfully created\n // callback(null);\n // 2. This user already exists in your database\n // callback(new ValidationError(\"user_exists\", \"my error message\"));\n // 3. Something went wrong while trying to reach your database\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Create script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "delete": "function remove(id, callback) {\n // This script remove a user from your existing database.\n // It is executed whenever a user is deleted from the API or Auth0 dashboard.\n //\n // There are two ways that this script can finish:\n // 1. The user was removed successfully:\n // callback(null);\n // 2. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Delete script for this database ' +\n 'connection at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "verify": "function verify(email, callback) {\n // This script should mark the current user's email address as verified in\n // your database.\n // It is executed whenever a user clicks the verification link sent by email.\n // These emails can be customized at https://manage.auth0.com/#/emails.\n // It is safe to assume that the user's email already exists in your database,\n // because verification emails, if enabled, are sent immediately after a\n // successful signup.\n //\n // There are two ways that this script can finish:\n // 1. The user's email was verified successfully\n // callback(null, true);\n // 2. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n //\n // If an error is returned, it will be passed to the query string of the page\n // where the user is being redirected to after clicking the verification link.\n // For example, returning `callback(new Error(\"error\"))` and redirecting to\n // https://example.com would redirect to the following URL:\n // https://example.com?email=alice%40example.com&message=error&success=false\n\n const msg =\n 'Please implement the Verify script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "get_user": "function getByEmail(email, callback) {\n // This script should retrieve a user profile from your existing database,\n // without authenticating the user.\n // It is used to check if a user exists before executing flows that do not\n // require authentication (signup and password reset).\n //\n // There are three ways this script can finish:\n // 1. A user was successfully found. The profile should be in the following\n // format: https://auth0.com/docs/users/normalized/auth0/normalized-user-profile-schema.\n // callback(null, profile);\n // 2. A user was not found\n // callback(null);\n // 3. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Get User script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "change_password": "function changePassword(email, newPassword, callback) {\n // This script should change the password stored for the current user in your\n // database. It is executed when the user clicks on the confirmation link\n // after a reset password request.\n // The content and behavior of password confirmation emails can be customized\n // here: https://manage.auth0.com/#/emails\n // The `newPassword` parameter of this function is in plain text. It must be\n // hashed/salted to match whatever is stored in your database.\n //\n // There are three ways that this script can finish:\n // 1. The user's password was updated successfully:\n // callback(null, true);\n // 2. The user's password was not updated:\n // callback(null, false);\n // 3. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n //\n // If an error is returned, it will be passed to the query string of the page\n // where the user is being redirected to after clicking the confirmation link.\n // For example, returning `callback(new Error(\"error\"))` and redirecting to\n // https://example.com would redirect to the following URL:\n // https://example.com?email=alice%40example.com&message=error&success=false\n\n const msg =\n 'Please implement the Change Password script for this database ' +\n 'connection at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n" - }, - "disable_signup": false, - "passwordPolicy": "low", - "passkey_options": { - "challenge_ui": "both", - "local_enrollment_enabled": true, - "progressive_enrollment_enabled": true - }, - "password_history": { - "size": 5, - "enable": false - }, - "strategy_version": 2, - "requires_username": true, - "password_dictionary": { - "enable": true, - "dictionary": [] - }, - "authentication_methods": { - "passkey": { - "enabled": false - }, - "password": { - "enabled": true, - "api_behavior": "required" - } - }, - "brute_force_protection": true, - "password_no_personal_info": { - "enable": true - }, - "password_complexity_options": { - "min_length": 8 - }, - "enabledDatabaseCustomization": true - }, - "strategy": "auth0", - "name": "boo-baz-db-connection-test", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "boo-baz-db-connection-test" - ], - "enabled_clients": [ - "k15LH4UseegSadRNaQhwB1sRTLPSLBTo", - "CFSqJJvGh1dleeE9m7FXd52VbNTG6z5g" - ] - }, - { - "id": "con_dcwXkGIDW6UUQ5Kn", + "id": "con_3R2lX4rln4ArocW5", "options": { "mfa": { "active": true, @@ -2560,7 +2113,7 @@ ], "enabled_clients": [ "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", - "dMsTNDvIh3YcBOuWaSGDLKJeI6pUcWwZ" + "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" ] } ] @@ -2571,44 +2124,25 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections?include_totals=true&take=50&strategy=auth0", + "path": "/api/v2/connections?take=50", "body": "", "status": 200, "response": { "connections": [ { - "id": "con_dbGeR0csgLy1hKRe", + "id": "con_3R2lX4rln4ArocW5", "options": { "mfa": { "active": true, "return_enroll_settings": true }, - "import_mode": false, - "customScripts": { - "login": "function login(email, password, callback) {\n // This script should authenticate a user against the credentials stored in\n // your database.\n // It is executed when a user attempts to log in or immediately after signing\n // up (as a verification that the user was successfully signed up).\n //\n // Everything returned by this script will be set as part of the user profile\n // and will be visible by any of the tenant admins. Avoid adding attributes\n // with values such as passwords, keys, secrets, etc.\n //\n // The `password` parameter of this function is in plain text. It must be\n // hashed/salted to match whatever is stored in your database. For example:\n //\n // var bcrypt = require('bcrypt@0.8.5');\n // bcrypt.compare(password, dbPasswordHash, function(err, res)) { ... }\n //\n // There are three ways this script can finish:\n // 1. The user's credentials are valid. The returned user profile should be in\n // the following format: https://auth0.com/docs/users/normalized/auth0/normalized-user-profile-schema\n // var profile = {\n // user_id: ..., // user_id is mandatory\n // email: ...,\n // [...]\n // };\n // callback(null, profile);\n // 2. The user's credentials are invalid\n // callback(new WrongUsernameOrPasswordError(email, \"my error message\"));\n // 3. Something went wrong while trying to reach your database\n // callback(new Error(\"my error message\"));\n //\n // A list of Node.js modules which can be referenced is available here:\n //\n // https://tehsis.github.io/webtaskio-canirequire/\n console.log('AYYYYYE');\n\n const msg =\n 'Please implement the Login script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "create": "function create(user, callback) {\n // This script should create a user entry in your existing database. It will\n // be executed when a user attempts to sign up, or when a user is created\n // through the Auth0 dashboard or API.\n // When this script has finished executing, the Login script will be\n // executed immediately afterwards, to verify that the user was created\n // successfully.\n //\n // The user object will always contain the following properties:\n // * email: the user's email\n // * password: the password entered by the user, in plain text\n // * tenant: the name of this Auth0 account\n // * client_id: the client ID of the application where the user signed up, or\n // API key if created through the API or Auth0 dashboard\n // * connection: the name of this database connection\n //\n // There are three ways this script can finish:\n // 1. A user was successfully created\n // callback(null);\n // 2. This user already exists in your database\n // callback(new ValidationError(\"user_exists\", \"my error message\"));\n // 3. Something went wrong while trying to reach your database\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Create script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "delete": "function remove(id, callback) {\n // This script remove a user from your existing database.\n // It is executed whenever a user is deleted from the API or Auth0 dashboard.\n //\n // There are two ways that this script can finish:\n // 1. The user was removed successfully:\n // callback(null);\n // 2. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Delete script for this database ' +\n 'connection at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "verify": "function verify(email, callback) {\n // This script should mark the current user's email address as verified in\n // your database.\n // It is executed whenever a user clicks the verification link sent by email.\n // These emails can be customized at https://manage.auth0.com/#/emails.\n // It is safe to assume that the user's email already exists in your database,\n // because verification emails, if enabled, are sent immediately after a\n // successful signup.\n //\n // There are two ways that this script can finish:\n // 1. The user's email was verified successfully\n // callback(null, true);\n // 2. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n //\n // If an error is returned, it will be passed to the query string of the page\n // where the user is being redirected to after clicking the verification link.\n // For example, returning `callback(new Error(\"error\"))` and redirecting to\n // https://example.com would redirect to the following URL:\n // https://example.com?email=alice%40example.com&message=error&success=false\n\n const msg =\n 'Please implement the Verify script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "get_user": "function getByEmail(email, callback) {\n // This script should retrieve a user profile from your existing database,\n // without authenticating the user.\n // It is used to check if a user exists before executing flows that do not\n // require authentication (signup and password reset).\n //\n // There are three ways this script can finish:\n // 1. A user was successfully found. The profile should be in the following\n // format: https://auth0.com/docs/users/normalized/auth0/normalized-user-profile-schema.\n // callback(null, profile);\n // 2. A user was not found\n // callback(null);\n // 3. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Get User script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "change_password": "function changePassword(email, newPassword, callback) {\n // This script should change the password stored for the current user in your\n // database. It is executed when the user clicks on the confirmation link\n // after a reset password request.\n // The content and behavior of password confirmation emails can be customized\n // here: https://manage.auth0.com/#/emails\n // The `newPassword` parameter of this function is in plain text. It must be\n // hashed/salted to match whatever is stored in your database.\n //\n // There are three ways that this script can finish:\n // 1. The user's password was updated successfully:\n // callback(null, true);\n // 2. The user's password was not updated:\n // callback(null, false);\n // 3. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n //\n // If an error is returned, it will be passed to the query string of the page\n // where the user is being redirected to after clicking the confirmation link.\n // For example, returning `callback(new Error(\"error\"))` and redirecting to\n // https://example.com would redirect to the following URL:\n // https://example.com?email=alice%40example.com&message=error&success=false\n\n const msg =\n 'Please implement the Change Password script for this database ' +\n 'connection at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n" - }, - "disable_signup": false, - "passwordPolicy": "low", + "passwordPolicy": "good", "passkey_options": { "challenge_ui": "both", "local_enrollment_enabled": true, "progressive_enrollment_enabled": true }, - "password_history": { - "size": 5, - "enable": false - }, "strategy_version": 2, - "requires_username": true, - "password_dictionary": { - "enable": true, - "dictionary": [] - }, "authentication_methods": { "passkey": { "enabled": false @@ -2618,17 +2152,10 @@ "api_behavior": "required" } }, - "brute_force_protection": true, - "password_no_personal_info": { - "enable": true - }, - "password_complexity_options": { - "min_length": 8 - }, - "enabledDatabaseCustomization": true + "brute_force_protection": true }, "strategy": "auth0", - "name": "boo-baz-db-connection-test", + "name": "Username-Password-Authentication", "is_domain_connection": false, "authentication": { "active": true @@ -2637,40 +2164,90 @@ "active": false }, "realms": [ - "boo-baz-db-connection-test" + "Username-Password-Authentication" ], "enabled_clients": [ - "k15LH4UseegSadRNaQhwB1sRTLPSLBTo", - "CFSqJJvGh1dleeE9m7FXd52VbNTG6z5g" + "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", + "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" ] - }, + } + ] + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "POST", + "path": "/api/v2/connections", + "body": { + "name": "google-oauth2", + "strategy": "google-oauth2", + "enabled_clients": [ + "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", + "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" + ], + "is_domain_connection": false, + "options": { + "email": true, + "scope": [ + "email", + "profile" + ], + "profile": true + } + }, + "status": 201, + "response": { + "id": "con_lfhXlIY73LFJlMks", + "options": { + "email": true, + "scope": [ + "email", + "profile" + ], + "profile": true + }, + "strategy": "google-oauth2", + "name": "google-oauth2", + "is_domain_connection": false, + "authentication": { + "active": true + }, + "connected_accounts": { + "active": false + }, + "enabled_clients": [ + "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", + "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" + ], + "realms": [ + "google-oauth2" + ] + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/connections?take=1&name=google-oauth2&include_fields=true", + "body": "", + "status": 200, + "response": { + "connections": [ { - "id": "con_dcwXkGIDW6UUQ5Kn", + "id": "con_lfhXlIY73LFJlMks", "options": { - "mfa": { - "active": true, - "return_enroll_settings": true - }, - "passwordPolicy": "good", - "passkey_options": { - "challenge_ui": "both", - "local_enrollment_enabled": true, - "progressive_enrollment_enabled": true - }, - "strategy_version": 2, - "authentication_methods": { - "passkey": { - "enabled": false - }, - "password": { - "enabled": true, - "api_behavior": "required" - } - }, - "brute_force_protection": true + "email": true, + "scope": [ + "email", + "profile" + ], + "profile": true }, - "strategy": "auth0", - "name": "Username-Password-Authentication", + "strategy": "google-oauth2", + "name": "google-oauth2", "is_domain_connection": false, "authentication": { "active": true @@ -2679,11 +2256,11 @@ "active": false }, "realms": [ - "Username-Password-Authentication" + "google-oauth2" ], "enabled_clients": [ "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", - "dMsTNDvIh3YcBOuWaSGDLKJeI6pUcWwZ" + "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" ] } ] @@ -2693,268 +2270,34 @@ }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/connections?include_totals=true&strategy=auth0", - "body": "", - "status": 200, - "response": { - "total": 2, - "start": 0, - "limit": 50, - "connections": [ - { - "id": "con_dbGeR0csgLy1hKRe", - "options": { - "mfa": { - "active": true, - "return_enroll_settings": true - }, - "import_mode": false, - "customScripts": { - "login": "function login(email, password, callback) {\n // This script should authenticate a user against the credentials stored in\n // your database.\n // It is executed when a user attempts to log in or immediately after signing\n // up (as a verification that the user was successfully signed up).\n //\n // Everything returned by this script will be set as part of the user profile\n // and will be visible by any of the tenant admins. Avoid adding attributes\n // with values such as passwords, keys, secrets, etc.\n //\n // The `password` parameter of this function is in plain text. It must be\n // hashed/salted to match whatever is stored in your database. For example:\n //\n // var bcrypt = require('bcrypt@0.8.5');\n // bcrypt.compare(password, dbPasswordHash, function(err, res)) { ... }\n //\n // There are three ways this script can finish:\n // 1. The user's credentials are valid. The returned user profile should be in\n // the following format: https://auth0.com/docs/users/normalized/auth0/normalized-user-profile-schema\n // var profile = {\n // user_id: ..., // user_id is mandatory\n // email: ...,\n // [...]\n // };\n // callback(null, profile);\n // 2. The user's credentials are invalid\n // callback(new WrongUsernameOrPasswordError(email, \"my error message\"));\n // 3. Something went wrong while trying to reach your database\n // callback(new Error(\"my error message\"));\n //\n // A list of Node.js modules which can be referenced is available here:\n //\n // https://tehsis.github.io/webtaskio-canirequire/\n console.log('AYYYYYE');\n\n const msg =\n 'Please implement the Login script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "create": "function create(user, callback) {\n // This script should create a user entry in your existing database. It will\n // be executed when a user attempts to sign up, or when a user is created\n // through the Auth0 dashboard or API.\n // When this script has finished executing, the Login script will be\n // executed immediately afterwards, to verify that the user was created\n // successfully.\n //\n // The user object will always contain the following properties:\n // * email: the user's email\n // * password: the password entered by the user, in plain text\n // * tenant: the name of this Auth0 account\n // * client_id: the client ID of the application where the user signed up, or\n // API key if created through the API or Auth0 dashboard\n // * connection: the name of this database connection\n //\n // There are three ways this script can finish:\n // 1. A user was successfully created\n // callback(null);\n // 2. This user already exists in your database\n // callback(new ValidationError(\"user_exists\", \"my error message\"));\n // 3. Something went wrong while trying to reach your database\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Create script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "delete": "function remove(id, callback) {\n // This script remove a user from your existing database.\n // It is executed whenever a user is deleted from the API or Auth0 dashboard.\n //\n // There are two ways that this script can finish:\n // 1. The user was removed successfully:\n // callback(null);\n // 2. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Delete script for this database ' +\n 'connection at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "verify": "function verify(email, callback) {\n // This script should mark the current user's email address as verified in\n // your database.\n // It is executed whenever a user clicks the verification link sent by email.\n // These emails can be customized at https://manage.auth0.com/#/emails.\n // It is safe to assume that the user's email already exists in your database,\n // because verification emails, if enabled, are sent immediately after a\n // successful signup.\n //\n // There are two ways that this script can finish:\n // 1. The user's email was verified successfully\n // callback(null, true);\n // 2. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n //\n // If an error is returned, it will be passed to the query string of the page\n // where the user is being redirected to after clicking the verification link.\n // For example, returning `callback(new Error(\"error\"))` and redirecting to\n // https://example.com would redirect to the following URL:\n // https://example.com?email=alice%40example.com&message=error&success=false\n\n const msg =\n 'Please implement the Verify script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "get_user": "function getByEmail(email, callback) {\n // This script should retrieve a user profile from your existing database,\n // without authenticating the user.\n // It is used to check if a user exists before executing flows that do not\n // require authentication (signup and password reset).\n //\n // There are three ways this script can finish:\n // 1. A user was successfully found. The profile should be in the following\n // format: https://auth0.com/docs/users/normalized/auth0/normalized-user-profile-schema.\n // callback(null, profile);\n // 2. A user was not found\n // callback(null);\n // 3. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Get User script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "change_password": "function changePassword(email, newPassword, callback) {\n // This script should change the password stored for the current user in your\n // database. It is executed when the user clicks on the confirmation link\n // after a reset password request.\n // The content and behavior of password confirmation emails can be customized\n // here: https://manage.auth0.com/#/emails\n // The `newPassword` parameter of this function is in plain text. It must be\n // hashed/salted to match whatever is stored in your database.\n //\n // There are three ways that this script can finish:\n // 1. The user's password was updated successfully:\n // callback(null, true);\n // 2. The user's password was not updated:\n // callback(null, false);\n // 3. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n //\n // If an error is returned, it will be passed to the query string of the page\n // where the user is being redirected to after clicking the confirmation link.\n // For example, returning `callback(new Error(\"error\"))` and redirecting to\n // https://example.com would redirect to the following URL:\n // https://example.com?email=alice%40example.com&message=error&success=false\n\n const msg =\n 'Please implement the Change Password script for this database ' +\n 'connection at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n" - }, - "disable_signup": false, - "passwordPolicy": "low", - "passkey_options": { - "challenge_ui": "both", - "local_enrollment_enabled": true, - "progressive_enrollment_enabled": true - }, - "password_history": { - "size": 5, - "enable": false - }, - "strategy_version": 2, - "requires_username": true, - "password_dictionary": { - "enable": true, - "dictionary": [] - }, - "authentication_methods": { - "passkey": { - "enabled": false - }, - "password": { - "enabled": true, - "api_behavior": "required" - } - }, - "brute_force_protection": true, - "password_no_personal_info": { - "enable": true - }, - "password_complexity_options": { - "min_length": 8 - }, - "enabledDatabaseCustomization": true - }, - "strategy": "auth0", - "name": "boo-baz-db-connection-test", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "boo-baz-db-connection-test" - ], - "enabled_clients": [ - "k15LH4UseegSadRNaQhwB1sRTLPSLBTo", - "CFSqJJvGh1dleeE9m7FXd52VbNTG6z5g" - ] - }, - { - "id": "con_dcwXkGIDW6UUQ5Kn", - "options": { - "mfa": { - "active": true, - "return_enroll_settings": true - }, - "passwordPolicy": "good", - "passkey_options": { - "challenge_ui": "both", - "local_enrollment_enabled": true, - "progressive_enrollment_enabled": true - }, - "strategy_version": 2, - "authentication_methods": { - "passkey": { - "enabled": false - }, - "password": { - "enabled": true, - "api_behavior": "required" - } - }, - "brute_force_protection": true - }, - "strategy": "auth0", - "name": "Username-Password-Authentication", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "Username-Password-Authentication" - ], - "enabled_clients": [ - "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", - "dMsTNDvIh3YcBOuWaSGDLKJeI6pUcWwZ" - ] - } - ] - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/connections?include_totals=true&take=50&strategy=auth0", - "body": "", - "status": 200, - "response": { - "connections": [ - { - "id": "con_dbGeR0csgLy1hKRe", - "options": { - "mfa": { - "active": true, - "return_enroll_settings": true - }, - "import_mode": false, - "customScripts": { - "login": "function login(email, password, callback) {\n // This script should authenticate a user against the credentials stored in\n // your database.\n // It is executed when a user attempts to log in or immediately after signing\n // up (as a verification that the user was successfully signed up).\n //\n // Everything returned by this script will be set as part of the user profile\n // and will be visible by any of the tenant admins. Avoid adding attributes\n // with values such as passwords, keys, secrets, etc.\n //\n // The `password` parameter of this function is in plain text. It must be\n // hashed/salted to match whatever is stored in your database. For example:\n //\n // var bcrypt = require('bcrypt@0.8.5');\n // bcrypt.compare(password, dbPasswordHash, function(err, res)) { ... }\n //\n // There are three ways this script can finish:\n // 1. The user's credentials are valid. The returned user profile should be in\n // the following format: https://auth0.com/docs/users/normalized/auth0/normalized-user-profile-schema\n // var profile = {\n // user_id: ..., // user_id is mandatory\n // email: ...,\n // [...]\n // };\n // callback(null, profile);\n // 2. The user's credentials are invalid\n // callback(new WrongUsernameOrPasswordError(email, \"my error message\"));\n // 3. Something went wrong while trying to reach your database\n // callback(new Error(\"my error message\"));\n //\n // A list of Node.js modules which can be referenced is available here:\n //\n // https://tehsis.github.io/webtaskio-canirequire/\n console.log('AYYYYYE');\n\n const msg =\n 'Please implement the Login script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "create": "function create(user, callback) {\n // This script should create a user entry in your existing database. It will\n // be executed when a user attempts to sign up, or when a user is created\n // through the Auth0 dashboard or API.\n // When this script has finished executing, the Login script will be\n // executed immediately afterwards, to verify that the user was created\n // successfully.\n //\n // The user object will always contain the following properties:\n // * email: the user's email\n // * password: the password entered by the user, in plain text\n // * tenant: the name of this Auth0 account\n // * client_id: the client ID of the application where the user signed up, or\n // API key if created through the API or Auth0 dashboard\n // * connection: the name of this database connection\n //\n // There are three ways this script can finish:\n // 1. A user was successfully created\n // callback(null);\n // 2. This user already exists in your database\n // callback(new ValidationError(\"user_exists\", \"my error message\"));\n // 3. Something went wrong while trying to reach your database\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Create script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "delete": "function remove(id, callback) {\n // This script remove a user from your existing database.\n // It is executed whenever a user is deleted from the API or Auth0 dashboard.\n //\n // There are two ways that this script can finish:\n // 1. The user was removed successfully:\n // callback(null);\n // 2. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Delete script for this database ' +\n 'connection at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "verify": "function verify(email, callback) {\n // This script should mark the current user's email address as verified in\n // your database.\n // It is executed whenever a user clicks the verification link sent by email.\n // These emails can be customized at https://manage.auth0.com/#/emails.\n // It is safe to assume that the user's email already exists in your database,\n // because verification emails, if enabled, are sent immediately after a\n // successful signup.\n //\n // There are two ways that this script can finish:\n // 1. The user's email was verified successfully\n // callback(null, true);\n // 2. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n //\n // If an error is returned, it will be passed to the query string of the page\n // where the user is being redirected to after clicking the verification link.\n // For example, returning `callback(new Error(\"error\"))` and redirecting to\n // https://example.com would redirect to the following URL:\n // https://example.com?email=alice%40example.com&message=error&success=false\n\n const msg =\n 'Please implement the Verify script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "get_user": "function getByEmail(email, callback) {\n // This script should retrieve a user profile from your existing database,\n // without authenticating the user.\n // It is used to check if a user exists before executing flows that do not\n // require authentication (signup and password reset).\n //\n // There are three ways this script can finish:\n // 1. A user was successfully found. The profile should be in the following\n // format: https://auth0.com/docs/users/normalized/auth0/normalized-user-profile-schema.\n // callback(null, profile);\n // 2. A user was not found\n // callback(null);\n // 3. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Get User script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "change_password": "function changePassword(email, newPassword, callback) {\n // This script should change the password stored for the current user in your\n // database. It is executed when the user clicks on the confirmation link\n // after a reset password request.\n // The content and behavior of password confirmation emails can be customized\n // here: https://manage.auth0.com/#/emails\n // The `newPassword` parameter of this function is in plain text. It must be\n // hashed/salted to match whatever is stored in your database.\n //\n // There are three ways that this script can finish:\n // 1. The user's password was updated successfully:\n // callback(null, true);\n // 2. The user's password was not updated:\n // callback(null, false);\n // 3. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n //\n // If an error is returned, it will be passed to the query string of the page\n // where the user is being redirected to after clicking the confirmation link.\n // For example, returning `callback(new Error(\"error\"))` and redirecting to\n // https://example.com would redirect to the following URL:\n // https://example.com?email=alice%40example.com&message=error&success=false\n\n const msg =\n 'Please implement the Change Password script for this database ' +\n 'connection at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n" - }, - "disable_signup": false, - "passwordPolicy": "low", - "passkey_options": { - "challenge_ui": "both", - "local_enrollment_enabled": true, - "progressive_enrollment_enabled": true - }, - "password_history": { - "size": 5, - "enable": false - }, - "strategy_version": 2, - "requires_username": true, - "password_dictionary": { - "enable": true, - "dictionary": [] - }, - "authentication_methods": { - "passkey": { - "enabled": false - }, - "password": { - "enabled": true, - "api_behavior": "required" - } - }, - "brute_force_protection": true, - "password_no_personal_info": { - "enable": true - }, - "password_complexity_options": { - "min_length": 8 - }, - "enabledDatabaseCustomization": true - }, - "strategy": "auth0", - "name": "boo-baz-db-connection-test", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "boo-baz-db-connection-test" - ], - "enabled_clients": [ - "k15LH4UseegSadRNaQhwB1sRTLPSLBTo", - "CFSqJJvGh1dleeE9m7FXd52VbNTG6z5g" - ] - }, - { - "id": "con_dcwXkGIDW6UUQ5Kn", - "options": { - "mfa": { - "active": true, - "return_enroll_settings": true - }, - "passwordPolicy": "good", - "passkey_options": { - "challenge_ui": "both", - "local_enrollment_enabled": true, - "progressive_enrollment_enabled": true - }, - "strategy_version": 2, - "authentication_methods": { - "passkey": { - "enabled": false - }, - "password": { - "enabled": true, - "api_behavior": "required" - } - }, - "brute_force_protection": true - }, - "strategy": "auth0", - "name": "Username-Password-Authentication", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "Username-Password-Authentication" - ], - "enabled_clients": [ - "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", - "dMsTNDvIh3YcBOuWaSGDLKJeI6pUcWwZ" - ] - } - ] - }, + "method": "PATCH", + "path": "/api/v2/connections/con_lfhXlIY73LFJlMks/clients", + "body": [ + { + "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", + "status": true + }, + { + "client_id": "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V", + "status": true + } + ], + "status": 204, + "response": "", "rawHeaders": [], "responseIsBinary": false }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections/con_dbGeR0csgLy1hKRe/clients?take=50", + "path": "/api/v2/emails/provider?fields=name%2Cenabled%2Ccredentials%2Csettings%2Cdefault_from_address&include_fields=true", "body": "", "status": 200, "response": { - "clients": [ - { - "client_id": "CFSqJJvGh1dleeE9m7FXd52VbNTG6z5g" - }, - { - "client_id": "k15LH4UseegSadRNaQhwB1sRTLPSLBTo" - } - ] + "name": "mandrill", + "credentials": {}, + "default_from_address": "auth0-user@auth0.com", + "enabled": false }, "rawHeaders": [], "responseIsBinary": false @@ -2962,240 +2305,68 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections/con_dcwXkGIDW6UUQ5Kn/clients?take=50", + "path": "/api/v2/clients?page=0&per_page=100&include_totals=true", "body": "", "status": 200, "response": { + "total": 3, + "start": 0, + "limit": 100, "clients": [ { - "client_id": "dMsTNDvIh3YcBOuWaSGDLKJeI6pUcWwZ" - }, - { - "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE" - } - ] - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/connections/con_dcwXkGIDW6UUQ5Kn", - "body": "", - "status": 200, - "response": { - "id": "con_dcwXkGIDW6UUQ5Kn", - "options": { - "mfa": { - "active": true, - "return_enroll_settings": true - }, - "passwordPolicy": "good", - "passkey_options": { - "challenge_ui": "both", - "local_enrollment_enabled": true, - "progressive_enrollment_enabled": true - }, - "strategy_version": 2, - "authentication_methods": { - "passkey": { - "enabled": false - }, - "password": { - "enabled": true, - "api_behavior": "required" - } - }, - "brute_force_protection": true - }, - "strategy": "auth0", - "name": "Username-Password-Authentication", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "enabled_clients": [ - "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", - "dMsTNDvIh3YcBOuWaSGDLKJeI6pUcWwZ" - ], - "realms": [ - "Username-Password-Authentication" - ] - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "PATCH", - "path": "/api/v2/connections/con_dcwXkGIDW6UUQ5Kn", - "body": { - "enabled_clients": [ - "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", - "dMsTNDvIh3YcBOuWaSGDLKJeI6pUcWwZ" - ], - "is_domain_connection": false, - "options": { - "mfa": { - "active": true, - "return_enroll_settings": true - }, - "passwordPolicy": "good", - "passkey_options": { - "challenge_ui": "both", - "local_enrollment_enabled": true, - "progressive_enrollment_enabled": true - }, - "strategy_version": 2, - "authentication_methods": { - "passkey": { - "enabled": false - }, - "password": { - "enabled": true, - "api_behavior": "required" - } - }, - "brute_force_protection": true - }, - "realms": [ - "Username-Password-Authentication" - ] - }, - "status": 200, - "response": { - "id": "con_dcwXkGIDW6UUQ5Kn", - "options": { - "mfa": { - "active": true, - "return_enroll_settings": true - }, - "passwordPolicy": "good", - "passkey_options": { - "challenge_ui": "both", - "local_enrollment_enabled": true, - "progressive_enrollment_enabled": true - }, - "strategy_version": 2, - "authentication_methods": { - "passkey": { - "enabled": false - }, - "password": { - "enabled": true, - "api_behavior": "required" - } - }, - "brute_force_protection": true - }, - "strategy": "auth0", - "name": "Username-Password-Authentication", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "enabled_clients": [ - "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", - "dMsTNDvIh3YcBOuWaSGDLKJeI6pUcWwZ" - ], - "realms": [ - "Username-Password-Authentication" - ] - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "PATCH", - "path": "/api/v2/connections/con_dcwXkGIDW6UUQ5Kn/clients", - "body": [ - { - "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", - "status": true - }, - { - "client_id": "dMsTNDvIh3YcBOuWaSGDLKJeI6pUcWwZ", - "status": true - } - ], - "status": 204, - "response": "", - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/clients?page=0&per_page=100&include_totals=true", - "body": "", - "status": 200, - "response": { - "total": 10, - "start": 0, - "limit": 100, - "clients": [ - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Deploy CLI", - "is_first_party": true, - "oidc_conformant": true, - "sso_disabled": false, - "cross_origin_auth": false, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, - "cross_origin_authentication": true, - "allowed_clients": [], - "callbacks": [], - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", - "grant_types": [ - "client_credentials", - "implicit", - "authorization_code", - "refresh_token" - ], - "custom_login_page_on": true + "tenant": "auth0-deploy-cli-e2e", + "global": false, + "is_token_endpoint_ip_header_trusted": false, + "name": "Deploy CLI", + "is_first_party": true, + "oidc_conformant": true, + "sso_disabled": false, + "cross_origin_auth": false, + "refresh_token": { + "expiration_type": "non-expiring", + "leeway": 0, + "infinite_token_lifetime": true, + "infinite_idle_token_lifetime": true, + "token_lifetime": 31557600, + "idle_token_lifetime": 2592000, + "rotation_type": "non-rotating" + }, + "cross_origin_authentication": true, + "allowed_clients": [], + "callbacks": [], + "native_social_login": { + "apple": { + "enabled": false + }, + "facebook": { + "enabled": false + } + }, + "signing_keys": [ + { + "cert": "[REDACTED]", + "pkcs7": "[REDACTED]", + "subject": "deprecated" + } + ], + "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", + "callback_url_template": false, + "client_secret": "[REDACTED]", + "jwt_configuration": { + "alg": "RS256", + "lifetime_in_seconds": 36000, + "secret_encoded": false + }, + "client_aliases": [], + "token_endpoint_auth_method": "client_secret_post", + "app_type": "non_interactive", + "grant_types": [ + "client_credentials", + "implicit", + "authorization_code", + "refresh_token" + ], + "custom_login_page_on": true }, { "tenant": "auth0-deploy-cli-e2e", @@ -3203,7 +2374,6 @@ "is_token_endpoint_ip_header_trusted": false, "name": "Default App", "callbacks": [], - "cross_origin_auth": false, "is_first_party": true, "oidc_conformant": true, "refresh_token": { @@ -3217,6 +2387,7 @@ }, "sso_disabled": false, "cross_origin_authentication": false, + "cross_origin_auth": false, "signing_keys": [ { "cert": "[REDACTED]", @@ -3224,7 +2395,7 @@ "subject": "deprecated" } ], - "client_id": "dMsTNDvIh3YcBOuWaSGDLKJeI6pUcWwZ", + "client_id": "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -3242,34 +2413,30 @@ }, { "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "API Explorer Application", - "allowed_clients": [], + "global": true, "callbacks": [], - "client_metadata": {}, "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "oidc_conformant": true, + "name": "All Applications", "refresh_token": { "expiration_type": "non-expiring", "leeway": 0, "infinite_token_lifetime": true, "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, + "token_lifetime": 2592000, + "idle_token_lifetime": 1296000, "rotation_type": "non-rotating" }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, + "owners": [ + "mr|samlp|okta|will.vedder@auth0.com", + "mr|google-oauth2|102002633619863830825", + "mr|samlp|okta|frederik.prijck@auth0.com", + "mr|google-oauth2|109614534713742077035", + "mr|google-oauth2|116771660953104383819", + "mr|google-oauth2|112839029247827700155", + "mr|samlp|okta|ewan.harris@auth0.com" + ], + "custom_login_page": "TEST123\n", + "cross_origin_authentication": true, "signing_keys": [ { "cert": "[REDACTED]", @@ -3277,3421 +2444,310 @@ "subject": "deprecated" } ], - "client_id": "uuEKiBwEtHSFm9qiQoUrnbFg55ZD63QW", - "callback_url_template": false, + "client_id": "Isi93ibGHIGwmdYjsLwTOn7Gu7nwxU3V", "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", - "grant_types": [ - "client_credentials" - ], "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Node App", - "allowed_clients": [], - "allowed_logout_urls": [], - "callbacks": [], - "client_metadata": {}, - "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "allowed_origins": [], - "client_id": "k15LH4UseegSadRNaQhwB1sRTLPSLBTo", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "regular_web", - "grant_types": [ - "authorization_code", - "implicit", - "refresh_token", - "client_credentials" - ], - "web_origins": [], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Quickstarts API (Test Application)", - "client_metadata": { - "foo": "bar" - }, - "is_first_party": true, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "PLgyapzr13G0aryQTRzgSsMJ9dbbYvqp", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", - "grant_types": [ - "client_credentials" - ], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "The Default App", - "allowed_clients": [], - "callbacks": [], - "client_metadata": {}, - "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "oidc_conformant": false, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 2592000, - "idle_token_lifetime": 1296000, - "rotation_type": "non-rotating" - }, - "sso": false, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "uw8hjIHcxeL2LaKGbBtFGwEdPXkzhWl3", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "grant_types": [ - "authorization_code", - "implicit", - "refresh_token", - "client_credentials" - ], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Terraform Provider", - "is_first_party": true, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "KsK8Stn8v2U4JSoYY6QEcDcSFyDqratO", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", - "grant_types": [ - "client_credentials" - ], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Test SPA", - "allowed_clients": [], - "allowed_logout_urls": [ - "http://localhost:3000" - ], - "callbacks": [ - "http://localhost:3000" - ], - "client_metadata": {}, - "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "expiring", - "leeway": 0, - "token_lifetime": 2592000, - "idle_token_lifetime": 1296000, - "infinite_token_lifetime": false, - "infinite_idle_token_lifetime": false, - "rotation_type": "rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "WM7pCOae5czoa1vUFr8vLEnX8pyoNgYV", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "client_aliases": [], - "token_endpoint_auth_method": "none", - "app_type": "spa", - "grant_types": [ - "authorization_code", - "implicit", - "refresh_token" - ], - "web_origins": [ - "http://localhost:3000" - ], - "custom_login_page_on": true - }, + } + ] + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/client-grants?take=50", + "body": "", + "status": 200, + "response": { + "client_grants": [ { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "auth0-deploy-cli-extension", - "allowed_clients": [], - "callbacks": [], - "client_metadata": {}, - "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "CFSqJJvGh1dleeE9m7FXd52VbNTG6z5g", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", - "grant_types": [ - "client_credentials" - ], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": true, - "callbacks": [], - "is_first_party": true, - "name": "All Applications", - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 2592000, - "idle_token_lifetime": 1296000, - "rotation_type": "non-rotating" - }, - "owners": [ - "mr|samlp|okta|will.vedder@auth0.com", - "mr|google-oauth2|102002633619863830825", - "mr|samlp|okta|frederik.prijck@auth0.com", - "mr|google-oauth2|109614534713742077035", - "mr|google-oauth2|116771660953104383819", - "mr|google-oauth2|112839029247827700155", - "mr|samlp|okta|ewan.harris@auth0.com" - ], - "custom_login_page": "TEST123\n", - "cross_origin_authentication": true, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "Isi93ibGHIGwmdYjsLwTOn7Gu7nwxU3V", - "client_secret": "[REDACTED]", - "custom_login_page_on": true - } - ] - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/connections?include_totals=true", - "body": "", - "status": 200, - "response": { - "total": 3, - "start": 0, - "limit": 50, - "connections": [ - { - "id": "con_dbGeR0csgLy1hKRe", - "options": { - "mfa": { - "active": true, - "return_enroll_settings": true - }, - "import_mode": false, - "customScripts": { - "login": "function login(email, password, callback) {\n // This script should authenticate a user against the credentials stored in\n // your database.\n // It is executed when a user attempts to log in or immediately after signing\n // up (as a verification that the user was successfully signed up).\n //\n // Everything returned by this script will be set as part of the user profile\n // and will be visible by any of the tenant admins. Avoid adding attributes\n // with values such as passwords, keys, secrets, etc.\n //\n // The `password` parameter of this function is in plain text. It must be\n // hashed/salted to match whatever is stored in your database. For example:\n //\n // var bcrypt = require('bcrypt@0.8.5');\n // bcrypt.compare(password, dbPasswordHash, function(err, res)) { ... }\n //\n // There are three ways this script can finish:\n // 1. The user's credentials are valid. The returned user profile should be in\n // the following format: https://auth0.com/docs/users/normalized/auth0/normalized-user-profile-schema\n // var profile = {\n // user_id: ..., // user_id is mandatory\n // email: ...,\n // [...]\n // };\n // callback(null, profile);\n // 2. The user's credentials are invalid\n // callback(new WrongUsernameOrPasswordError(email, \"my error message\"));\n // 3. Something went wrong while trying to reach your database\n // callback(new Error(\"my error message\"));\n //\n // A list of Node.js modules which can be referenced is available here:\n //\n // https://tehsis.github.io/webtaskio-canirequire/\n console.log('AYYYYYE');\n\n const msg =\n 'Please implement the Login script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "create": "function create(user, callback) {\n // This script should create a user entry in your existing database. It will\n // be executed when a user attempts to sign up, or when a user is created\n // through the Auth0 dashboard or API.\n // When this script has finished executing, the Login script will be\n // executed immediately afterwards, to verify that the user was created\n // successfully.\n //\n // The user object will always contain the following properties:\n // * email: the user's email\n // * password: the password entered by the user, in plain text\n // * tenant: the name of this Auth0 account\n // * client_id: the client ID of the application where the user signed up, or\n // API key if created through the API or Auth0 dashboard\n // * connection: the name of this database connection\n //\n // There are three ways this script can finish:\n // 1. A user was successfully created\n // callback(null);\n // 2. This user already exists in your database\n // callback(new ValidationError(\"user_exists\", \"my error message\"));\n // 3. Something went wrong while trying to reach your database\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Create script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "delete": "function remove(id, callback) {\n // This script remove a user from your existing database.\n // It is executed whenever a user is deleted from the API or Auth0 dashboard.\n //\n // There are two ways that this script can finish:\n // 1. The user was removed successfully:\n // callback(null);\n // 2. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Delete script for this database ' +\n 'connection at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "verify": "function verify(email, callback) {\n // This script should mark the current user's email address as verified in\n // your database.\n // It is executed whenever a user clicks the verification link sent by email.\n // These emails can be customized at https://manage.auth0.com/#/emails.\n // It is safe to assume that the user's email already exists in your database,\n // because verification emails, if enabled, are sent immediately after a\n // successful signup.\n //\n // There are two ways that this script can finish:\n // 1. The user's email was verified successfully\n // callback(null, true);\n // 2. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n //\n // If an error is returned, it will be passed to the query string of the page\n // where the user is being redirected to after clicking the verification link.\n // For example, returning `callback(new Error(\"error\"))` and redirecting to\n // https://example.com would redirect to the following URL:\n // https://example.com?email=alice%40example.com&message=error&success=false\n\n const msg =\n 'Please implement the Verify script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "get_user": "function getByEmail(email, callback) {\n // This script should retrieve a user profile from your existing database,\n // without authenticating the user.\n // It is used to check if a user exists before executing flows that do not\n // require authentication (signup and password reset).\n //\n // There are three ways this script can finish:\n // 1. A user was successfully found. The profile should be in the following\n // format: https://auth0.com/docs/users/normalized/auth0/normalized-user-profile-schema.\n // callback(null, profile);\n // 2. A user was not found\n // callback(null);\n // 3. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Get User script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "change_password": "function changePassword(email, newPassword, callback) {\n // This script should change the password stored for the current user in your\n // database. It is executed when the user clicks on the confirmation link\n // after a reset password request.\n // The content and behavior of password confirmation emails can be customized\n // here: https://manage.auth0.com/#/emails\n // The `newPassword` parameter of this function is in plain text. It must be\n // hashed/salted to match whatever is stored in your database.\n //\n // There are three ways that this script can finish:\n // 1. The user's password was updated successfully:\n // callback(null, true);\n // 2. The user's password was not updated:\n // callback(null, false);\n // 3. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n //\n // If an error is returned, it will be passed to the query string of the page\n // where the user is being redirected to after clicking the confirmation link.\n // For example, returning `callback(new Error(\"error\"))` and redirecting to\n // https://example.com would redirect to the following URL:\n // https://example.com?email=alice%40example.com&message=error&success=false\n\n const msg =\n 'Please implement the Change Password script for this database ' +\n 'connection at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n" - }, - "disable_signup": false, - "passwordPolicy": "low", - "passkey_options": { - "challenge_ui": "both", - "local_enrollment_enabled": true, - "progressive_enrollment_enabled": true - }, - "password_history": { - "size": 5, - "enable": false - }, - "strategy_version": 2, - "requires_username": true, - "password_dictionary": { - "enable": true, - "dictionary": [] - }, - "authentication_methods": { - "passkey": { - "enabled": false - }, - "password": { - "enabled": true, - "api_behavior": "required" - } - }, - "brute_force_protection": true, - "password_no_personal_info": { - "enable": true - }, - "password_complexity_options": { - "min_length": 8 - }, - "enabledDatabaseCustomization": true - }, - "strategy": "auth0", - "name": "boo-baz-db-connection-test", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "boo-baz-db-connection-test" - ], - "enabled_clients": [ - "k15LH4UseegSadRNaQhwB1sRTLPSLBTo", - "CFSqJJvGh1dleeE9m7FXd52VbNTG6z5g" - ] - }, - { - "id": "con_K6JOwBbKFCexaEHM", - "options": { - "email": true, - "scope": [ - "email", - "profile" - ], - "profile": true - }, - "strategy": "google-oauth2", - "name": "google-oauth2", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "google-oauth2" - ], - "enabled_clients": [ - "CFSqJJvGh1dleeE9m7FXd52VbNTG6z5g", - "uw8hjIHcxeL2LaKGbBtFGwEdPXkzhWl3" - ] - }, - { - "id": "con_dcwXkGIDW6UUQ5Kn", - "options": { - "mfa": { - "active": true, - "return_enroll_settings": true - }, - "passwordPolicy": "good", - "passkey_options": { - "challenge_ui": "both", - "local_enrollment_enabled": true, - "progressive_enrollment_enabled": true - }, - "strategy_version": 2, - "authentication_methods": { - "passkey": { - "enabled": false - }, - "password": { - "enabled": true, - "api_behavior": "required" - } - }, - "brute_force_protection": true - }, - "strategy": "auth0", - "name": "Username-Password-Authentication", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "Username-Password-Authentication" - ], - "enabled_clients": [ - "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", - "dMsTNDvIh3YcBOuWaSGDLKJeI6pUcWwZ" - ] - } - ] - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/connections?include_totals=true&take=50", - "body": "", - "status": 200, - "response": { - "connections": [ - { - "id": "con_dbGeR0csgLy1hKRe", - "options": { - "mfa": { - "active": true, - "return_enroll_settings": true - }, - "import_mode": false, - "customScripts": { - "login": "function login(email, password, callback) {\n // This script should authenticate a user against the credentials stored in\n // your database.\n // It is executed when a user attempts to log in or immediately after signing\n // up (as a verification that the user was successfully signed up).\n //\n // Everything returned by this script will be set as part of the user profile\n // and will be visible by any of the tenant admins. Avoid adding attributes\n // with values such as passwords, keys, secrets, etc.\n //\n // The `password` parameter of this function is in plain text. It must be\n // hashed/salted to match whatever is stored in your database. For example:\n //\n // var bcrypt = require('bcrypt@0.8.5');\n // bcrypt.compare(password, dbPasswordHash, function(err, res)) { ... }\n //\n // There are three ways this script can finish:\n // 1. The user's credentials are valid. The returned user profile should be in\n // the following format: https://auth0.com/docs/users/normalized/auth0/normalized-user-profile-schema\n // var profile = {\n // user_id: ..., // user_id is mandatory\n // email: ...,\n // [...]\n // };\n // callback(null, profile);\n // 2. The user's credentials are invalid\n // callback(new WrongUsernameOrPasswordError(email, \"my error message\"));\n // 3. Something went wrong while trying to reach your database\n // callback(new Error(\"my error message\"));\n //\n // A list of Node.js modules which can be referenced is available here:\n //\n // https://tehsis.github.io/webtaskio-canirequire/\n console.log('AYYYYYE');\n\n const msg =\n 'Please implement the Login script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "create": "function create(user, callback) {\n // This script should create a user entry in your existing database. It will\n // be executed when a user attempts to sign up, or when a user is created\n // through the Auth0 dashboard or API.\n // When this script has finished executing, the Login script will be\n // executed immediately afterwards, to verify that the user was created\n // successfully.\n //\n // The user object will always contain the following properties:\n // * email: the user's email\n // * password: the password entered by the user, in plain text\n // * tenant: the name of this Auth0 account\n // * client_id: the client ID of the application where the user signed up, or\n // API key if created through the API or Auth0 dashboard\n // * connection: the name of this database connection\n //\n // There are three ways this script can finish:\n // 1. A user was successfully created\n // callback(null);\n // 2. This user already exists in your database\n // callback(new ValidationError(\"user_exists\", \"my error message\"));\n // 3. Something went wrong while trying to reach your database\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Create script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "delete": "function remove(id, callback) {\n // This script remove a user from your existing database.\n // It is executed whenever a user is deleted from the API or Auth0 dashboard.\n //\n // There are two ways that this script can finish:\n // 1. The user was removed successfully:\n // callback(null);\n // 2. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Delete script for this database ' +\n 'connection at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "verify": "function verify(email, callback) {\n // This script should mark the current user's email address as verified in\n // your database.\n // It is executed whenever a user clicks the verification link sent by email.\n // These emails can be customized at https://manage.auth0.com/#/emails.\n // It is safe to assume that the user's email already exists in your database,\n // because verification emails, if enabled, are sent immediately after a\n // successful signup.\n //\n // There are two ways that this script can finish:\n // 1. The user's email was verified successfully\n // callback(null, true);\n // 2. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n //\n // If an error is returned, it will be passed to the query string of the page\n // where the user is being redirected to after clicking the verification link.\n // For example, returning `callback(new Error(\"error\"))` and redirecting to\n // https://example.com would redirect to the following URL:\n // https://example.com?email=alice%40example.com&message=error&success=false\n\n const msg =\n 'Please implement the Verify script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "get_user": "function getByEmail(email, callback) {\n // This script should retrieve a user profile from your existing database,\n // without authenticating the user.\n // It is used to check if a user exists before executing flows that do not\n // require authentication (signup and password reset).\n //\n // There are three ways this script can finish:\n // 1. A user was successfully found. The profile should be in the following\n // format: https://auth0.com/docs/users/normalized/auth0/normalized-user-profile-schema.\n // callback(null, profile);\n // 2. A user was not found\n // callback(null);\n // 3. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Get User script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "change_password": "function changePassword(email, newPassword, callback) {\n // This script should change the password stored for the current user in your\n // database. It is executed when the user clicks on the confirmation link\n // after a reset password request.\n // The content and behavior of password confirmation emails can be customized\n // here: https://manage.auth0.com/#/emails\n // The `newPassword` parameter of this function is in plain text. It must be\n // hashed/salted to match whatever is stored in your database.\n //\n // There are three ways that this script can finish:\n // 1. The user's password was updated successfully:\n // callback(null, true);\n // 2. The user's password was not updated:\n // callback(null, false);\n // 3. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n //\n // If an error is returned, it will be passed to the query string of the page\n // where the user is being redirected to after clicking the confirmation link.\n // For example, returning `callback(new Error(\"error\"))` and redirecting to\n // https://example.com would redirect to the following URL:\n // https://example.com?email=alice%40example.com&message=error&success=false\n\n const msg =\n 'Please implement the Change Password script for this database ' +\n 'connection at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n" - }, - "disable_signup": false, - "passwordPolicy": "low", - "passkey_options": { - "challenge_ui": "both", - "local_enrollment_enabled": true, - "progressive_enrollment_enabled": true - }, - "password_history": { - "size": 5, - "enable": false - }, - "strategy_version": 2, - "requires_username": true, - "password_dictionary": { - "enable": true, - "dictionary": [] - }, - "authentication_methods": { - "passkey": { - "enabled": false - }, - "password": { - "enabled": true, - "api_behavior": "required" - } - }, - "brute_force_protection": true, - "password_no_personal_info": { - "enable": true - }, - "password_complexity_options": { - "min_length": 8 - }, - "enabledDatabaseCustomization": true - }, - "strategy": "auth0", - "name": "boo-baz-db-connection-test", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "boo-baz-db-connection-test" - ], - "enabled_clients": [ - "k15LH4UseegSadRNaQhwB1sRTLPSLBTo", - "CFSqJJvGh1dleeE9m7FXd52VbNTG6z5g" - ] - }, - { - "id": "con_K6JOwBbKFCexaEHM", - "options": { - "email": true, - "scope": [ - "email", - "profile" - ], - "profile": true - }, - "strategy": "google-oauth2", - "name": "google-oauth2", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "google-oauth2" - ], - "enabled_clients": [ - "CFSqJJvGh1dleeE9m7FXd52VbNTG6z5g", - "uw8hjIHcxeL2LaKGbBtFGwEdPXkzhWl3" - ] - }, - { - "id": "con_dcwXkGIDW6UUQ5Kn", - "options": { - "mfa": { - "active": true, - "return_enroll_settings": true - }, - "passwordPolicy": "good", - "passkey_options": { - "challenge_ui": "both", - "local_enrollment_enabled": true, - "progressive_enrollment_enabled": true - }, - "strategy_version": 2, - "authentication_methods": { - "passkey": { - "enabled": false - }, - "password": { - "enabled": true, - "api_behavior": "required" - } - }, - "brute_force_protection": true - }, - "strategy": "auth0", - "name": "Username-Password-Authentication", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "Username-Password-Authentication" - ], - "enabled_clients": [ - "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", - "dMsTNDvIh3YcBOuWaSGDLKJeI6pUcWwZ" - ] - } - ] - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/connections?include_totals=true", - "body": "", - "status": 200, - "response": { - "total": 3, - "start": 0, - "limit": 50, - "connections": [ - { - "id": "con_dbGeR0csgLy1hKRe", - "options": { - "mfa": { - "active": true, - "return_enroll_settings": true - }, - "import_mode": false, - "customScripts": { - "login": "function login(email, password, callback) {\n // This script should authenticate a user against the credentials stored in\n // your database.\n // It is executed when a user attempts to log in or immediately after signing\n // up (as a verification that the user was successfully signed up).\n //\n // Everything returned by this script will be set as part of the user profile\n // and will be visible by any of the tenant admins. Avoid adding attributes\n // with values such as passwords, keys, secrets, etc.\n //\n // The `password` parameter of this function is in plain text. It must be\n // hashed/salted to match whatever is stored in your database. For example:\n //\n // var bcrypt = require('bcrypt@0.8.5');\n // bcrypt.compare(password, dbPasswordHash, function(err, res)) { ... }\n //\n // There are three ways this script can finish:\n // 1. The user's credentials are valid. The returned user profile should be in\n // the following format: https://auth0.com/docs/users/normalized/auth0/normalized-user-profile-schema\n // var profile = {\n // user_id: ..., // user_id is mandatory\n // email: ...,\n // [...]\n // };\n // callback(null, profile);\n // 2. The user's credentials are invalid\n // callback(new WrongUsernameOrPasswordError(email, \"my error message\"));\n // 3. Something went wrong while trying to reach your database\n // callback(new Error(\"my error message\"));\n //\n // A list of Node.js modules which can be referenced is available here:\n //\n // https://tehsis.github.io/webtaskio-canirequire/\n console.log('AYYYYYE');\n\n const msg =\n 'Please implement the Login script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "create": "function create(user, callback) {\n // This script should create a user entry in your existing database. It will\n // be executed when a user attempts to sign up, or when a user is created\n // through the Auth0 dashboard or API.\n // When this script has finished executing, the Login script will be\n // executed immediately afterwards, to verify that the user was created\n // successfully.\n //\n // The user object will always contain the following properties:\n // * email: the user's email\n // * password: the password entered by the user, in plain text\n // * tenant: the name of this Auth0 account\n // * client_id: the client ID of the application where the user signed up, or\n // API key if created through the API or Auth0 dashboard\n // * connection: the name of this database connection\n //\n // There are three ways this script can finish:\n // 1. A user was successfully created\n // callback(null);\n // 2. This user already exists in your database\n // callback(new ValidationError(\"user_exists\", \"my error message\"));\n // 3. Something went wrong while trying to reach your database\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Create script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "delete": "function remove(id, callback) {\n // This script remove a user from your existing database.\n // It is executed whenever a user is deleted from the API or Auth0 dashboard.\n //\n // There are two ways that this script can finish:\n // 1. The user was removed successfully:\n // callback(null);\n // 2. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Delete script for this database ' +\n 'connection at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "verify": "function verify(email, callback) {\n // This script should mark the current user's email address as verified in\n // your database.\n // It is executed whenever a user clicks the verification link sent by email.\n // These emails can be customized at https://manage.auth0.com/#/emails.\n // It is safe to assume that the user's email already exists in your database,\n // because verification emails, if enabled, are sent immediately after a\n // successful signup.\n //\n // There are two ways that this script can finish:\n // 1. The user's email was verified successfully\n // callback(null, true);\n // 2. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n //\n // If an error is returned, it will be passed to the query string of the page\n // where the user is being redirected to after clicking the verification link.\n // For example, returning `callback(new Error(\"error\"))` and redirecting to\n // https://example.com would redirect to the following URL:\n // https://example.com?email=alice%40example.com&message=error&success=false\n\n const msg =\n 'Please implement the Verify script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "get_user": "function getByEmail(email, callback) {\n // This script should retrieve a user profile from your existing database,\n // without authenticating the user.\n // It is used to check if a user exists before executing flows that do not\n // require authentication (signup and password reset).\n //\n // There are three ways this script can finish:\n // 1. A user was successfully found. The profile should be in the following\n // format: https://auth0.com/docs/users/normalized/auth0/normalized-user-profile-schema.\n // callback(null, profile);\n // 2. A user was not found\n // callback(null);\n // 3. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Get User script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "change_password": "function changePassword(email, newPassword, callback) {\n // This script should change the password stored for the current user in your\n // database. It is executed when the user clicks on the confirmation link\n // after a reset password request.\n // The content and behavior of password confirmation emails can be customized\n // here: https://manage.auth0.com/#/emails\n // The `newPassword` parameter of this function is in plain text. It must be\n // hashed/salted to match whatever is stored in your database.\n //\n // There are three ways that this script can finish:\n // 1. The user's password was updated successfully:\n // callback(null, true);\n // 2. The user's password was not updated:\n // callback(null, false);\n // 3. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n //\n // If an error is returned, it will be passed to the query string of the page\n // where the user is being redirected to after clicking the confirmation link.\n // For example, returning `callback(new Error(\"error\"))` and redirecting to\n // https://example.com would redirect to the following URL:\n // https://example.com?email=alice%40example.com&message=error&success=false\n\n const msg =\n 'Please implement the Change Password script for this database ' +\n 'connection at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n" - }, - "disable_signup": false, - "passwordPolicy": "low", - "passkey_options": { - "challenge_ui": "both", - "local_enrollment_enabled": true, - "progressive_enrollment_enabled": true - }, - "password_history": { - "size": 5, - "enable": false - }, - "strategy_version": 2, - "requires_username": true, - "password_dictionary": { - "enable": true, - "dictionary": [] - }, - "authentication_methods": { - "passkey": { - "enabled": false - }, - "password": { - "enabled": true, - "api_behavior": "required" - } - }, - "brute_force_protection": true, - "password_no_personal_info": { - "enable": true - }, - "password_complexity_options": { - "min_length": 8 - }, - "enabledDatabaseCustomization": true - }, - "strategy": "auth0", - "name": "boo-baz-db-connection-test", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "boo-baz-db-connection-test" - ], - "enabled_clients": [ - "k15LH4UseegSadRNaQhwB1sRTLPSLBTo", - "CFSqJJvGh1dleeE9m7FXd52VbNTG6z5g" - ] - }, - { - "id": "con_K6JOwBbKFCexaEHM", - "options": { - "email": true, - "scope": [ - "email", - "profile" - ], - "profile": true - }, - "strategy": "google-oauth2", - "name": "google-oauth2", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "google-oauth2" - ], - "enabled_clients": [ - "CFSqJJvGh1dleeE9m7FXd52VbNTG6z5g", - "uw8hjIHcxeL2LaKGbBtFGwEdPXkzhWl3" - ] - }, - { - "id": "con_dcwXkGIDW6UUQ5Kn", - "options": { - "mfa": { - "active": true, - "return_enroll_settings": true - }, - "passwordPolicy": "good", - "passkey_options": { - "challenge_ui": "both", - "local_enrollment_enabled": true, - "progressive_enrollment_enabled": true - }, - "strategy_version": 2, - "authentication_methods": { - "passkey": { - "enabled": false - }, - "password": { - "enabled": true, - "api_behavior": "required" - } - }, - "brute_force_protection": true - }, - "strategy": "auth0", - "name": "Username-Password-Authentication", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "Username-Password-Authentication" - ], - "enabled_clients": [ - "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", - "dMsTNDvIh3YcBOuWaSGDLKJeI6pUcWwZ" - ] - } - ] - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/connections?include_totals=true&take=50", - "body": "", - "status": 200, - "response": { - "connections": [ - { - "id": "con_dbGeR0csgLy1hKRe", - "options": { - "mfa": { - "active": true, - "return_enroll_settings": true - }, - "import_mode": false, - "customScripts": { - "login": "function login(email, password, callback) {\n // This script should authenticate a user against the credentials stored in\n // your database.\n // It is executed when a user attempts to log in or immediately after signing\n // up (as a verification that the user was successfully signed up).\n //\n // Everything returned by this script will be set as part of the user profile\n // and will be visible by any of the tenant admins. Avoid adding attributes\n // with values such as passwords, keys, secrets, etc.\n //\n // The `password` parameter of this function is in plain text. It must be\n // hashed/salted to match whatever is stored in your database. For example:\n //\n // var bcrypt = require('bcrypt@0.8.5');\n // bcrypt.compare(password, dbPasswordHash, function(err, res)) { ... }\n //\n // There are three ways this script can finish:\n // 1. The user's credentials are valid. The returned user profile should be in\n // the following format: https://auth0.com/docs/users/normalized/auth0/normalized-user-profile-schema\n // var profile = {\n // user_id: ..., // user_id is mandatory\n // email: ...,\n // [...]\n // };\n // callback(null, profile);\n // 2. The user's credentials are invalid\n // callback(new WrongUsernameOrPasswordError(email, \"my error message\"));\n // 3. Something went wrong while trying to reach your database\n // callback(new Error(\"my error message\"));\n //\n // A list of Node.js modules which can be referenced is available here:\n //\n // https://tehsis.github.io/webtaskio-canirequire/\n console.log('AYYYYYE');\n\n const msg =\n 'Please implement the Login script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "create": "function create(user, callback) {\n // This script should create a user entry in your existing database. It will\n // be executed when a user attempts to sign up, or when a user is created\n // through the Auth0 dashboard or API.\n // When this script has finished executing, the Login script will be\n // executed immediately afterwards, to verify that the user was created\n // successfully.\n //\n // The user object will always contain the following properties:\n // * email: the user's email\n // * password: the password entered by the user, in plain text\n // * tenant: the name of this Auth0 account\n // * client_id: the client ID of the application where the user signed up, or\n // API key if created through the API or Auth0 dashboard\n // * connection: the name of this database connection\n //\n // There are three ways this script can finish:\n // 1. A user was successfully created\n // callback(null);\n // 2. This user already exists in your database\n // callback(new ValidationError(\"user_exists\", \"my error message\"));\n // 3. Something went wrong while trying to reach your database\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Create script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "delete": "function remove(id, callback) {\n // This script remove a user from your existing database.\n // It is executed whenever a user is deleted from the API or Auth0 dashboard.\n //\n // There are two ways that this script can finish:\n // 1. The user was removed successfully:\n // callback(null);\n // 2. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Delete script for this database ' +\n 'connection at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "verify": "function verify(email, callback) {\n // This script should mark the current user's email address as verified in\n // your database.\n // It is executed whenever a user clicks the verification link sent by email.\n // These emails can be customized at https://manage.auth0.com/#/emails.\n // It is safe to assume that the user's email already exists in your database,\n // because verification emails, if enabled, are sent immediately after a\n // successful signup.\n //\n // There are two ways that this script can finish:\n // 1. The user's email was verified successfully\n // callback(null, true);\n // 2. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n //\n // If an error is returned, it will be passed to the query string of the page\n // where the user is being redirected to after clicking the verification link.\n // For example, returning `callback(new Error(\"error\"))` and redirecting to\n // https://example.com would redirect to the following URL:\n // https://example.com?email=alice%40example.com&message=error&success=false\n\n const msg =\n 'Please implement the Verify script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "get_user": "function getByEmail(email, callback) {\n // This script should retrieve a user profile from your existing database,\n // without authenticating the user.\n // It is used to check if a user exists before executing flows that do not\n // require authentication (signup and password reset).\n //\n // There are three ways this script can finish:\n // 1. A user was successfully found. The profile should be in the following\n // format: https://auth0.com/docs/users/normalized/auth0/normalized-user-profile-schema.\n // callback(null, profile);\n // 2. A user was not found\n // callback(null);\n // 3. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Get User script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "change_password": "function changePassword(email, newPassword, callback) {\n // This script should change the password stored for the current user in your\n // database. It is executed when the user clicks on the confirmation link\n // after a reset password request.\n // The content and behavior of password confirmation emails can be customized\n // here: https://manage.auth0.com/#/emails\n // The `newPassword` parameter of this function is in plain text. It must be\n // hashed/salted to match whatever is stored in your database.\n //\n // There are three ways that this script can finish:\n // 1. The user's password was updated successfully:\n // callback(null, true);\n // 2. The user's password was not updated:\n // callback(null, false);\n // 3. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n //\n // If an error is returned, it will be passed to the query string of the page\n // where the user is being redirected to after clicking the confirmation link.\n // For example, returning `callback(new Error(\"error\"))` and redirecting to\n // https://example.com would redirect to the following URL:\n // https://example.com?email=alice%40example.com&message=error&success=false\n\n const msg =\n 'Please implement the Change Password script for this database ' +\n 'connection at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n" - }, - "disable_signup": false, - "passwordPolicy": "low", - "passkey_options": { - "challenge_ui": "both", - "local_enrollment_enabled": true, - "progressive_enrollment_enabled": true - }, - "password_history": { - "size": 5, - "enable": false - }, - "strategy_version": 2, - "requires_username": true, - "password_dictionary": { - "enable": true, - "dictionary": [] - }, - "authentication_methods": { - "passkey": { - "enabled": false - }, - "password": { - "enabled": true, - "api_behavior": "required" - } - }, - "brute_force_protection": true, - "password_no_personal_info": { - "enable": true - }, - "password_complexity_options": { - "min_length": 8 - }, - "enabledDatabaseCustomization": true - }, - "strategy": "auth0", - "name": "boo-baz-db-connection-test", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "boo-baz-db-connection-test" - ], - "enabled_clients": [ - "k15LH4UseegSadRNaQhwB1sRTLPSLBTo", - "CFSqJJvGh1dleeE9m7FXd52VbNTG6z5g" - ] - }, - { - "id": "con_K6JOwBbKFCexaEHM", - "options": { - "email": true, - "scope": [ - "email", - "profile" - ], - "profile": true - }, - "strategy": "google-oauth2", - "name": "google-oauth2", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "google-oauth2" - ], - "enabled_clients": [ - "CFSqJJvGh1dleeE9m7FXd52VbNTG6z5g", - "uw8hjIHcxeL2LaKGbBtFGwEdPXkzhWl3" - ] - }, - { - "id": "con_dcwXkGIDW6UUQ5Kn", - "options": { - "mfa": { - "active": true, - "return_enroll_settings": true - }, - "passwordPolicy": "good", - "passkey_options": { - "challenge_ui": "both", - "local_enrollment_enabled": true, - "progressive_enrollment_enabled": true - }, - "strategy_version": 2, - "authentication_methods": { - "passkey": { - "enabled": false - }, - "password": { - "enabled": true, - "api_behavior": "required" - } - }, - "brute_force_protection": true - }, - "strategy": "auth0", - "name": "Username-Password-Authentication", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "Username-Password-Authentication" - ], - "enabled_clients": [ - "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", - "dMsTNDvIh3YcBOuWaSGDLKJeI6pUcWwZ" - ] - } - ] - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/connections/con_K6JOwBbKFCexaEHM/clients?take=50", - "body": "", - "status": 200, - "response": { - "clients": [ - { - "client_id": "CFSqJJvGh1dleeE9m7FXd52VbNTG6z5g" - }, - { - "client_id": "uw8hjIHcxeL2LaKGbBtFGwEdPXkzhWl3" - } - ] - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "PATCH", - "path": "/api/v2/connections/con_K6JOwBbKFCexaEHM", - "body": { - "enabled_clients": [ - "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", - "dMsTNDvIh3YcBOuWaSGDLKJeI6pUcWwZ" - ], - "is_domain_connection": false, - "options": { - "email": true, - "scope": [ - "email", - "profile" - ], - "profile": true - } - }, - "status": 200, - "response": { - "id": "con_K6JOwBbKFCexaEHM", - "options": { - "email": true, - "scope": [ - "email", - "profile" - ], - "profile": true - }, - "strategy": "google-oauth2", - "name": "google-oauth2", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "enabled_clients": [ - "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", - "dMsTNDvIh3YcBOuWaSGDLKJeI6pUcWwZ" - ], - "realms": [ - "google-oauth2" - ] - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "PATCH", - "path": "/api/v2/connections/con_K6JOwBbKFCexaEHM/clients", - "body": [ - { - "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", - "status": true - }, - { - "client_id": "dMsTNDvIh3YcBOuWaSGDLKJeI6pUcWwZ", - "status": true - } - ], - "status": 204, - "response": "", - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/emails/provider?fields=name%2Cenabled%2Ccredentials%2Csettings%2Cdefault_from_address&include_fields=true", - "body": "", - "status": 200, - "response": { - "name": "mandrill", - "credentials": {}, - "default_from_address": "auth0-user@auth0.com", - "enabled": false - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/clients?page=0&per_page=100&include_totals=true", - "body": "", - "status": 200, - "response": { - "total": 10, - "start": 0, - "limit": 100, - "clients": [ - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Deploy CLI", - "is_first_party": true, - "oidc_conformant": true, - "sso_disabled": false, - "cross_origin_auth": false, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, - "cross_origin_authentication": true, - "allowed_clients": [], - "callbacks": [], - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", - "grant_types": [ - "client_credentials", - "implicit", - "authorization_code", - "refresh_token" - ], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Default App", - "callbacks": [], - "cross_origin_auth": false, - "is_first_party": true, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 2592000, - "idle_token_lifetime": 1296000, - "rotation_type": "non-rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "dMsTNDvIh3YcBOuWaSGDLKJeI6pUcWwZ", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "grant_types": [ - "authorization_code", - "implicit", - "refresh_token", - "client_credentials" - ], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "API Explorer Application", - "allowed_clients": [], - "callbacks": [], - "client_metadata": {}, - "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "uuEKiBwEtHSFm9qiQoUrnbFg55ZD63QW", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", - "grant_types": [ - "client_credentials" - ], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Node App", - "allowed_clients": [], - "allowed_logout_urls": [], - "callbacks": [], - "client_metadata": {}, - "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "allowed_origins": [], - "client_id": "k15LH4UseegSadRNaQhwB1sRTLPSLBTo", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "regular_web", - "grant_types": [ - "authorization_code", - "implicit", - "refresh_token", - "client_credentials" - ], - "web_origins": [], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Quickstarts API (Test Application)", - "client_metadata": { - "foo": "bar" - }, - "is_first_party": true, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "PLgyapzr13G0aryQTRzgSsMJ9dbbYvqp", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", - "grant_types": [ - "client_credentials" - ], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "The Default App", - "allowed_clients": [], - "callbacks": [], - "client_metadata": {}, - "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "oidc_conformant": false, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 2592000, - "idle_token_lifetime": 1296000, - "rotation_type": "non-rotating" - }, - "sso": false, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "uw8hjIHcxeL2LaKGbBtFGwEdPXkzhWl3", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "grant_types": [ - "authorization_code", - "implicit", - "refresh_token", - "client_credentials" - ], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Terraform Provider", - "is_first_party": true, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "KsK8Stn8v2U4JSoYY6QEcDcSFyDqratO", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", - "grant_types": [ - "client_credentials" - ], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Test SPA", - "allowed_clients": [], - "allowed_logout_urls": [ - "http://localhost:3000" - ], - "callbacks": [ - "http://localhost:3000" - ], - "client_metadata": {}, - "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "expiring", - "leeway": 0, - "token_lifetime": 2592000, - "idle_token_lifetime": 1296000, - "infinite_token_lifetime": false, - "infinite_idle_token_lifetime": false, - "rotation_type": "rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "WM7pCOae5czoa1vUFr8vLEnX8pyoNgYV", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "client_aliases": [], - "token_endpoint_auth_method": "none", - "app_type": "spa", - "grant_types": [ - "authorization_code", - "implicit", - "refresh_token" - ], - "web_origins": [ - "http://localhost:3000" - ], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "auth0-deploy-cli-extension", - "allowed_clients": [], - "callbacks": [], - "client_metadata": {}, - "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "CFSqJJvGh1dleeE9m7FXd52VbNTG6z5g", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", - "grant_types": [ - "client_credentials" - ], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": true, - "callbacks": [], - "is_first_party": true, - "name": "All Applications", - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 2592000, - "idle_token_lifetime": 1296000, - "rotation_type": "non-rotating" - }, - "owners": [ - "mr|samlp|okta|will.vedder@auth0.com", - "mr|google-oauth2|102002633619863830825", - "mr|samlp|okta|frederik.prijck@auth0.com", - "mr|google-oauth2|109614534713742077035", - "mr|google-oauth2|116771660953104383819", - "mr|google-oauth2|112839029247827700155", - "mr|samlp|okta|ewan.harris@auth0.com" - ], - "custom_login_page": "TEST123\n", - "cross_origin_authentication": true, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "Isi93ibGHIGwmdYjsLwTOn7Gu7nwxU3V", - "client_secret": "[REDACTED]", - "custom_login_page_on": true - } - ] - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/client-grants?per_page=100&page=0&include_totals=true", - "body": "", - "status": 200, - "response": { - "total": 3, - "start": 0, - "limit": 100, - "client_grants": [ - { - "id": "cgr_HYZXCfVcMMieVFRJ", - "client_id": "KsK8Stn8v2U4JSoYY6QEcDcSFyDqratO", - "audience": "https://auth0-deploy-cli-e2e.us.auth0.com/api/v2/", - "scope": [ - "read:client_grants", - "create:client_grants", - "delete:client_grants", - "update:client_grants", - "read:users", - "update:users", - "delete:users", - "create:users", - "read:users_app_metadata", - "update:users_app_metadata", - "delete:users_app_metadata", - "create:users_app_metadata", - "read:user_custom_blocks", - "create:user_custom_blocks", - "delete:user_custom_blocks", - "create:user_tickets", - "read:clients", - "update:clients", - "delete:clients", - "create:clients", - "read:client_keys", - "update:client_keys", - "delete:client_keys", - "create:client_keys", - "read:connections", - "update:connections", - "delete:connections", - "create:connections", - "read:resource_servers", - "update:resource_servers", - "delete:resource_servers", - "create:resource_servers", - "read:device_credentials", - "update:device_credentials", - "delete:device_credentials", - "create:device_credentials", - "read:rules", - "update:rules", - "delete:rules", - "create:rules", - "read:rules_configs", - "update:rules_configs", - "delete:rules_configs", - "read:hooks", - "update:hooks", - "delete:hooks", - "create:hooks", - "read:actions", - "update:actions", - "delete:actions", - "create:actions", - "read:email_provider", - "update:email_provider", - "delete:email_provider", - "create:email_provider", - "blacklist:tokens", - "read:stats", - "read:insights", - "read:tenant_settings", - "update:tenant_settings", - "read:logs", - "read:logs_users", - "read:shields", - "create:shields", - "update:shields", - "delete:shields", - "read:anomaly_blocks", - "delete:anomaly_blocks", - "update:triggers", - "read:triggers", - "read:grants", - "delete:grants", - "read:guardian_factors", - "update:guardian_factors", - "read:guardian_enrollments", - "delete:guardian_enrollments", - "create:guardian_enrollment_tickets", - "read:user_idp_tokens", - "create:passwords_checking_job", - "delete:passwords_checking_job", - "read:custom_domains", - "delete:custom_domains", - "create:custom_domains", - "update:custom_domains", - "read:email_templates", - "create:email_templates", - "update:email_templates", - "read:mfa_policies", - "update:mfa_policies", - "read:roles", - "create:roles", - "delete:roles", - "update:roles", - "read:prompts", - "update:prompts", - "read:branding", - "update:branding", - "delete:branding", - "read:log_streams", - "create:log_streams", - "delete:log_streams", - "update:log_streams", - "create:signing_keys", - "read:signing_keys", - "update:signing_keys", - "read:limits", - "update:limits", - "create:role_members", - "read:role_members", - "delete:role_members", - "read:entitlements", - "read:attack_protection", - "update:attack_protection", - "read:organizations", - "update:organizations", - "create:organizations", - "delete:organizations", - "create:organization_members", - "read:organization_members", - "delete:organization_members", - "create:organization_connections", - "read:organization_connections", - "update:organization_connections", - "delete:organization_connections", - "create:organization_member_roles", - "read:organization_member_roles", - "delete:organization_member_roles", - "create:organization_invitations", - "read:organization_invitations", - "delete:organization_invitations" - ], - "subject_type": "client" - }, - { - "id": "cgr_T9StWvZSFEbXzMA7", - "client_id": "uuEKiBwEtHSFm9qiQoUrnbFg55ZD63QW", - "audience": "https://auth0-deploy-cli-e2e.us.auth0.com/api/v2/", - "scope": [ - "read:client_grants", - "create:client_grants", - "delete:client_grants", - "update:client_grants", - "read:users", - "update:users", - "delete:users", - "create:users", - "read:users_app_metadata", - "update:users_app_metadata", - "delete:users_app_metadata", - "create:users_app_metadata", - "read:user_custom_blocks", - "create:user_custom_blocks", - "delete:user_custom_blocks", - "create:user_tickets", - "read:clients", - "update:clients", - "delete:clients", - "create:clients", - "read:client_keys", - "update:client_keys", - "delete:client_keys", - "create:client_keys", - "read:connections", - "update:connections", - "delete:connections", - "create:connections", - "read:resource_servers", - "update:resource_servers", - "delete:resource_servers", - "create:resource_servers", - "read:device_credentials", - "update:device_credentials", - "delete:device_credentials", - "create:device_credentials", - "read:rules", - "update:rules", - "delete:rules", - "create:rules", - "read:rules_configs", - "update:rules_configs", - "delete:rules_configs", - "read:hooks", - "update:hooks", - "delete:hooks", - "create:hooks", - "read:actions", - "update:actions", - "delete:actions", - "create:actions", - "read:email_provider", - "update:email_provider", - "delete:email_provider", - "create:email_provider", - "blacklist:tokens", - "read:stats", - "read:insights", - "read:tenant_settings", - "update:tenant_settings", - "read:logs", - "read:logs_users", - "read:shields", - "create:shields", - "update:shields", - "delete:shields", - "read:anomaly_blocks", - "delete:anomaly_blocks", - "update:triggers", - "read:triggers", - "read:grants", - "delete:grants", - "read:guardian_factors", - "update:guardian_factors", - "read:guardian_enrollments", - "delete:guardian_enrollments", - "create:guardian_enrollment_tickets", - "read:user_idp_tokens", - "create:passwords_checking_job", - "delete:passwords_checking_job", - "read:custom_domains", - "delete:custom_domains", - "create:custom_domains", - "update:custom_domains", - "read:email_templates", - "create:email_templates", - "update:email_templates", - "read:mfa_policies", - "update:mfa_policies", - "read:roles", - "create:roles", - "delete:roles", - "update:roles", - "read:prompts", - "update:prompts", - "read:branding", - "update:branding", - "delete:branding", - "read:log_streams", - "create:log_streams", - "delete:log_streams", - "update:log_streams", - "create:signing_keys", - "read:signing_keys", - "update:signing_keys", - "read:limits", - "update:limits", - "create:role_members", - "read:role_members", - "delete:role_members", - "read:entitlements", - "read:attack_protection", - "update:attack_protection", - "read:organizations", - "update:organizations", - "create:organizations", - "delete:organizations", - "create:organization_members", - "read:organization_members", - "delete:organization_members", - "create:organization_connections", - "read:organization_connections", - "update:organization_connections", - "delete:organization_connections", - "create:organization_member_roles", - "read:organization_member_roles", - "delete:organization_member_roles", - "create:organization_invitations", - "read:organization_invitations", - "delete:organization_invitations" - ], - "subject_type": "client" - }, - { - "id": "cgr_pbwejzhwoujrsNE8", - "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", - "audience": "https://auth0-deploy-cli-e2e.us.auth0.com/api/v2/", - "scope": [ - "read:client_grants", - "create:client_grants", - "delete:client_grants", - "update:client_grants", - "read:users", - "update:users", - "delete:users", - "create:users", - "read:users_app_metadata", - "update:users_app_metadata", - "delete:users_app_metadata", - "create:users_app_metadata", - "read:user_custom_blocks", - "create:user_custom_blocks", - "delete:user_custom_blocks", - "create:user_tickets", - "read:clients", - "update:clients", - "delete:clients", - "create:clients", - "read:client_keys", - "update:client_keys", - "delete:client_keys", - "create:client_keys", - "read:client_credentials", - "update:client_credentials", - "delete:client_credentials", - "create:client_credentials", - "read:connections", - "update:connections", - "delete:connections", - "create:connections", - "read:resource_servers", - "update:resource_servers", - "delete:resource_servers", - "create:resource_servers", - "read:device_credentials", - "update:device_credentials", - "delete:device_credentials", - "create:device_credentials", - "read:rules", - "update:rules", - "delete:rules", - "create:rules", - "read:rules_configs", - "update:rules_configs", - "delete:rules_configs", - "read:hooks", - "update:hooks", - "delete:hooks", - "create:hooks", - "read:actions", - "update:actions", - "delete:actions", - "create:actions", - "read:email_provider", - "update:email_provider", - "delete:email_provider", - "create:email_provider", - "blacklist:tokens", - "read:stats", - "read:insights", - "read:tenant_settings", - "update:tenant_settings", - "read:logs", - "read:logs_users", - "read:shields", - "create:shields", - "update:shields", - "delete:shields", - "read:anomaly_blocks", - "delete:anomaly_blocks", - "update:triggers", - "read:triggers", - "read:grants", - "delete:grants", - "read:guardian_factors", - "update:guardian_factors", - "read:guardian_enrollments", - "delete:guardian_enrollments", - "create:guardian_enrollment_tickets", - "read:user_idp_tokens", - "create:passwords_checking_job", - "delete:passwords_checking_job", - "read:custom_domains", - "delete:custom_domains", - "create:custom_domains", - "update:custom_domains", - "read:email_templates", - "create:email_templates", - "update:email_templates", - "read:mfa_policies", - "update:mfa_policies", - "read:roles", - "create:roles", - "delete:roles", - "update:roles", - "read:prompts", - "update:prompts", - "read:branding", - "update:branding", - "delete:branding", - "read:log_streams", - "create:log_streams", - "delete:log_streams", - "update:log_streams", - "create:signing_keys", - "read:signing_keys", - "update:signing_keys", - "read:limits", - "update:limits", - "create:role_members", - "read:role_members", - "delete:role_members", - "read:entitlements", - "read:attack_protection", - "update:attack_protection", - "read:organizations_summary", - "create:authentication_methods", - "read:authentication_methods", - "update:authentication_methods", - "delete:authentication_methods", - "read:organizations", - "update:organizations", - "create:organizations", - "delete:organizations", - "read:organization_discovery_domains", - "update:organization_discovery_domains", - "create:organization_discovery_domains", - "delete:organization_discovery_domains", - "create:organization_members", - "read:organization_members", - "delete:organization_members", - "create:organization_connections", - "read:organization_connections", - "update:organization_connections", - "delete:organization_connections", - "create:organization_member_roles", - "read:organization_member_roles", - "delete:organization_member_roles", - "create:organization_invitations", - "read:organization_invitations", - "delete:organization_invitations", - "read:scim_config", - "create:scim_config", - "update:scim_config", - "delete:scim_config", - "create:scim_token", - "read:scim_token", - "delete:scim_token", - "delete:phone_providers", - "create:phone_providers", - "read:phone_providers", - "update:phone_providers", - "delete:phone_templates", - "create:phone_templates", - "read:phone_templates", - "update:phone_templates", - "create:encryption_keys", - "read:encryption_keys", - "update:encryption_keys", - "delete:encryption_keys", - "read:sessions", - "update:sessions", - "delete:sessions", - "read:refresh_tokens", - "delete:refresh_tokens", - "create:self_service_profiles", - "read:self_service_profiles", - "update:self_service_profiles", - "delete:self_service_profiles", - "create:sso_access_tickets", - "delete:sso_access_tickets", - "read:forms", - "update:forms", - "delete:forms", - "create:forms", - "read:flows", - "update:flows", - "delete:flows", - "create:flows", - "read:flows_vault", - "read:flows_vault_connections", - "update:flows_vault_connections", - "delete:flows_vault_connections", - "create:flows_vault_connections", - "read:flows_executions", - "delete:flows_executions", - "read:connections_options", - "update:connections_options", - "read:self_service_profile_custom_texts", - "update:self_service_profile_custom_texts", - "create:network_acls", - "update:network_acls", - "read:network_acls", - "delete:network_acls", - "delete:vdcs_templates", - "read:vdcs_templates", - "create:vdcs_templates", - "update:vdcs_templates", - "create:custom_signing_keys", - "read:custom_signing_keys", - "update:custom_signing_keys", - "delete:custom_signing_keys", - "read:federated_connections_tokens", - "delete:federated_connections_tokens", - "create:user_attribute_profiles", - "read:user_attribute_profiles", - "update:user_attribute_profiles", - "delete:user_attribute_profiles", - "read:event_streams", - "create:event_streams", - "delete:event_streams", - "update:event_streams", - "read:event_deliveries", - "update:event_deliveries", - "create:connection_profiles", - "read:connection_profiles", - "update:connection_profiles", - "delete:connection_profiles", - "read:organization_client_grants", - "create:organization_client_grants", - "delete:organization_client_grants", - "read:security_metrics", - "read:connections_keys", - "update:connections_keys", - "create:connections_keys" - ], - "subject_type": "client" - } - ] - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/roles?per_page=100&page=0&include_totals=true", - "body": "", - "status": 200, - "response": { - "roles": [ - { - "id": "rol_jVbPH8r1ZIGS2gXN", - "name": "Admin", - "description": "Can read and write things" - }, - { - "id": "rol_xWADOPL9iJP4nUdr", - "name": "Reader", - "description": "Can only read things" - }, - { - "id": "rol_Iu8aIRwIrZ7Zk2Bz", - "name": "read_only", - "description": "Read Only" - }, - { - "id": "rol_hjHjIWbcLZccpcmF", - "name": "read_osnly", - "description": "Readz Only" - } - ], - "start": 0, - "limit": 100, - "total": 4 - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/roles/rol_jVbPH8r1ZIGS2gXN/permissions?per_page=100&page=0&include_totals=true", - "body": "", - "status": 200, - "response": { - "permissions": [], - "start": 0, - "limit": 100, - "total": 0 - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/roles/rol_xWADOPL9iJP4nUdr/permissions?per_page=100&page=0&include_totals=true", - "body": "", - "status": 200, - "response": { - "permissions": [], - "start": 0, - "limit": 100, - "total": 0 - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/roles/rol_Iu8aIRwIrZ7Zk2Bz/permissions?per_page=100&page=0&include_totals=true", - "body": "", - "status": 200, - "response": { - "permissions": [], - "start": 0, - "limit": 100, - "total": 0 - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/roles/rol_hjHjIWbcLZccpcmF/permissions?per_page=100&page=0&include_totals=true", - "body": "", - "status": 200, - "response": { - "permissions": [], - "start": 0, - "limit": 100, - "total": 0 - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/organizations?include_totals=true", - "body": "", - "status": 200, - "response": { - "organizations": [ - { - "id": "org_GDDGaXDUPC3vLmot", - "name": "org1", - "display_name": "Organization", - "branding": { - "colors": { - "page_background": "#fff5f5", - "primary": "#57ddff" - } - } - }, - { - "id": "org_dg75TodzDZQ3yqAV", - "name": "org2", - "display_name": "Organization2" - } - ], - "start": 0, - "limit": 50, - "total": 2 - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/clients?page=0&per_page=100&include_totals=true", - "body": "", - "status": 200, - "response": { - "total": 10, - "start": 0, - "limit": 100, - "clients": [ - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Deploy CLI", - "is_first_party": true, - "oidc_conformant": true, - "sso_disabled": false, - "cross_origin_auth": false, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, - "cross_origin_authentication": true, - "allowed_clients": [], - "callbacks": [], - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", - "grant_types": [ - "client_credentials", - "implicit", - "authorization_code", - "refresh_token" - ], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Default App", - "callbacks": [], - "cross_origin_auth": false, - "is_first_party": true, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 2592000, - "idle_token_lifetime": 1296000, - "rotation_type": "non-rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "dMsTNDvIh3YcBOuWaSGDLKJeI6pUcWwZ", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "grant_types": [ - "authorization_code", - "implicit", - "refresh_token", - "client_credentials" - ], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "API Explorer Application", - "allowed_clients": [], - "callbacks": [], - "client_metadata": {}, - "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "uuEKiBwEtHSFm9qiQoUrnbFg55ZD63QW", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", - "grant_types": [ - "client_credentials" - ], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Node App", - "allowed_clients": [], - "allowed_logout_urls": [], - "callbacks": [], - "client_metadata": {}, - "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "allowed_origins": [], - "client_id": "k15LH4UseegSadRNaQhwB1sRTLPSLBTo", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "regular_web", - "grant_types": [ - "authorization_code", - "implicit", - "refresh_token", - "client_credentials" - ], - "web_origins": [], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Quickstarts API (Test Application)", - "client_metadata": { - "foo": "bar" - }, - "is_first_party": true, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "PLgyapzr13G0aryQTRzgSsMJ9dbbYvqp", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", - "grant_types": [ - "client_credentials" - ], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "The Default App", - "allowed_clients": [], - "callbacks": [], - "client_metadata": {}, - "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "oidc_conformant": false, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 2592000, - "idle_token_lifetime": 1296000, - "rotation_type": "non-rotating" - }, - "sso": false, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "uw8hjIHcxeL2LaKGbBtFGwEdPXkzhWl3", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "grant_types": [ - "authorization_code", - "implicit", - "refresh_token", - "client_credentials" - ], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Terraform Provider", - "is_first_party": true, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "KsK8Stn8v2U4JSoYY6QEcDcSFyDqratO", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", - "grant_types": [ - "client_credentials" - ], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Test SPA", - "allowed_clients": [], - "allowed_logout_urls": [ - "http://localhost:3000" - ], - "callbacks": [ - "http://localhost:3000" - ], - "client_metadata": {}, - "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "expiring", - "leeway": 0, - "token_lifetime": 2592000, - "idle_token_lifetime": 1296000, - "infinite_token_lifetime": false, - "infinite_idle_token_lifetime": false, - "rotation_type": "rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "WM7pCOae5czoa1vUFr8vLEnX8pyoNgYV", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "client_aliases": [], - "token_endpoint_auth_method": "none", - "app_type": "spa", - "grant_types": [ - "authorization_code", - "implicit", - "refresh_token" - ], - "web_origins": [ - "http://localhost:3000" - ], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "auth0-deploy-cli-extension", - "allowed_clients": [], - "callbacks": [], - "client_metadata": {}, - "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "CFSqJJvGh1dleeE9m7FXd52VbNTG6z5g", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", - "grant_types": [ - "client_credentials" - ], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": true, - "callbacks": [], - "is_first_party": true, - "name": "All Applications", - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 2592000, - "idle_token_lifetime": 1296000, - "rotation_type": "non-rotating" - }, - "owners": [ - "mr|samlp|okta|will.vedder@auth0.com", - "mr|google-oauth2|102002633619863830825", - "mr|samlp|okta|frederik.prijck@auth0.com", - "mr|google-oauth2|109614534713742077035", - "mr|google-oauth2|116771660953104383819", - "mr|google-oauth2|112839029247827700155", - "mr|samlp|okta|ewan.harris@auth0.com" - ], - "custom_login_page": "TEST123\n", - "cross_origin_authentication": true, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "Isi93ibGHIGwmdYjsLwTOn7Gu7nwxU3V", - "client_secret": "[REDACTED]", - "custom_login_page_on": true - } - ] - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/organizations?include_totals=true&take=50", - "body": "", - "status": 200, - "response": { - "organizations": [ - { - "id": "org_dg75TodzDZQ3yqAV", - "name": "org2", - "display_name": "Organization2" - }, - { - "id": "org_GDDGaXDUPC3vLmot", - "name": "org1", - "display_name": "Organization", - "branding": { - "colors": { - "page_background": "#fff5f5", - "primary": "#57ddff" - } - } - } - ] - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/organizations/org_dg75TodzDZQ3yqAV/enabled_connections", - "body": "", - "status": 200, - "response": [], - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/organizations/org_dg75TodzDZQ3yqAV/client-grants?page=0&per_page=100&include_totals=true", - "body": "", - "status": 200, - "response": { - "client_grants": [], - "start": 0, - "limit": 100, - "total": 0 - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/organizations/org_dg75TodzDZQ3yqAV/discovery-domains?take=50", - "body": "", - "status": 200, - "response": { - "domains": [] - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/organizations/org_GDDGaXDUPC3vLmot/enabled_connections", - "body": "", - "status": 200, - "response": [], - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/organizations/org_GDDGaXDUPC3vLmot/client-grants?page=0&per_page=100&include_totals=true", - "body": "", - "status": 200, - "response": { - "client_grants": [], - "start": 0, - "limit": 100, - "total": 0 - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/organizations/org_GDDGaXDUPC3vLmot/discovery-domains?take=50", - "body": "", - "status": 200, - "response": { - "domains": [] - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/connections?include_totals=true", - "body": "", - "status": 200, - "response": { - "total": 3, - "start": 0, - "limit": 50, - "connections": [ - { - "id": "con_dbGeR0csgLy1hKRe", - "options": { - "mfa": { - "active": true, - "return_enroll_settings": true - }, - "import_mode": false, - "customScripts": { - "login": "function login(email, password, callback) {\n // This script should authenticate a user against the credentials stored in\n // your database.\n // It is executed when a user attempts to log in or immediately after signing\n // up (as a verification that the user was successfully signed up).\n //\n // Everything returned by this script will be set as part of the user profile\n // and will be visible by any of the tenant admins. Avoid adding attributes\n // with values such as passwords, keys, secrets, etc.\n //\n // The `password` parameter of this function is in plain text. It must be\n // hashed/salted to match whatever is stored in your database. For example:\n //\n // var bcrypt = require('bcrypt@0.8.5');\n // bcrypt.compare(password, dbPasswordHash, function(err, res)) { ... }\n //\n // There are three ways this script can finish:\n // 1. The user's credentials are valid. The returned user profile should be in\n // the following format: https://auth0.com/docs/users/normalized/auth0/normalized-user-profile-schema\n // var profile = {\n // user_id: ..., // user_id is mandatory\n // email: ...,\n // [...]\n // };\n // callback(null, profile);\n // 2. The user's credentials are invalid\n // callback(new WrongUsernameOrPasswordError(email, \"my error message\"));\n // 3. Something went wrong while trying to reach your database\n // callback(new Error(\"my error message\"));\n //\n // A list of Node.js modules which can be referenced is available here:\n //\n // https://tehsis.github.io/webtaskio-canirequire/\n console.log('AYYYYYE');\n\n const msg =\n 'Please implement the Login script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "create": "function create(user, callback) {\n // This script should create a user entry in your existing database. It will\n // be executed when a user attempts to sign up, or when a user is created\n // through the Auth0 dashboard or API.\n // When this script has finished executing, the Login script will be\n // executed immediately afterwards, to verify that the user was created\n // successfully.\n //\n // The user object will always contain the following properties:\n // * email: the user's email\n // * password: the password entered by the user, in plain text\n // * tenant: the name of this Auth0 account\n // * client_id: the client ID of the application where the user signed up, or\n // API key if created through the API or Auth0 dashboard\n // * connection: the name of this database connection\n //\n // There are three ways this script can finish:\n // 1. A user was successfully created\n // callback(null);\n // 2. This user already exists in your database\n // callback(new ValidationError(\"user_exists\", \"my error message\"));\n // 3. Something went wrong while trying to reach your database\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Create script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "delete": "function remove(id, callback) {\n // This script remove a user from your existing database.\n // It is executed whenever a user is deleted from the API or Auth0 dashboard.\n //\n // There are two ways that this script can finish:\n // 1. The user was removed successfully:\n // callback(null);\n // 2. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Delete script for this database ' +\n 'connection at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "verify": "function verify(email, callback) {\n // This script should mark the current user's email address as verified in\n // your database.\n // It is executed whenever a user clicks the verification link sent by email.\n // These emails can be customized at https://manage.auth0.com/#/emails.\n // It is safe to assume that the user's email already exists in your database,\n // because verification emails, if enabled, are sent immediately after a\n // successful signup.\n //\n // There are two ways that this script can finish:\n // 1. The user's email was verified successfully\n // callback(null, true);\n // 2. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n //\n // If an error is returned, it will be passed to the query string of the page\n // where the user is being redirected to after clicking the verification link.\n // For example, returning `callback(new Error(\"error\"))` and redirecting to\n // https://example.com would redirect to the following URL:\n // https://example.com?email=alice%40example.com&message=error&success=false\n\n const msg =\n 'Please implement the Verify script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "get_user": "function getByEmail(email, callback) {\n // This script should retrieve a user profile from your existing database,\n // without authenticating the user.\n // It is used to check if a user exists before executing flows that do not\n // require authentication (signup and password reset).\n //\n // There are three ways this script can finish:\n // 1. A user was successfully found. The profile should be in the following\n // format: https://auth0.com/docs/users/normalized/auth0/normalized-user-profile-schema.\n // callback(null, profile);\n // 2. A user was not found\n // callback(null);\n // 3. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Get User script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "change_password": "function changePassword(email, newPassword, callback) {\n // This script should change the password stored for the current user in your\n // database. It is executed when the user clicks on the confirmation link\n // after a reset password request.\n // The content and behavior of password confirmation emails can be customized\n // here: https://manage.auth0.com/#/emails\n // The `newPassword` parameter of this function is in plain text. It must be\n // hashed/salted to match whatever is stored in your database.\n //\n // There are three ways that this script can finish:\n // 1. The user's password was updated successfully:\n // callback(null, true);\n // 2. The user's password was not updated:\n // callback(null, false);\n // 3. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n //\n // If an error is returned, it will be passed to the query string of the page\n // where the user is being redirected to after clicking the confirmation link.\n // For example, returning `callback(new Error(\"error\"))` and redirecting to\n // https://example.com would redirect to the following URL:\n // https://example.com?email=alice%40example.com&message=error&success=false\n\n const msg =\n 'Please implement the Change Password script for this database ' +\n 'connection at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n" - }, - "disable_signup": false, - "passwordPolicy": "low", - "passkey_options": { - "challenge_ui": "both", - "local_enrollment_enabled": true, - "progressive_enrollment_enabled": true - }, - "password_history": { - "size": 5, - "enable": false - }, - "strategy_version": 2, - "requires_username": true, - "password_dictionary": { - "enable": true, - "dictionary": [] - }, - "authentication_methods": { - "passkey": { - "enabled": false - }, - "password": { - "enabled": true, - "api_behavior": "required" - } - }, - "brute_force_protection": true, - "password_no_personal_info": { - "enable": true - }, - "password_complexity_options": { - "min_length": 8 - }, - "enabledDatabaseCustomization": true - }, - "strategy": "auth0", - "name": "boo-baz-db-connection-test", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "boo-baz-db-connection-test" - ], - "enabled_clients": [ - "k15LH4UseegSadRNaQhwB1sRTLPSLBTo", - "CFSqJJvGh1dleeE9m7FXd52VbNTG6z5g" - ] - }, - { - "id": "con_K6JOwBbKFCexaEHM", - "options": { - "email": true, - "scope": [ - "email", - "profile" - ], - "profile": true - }, - "strategy": "google-oauth2", - "name": "google-oauth2", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "google-oauth2" - ], - "enabled_clients": [ - "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", - "dMsTNDvIh3YcBOuWaSGDLKJeI6pUcWwZ" - ] - }, - { - "id": "con_dcwXkGIDW6UUQ5Kn", - "options": { - "mfa": { - "active": true, - "return_enroll_settings": true - }, - "passwordPolicy": "good", - "passkey_options": { - "challenge_ui": "both", - "local_enrollment_enabled": true, - "progressive_enrollment_enabled": true - }, - "strategy_version": 2, - "authentication_methods": { - "passkey": { - "enabled": false - }, - "password": { - "enabled": true, - "api_behavior": "required" - } - }, - "brute_force_protection": true - }, - "strategy": "auth0", - "name": "Username-Password-Authentication", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "Username-Password-Authentication" - ], - "enabled_clients": [ - "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", - "dMsTNDvIh3YcBOuWaSGDLKJeI6pUcWwZ" - ] - } - ] - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/connections?include_totals=true&take=50", - "body": "", - "status": 200, - "response": { - "connections": [ - { - "id": "con_dbGeR0csgLy1hKRe", - "options": { - "mfa": { - "active": true, - "return_enroll_settings": true - }, - "import_mode": false, - "customScripts": { - "login": "function login(email, password, callback) {\n // This script should authenticate a user against the credentials stored in\n // your database.\n // It is executed when a user attempts to log in or immediately after signing\n // up (as a verification that the user was successfully signed up).\n //\n // Everything returned by this script will be set as part of the user profile\n // and will be visible by any of the tenant admins. Avoid adding attributes\n // with values such as passwords, keys, secrets, etc.\n //\n // The `password` parameter of this function is in plain text. It must be\n // hashed/salted to match whatever is stored in your database. For example:\n //\n // var bcrypt = require('bcrypt@0.8.5');\n // bcrypt.compare(password, dbPasswordHash, function(err, res)) { ... }\n //\n // There are three ways this script can finish:\n // 1. The user's credentials are valid. The returned user profile should be in\n // the following format: https://auth0.com/docs/users/normalized/auth0/normalized-user-profile-schema\n // var profile = {\n // user_id: ..., // user_id is mandatory\n // email: ...,\n // [...]\n // };\n // callback(null, profile);\n // 2. The user's credentials are invalid\n // callback(new WrongUsernameOrPasswordError(email, \"my error message\"));\n // 3. Something went wrong while trying to reach your database\n // callback(new Error(\"my error message\"));\n //\n // A list of Node.js modules which can be referenced is available here:\n //\n // https://tehsis.github.io/webtaskio-canirequire/\n console.log('AYYYYYE');\n\n const msg =\n 'Please implement the Login script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "create": "function create(user, callback) {\n // This script should create a user entry in your existing database. It will\n // be executed when a user attempts to sign up, or when a user is created\n // through the Auth0 dashboard or API.\n // When this script has finished executing, the Login script will be\n // executed immediately afterwards, to verify that the user was created\n // successfully.\n //\n // The user object will always contain the following properties:\n // * email: the user's email\n // * password: the password entered by the user, in plain text\n // * tenant: the name of this Auth0 account\n // * client_id: the client ID of the application where the user signed up, or\n // API key if created through the API or Auth0 dashboard\n // * connection: the name of this database connection\n //\n // There are three ways this script can finish:\n // 1. A user was successfully created\n // callback(null);\n // 2. This user already exists in your database\n // callback(new ValidationError(\"user_exists\", \"my error message\"));\n // 3. Something went wrong while trying to reach your database\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Create script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "delete": "function remove(id, callback) {\n // This script remove a user from your existing database.\n // It is executed whenever a user is deleted from the API or Auth0 dashboard.\n //\n // There are two ways that this script can finish:\n // 1. The user was removed successfully:\n // callback(null);\n // 2. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Delete script for this database ' +\n 'connection at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "verify": "function verify(email, callback) {\n // This script should mark the current user's email address as verified in\n // your database.\n // It is executed whenever a user clicks the verification link sent by email.\n // These emails can be customized at https://manage.auth0.com/#/emails.\n // It is safe to assume that the user's email already exists in your database,\n // because verification emails, if enabled, are sent immediately after a\n // successful signup.\n //\n // There are two ways that this script can finish:\n // 1. The user's email was verified successfully\n // callback(null, true);\n // 2. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n //\n // If an error is returned, it will be passed to the query string of the page\n // where the user is being redirected to after clicking the verification link.\n // For example, returning `callback(new Error(\"error\"))` and redirecting to\n // https://example.com would redirect to the following URL:\n // https://example.com?email=alice%40example.com&message=error&success=false\n\n const msg =\n 'Please implement the Verify script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "get_user": "function getByEmail(email, callback) {\n // This script should retrieve a user profile from your existing database,\n // without authenticating the user.\n // It is used to check if a user exists before executing flows that do not\n // require authentication (signup and password reset).\n //\n // There are three ways this script can finish:\n // 1. A user was successfully found. The profile should be in the following\n // format: https://auth0.com/docs/users/normalized/auth0/normalized-user-profile-schema.\n // callback(null, profile);\n // 2. A user was not found\n // callback(null);\n // 3. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n\n const msg =\n 'Please implement the Get User script for this database connection ' +\n 'at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n", - "change_password": "function changePassword(email, newPassword, callback) {\n // This script should change the password stored for the current user in your\n // database. It is executed when the user clicks on the confirmation link\n // after a reset password request.\n // The content and behavior of password confirmation emails can be customized\n // here: https://manage.auth0.com/#/emails\n // The `newPassword` parameter of this function is in plain text. It must be\n // hashed/salted to match whatever is stored in your database.\n //\n // There are three ways that this script can finish:\n // 1. The user's password was updated successfully:\n // callback(null, true);\n // 2. The user's password was not updated:\n // callback(null, false);\n // 3. Something went wrong while trying to reach your database:\n // callback(new Error(\"my error message\"));\n //\n // If an error is returned, it will be passed to the query string of the page\n // where the user is being redirected to after clicking the confirmation link.\n // For example, returning `callback(new Error(\"error\"))` and redirecting to\n // https://example.com would redirect to the following URL:\n // https://example.com?email=alice%40example.com&message=error&success=false\n\n const msg =\n 'Please implement the Change Password script for this database ' +\n 'connection at https://manage.auth0.com/#/connections/database';\n return callback(new Error(msg));\n}\n" - }, - "disable_signup": false, - "passwordPolicy": "low", - "passkey_options": { - "challenge_ui": "both", - "local_enrollment_enabled": true, - "progressive_enrollment_enabled": true - }, - "password_history": { - "size": 5, - "enable": false - }, - "strategy_version": 2, - "requires_username": true, - "password_dictionary": { - "enable": true, - "dictionary": [] - }, - "authentication_methods": { - "passkey": { - "enabled": false - }, - "password": { - "enabled": true, - "api_behavior": "required" - } - }, - "brute_force_protection": true, - "password_no_personal_info": { - "enable": true - }, - "password_complexity_options": { - "min_length": 8 - }, - "enabledDatabaseCustomization": true - }, - "strategy": "auth0", - "name": "boo-baz-db-connection-test", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "boo-baz-db-connection-test" - ], - "enabled_clients": [ - "k15LH4UseegSadRNaQhwB1sRTLPSLBTo", - "CFSqJJvGh1dleeE9m7FXd52VbNTG6z5g" - ] - }, - { - "id": "con_K6JOwBbKFCexaEHM", - "options": { - "email": true, - "scope": [ - "email", - "profile" - ], - "profile": true - }, - "strategy": "google-oauth2", - "name": "google-oauth2", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "google-oauth2" - ], - "enabled_clients": [ - "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", - "dMsTNDvIh3YcBOuWaSGDLKJeI6pUcWwZ" - ] - }, - { - "id": "con_dcwXkGIDW6UUQ5Kn", - "options": { - "mfa": { - "active": true, - "return_enroll_settings": true - }, - "passwordPolicy": "good", - "passkey_options": { - "challenge_ui": "both", - "local_enrollment_enabled": true, - "progressive_enrollment_enabled": true - }, - "strategy_version": 2, - "authentication_methods": { - "passkey": { - "enabled": false - }, - "password": { - "enabled": true, - "api_behavior": "required" - } - }, - "brute_force_protection": true - }, - "strategy": "auth0", - "name": "Username-Password-Authentication", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "Username-Password-Authentication" - ], - "enabled_clients": [ - "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", - "dMsTNDvIh3YcBOuWaSGDLKJeI6pUcWwZ" - ] - } - ] - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/clients?page=0&per_page=100&include_totals=true", - "body": "", - "status": 200, - "response": { - "total": 10, - "start": 0, - "limit": 100, - "clients": [ - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Deploy CLI", - "is_first_party": true, - "oidc_conformant": true, - "sso_disabled": false, - "cross_origin_auth": false, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, - "cross_origin_authentication": true, - "allowed_clients": [], - "callbacks": [], - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", - "grant_types": [ - "client_credentials", - "implicit", - "authorization_code", - "refresh_token" - ], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Default App", - "callbacks": [], - "cross_origin_auth": false, - "is_first_party": true, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 2592000, - "idle_token_lifetime": 1296000, - "rotation_type": "non-rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "dMsTNDvIh3YcBOuWaSGDLKJeI6pUcWwZ", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "grant_types": [ - "authorization_code", - "implicit", - "refresh_token", - "client_credentials" - ], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "API Explorer Application", - "allowed_clients": [], - "callbacks": [], - "client_metadata": {}, - "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "uuEKiBwEtHSFm9qiQoUrnbFg55ZD63QW", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", - "grant_types": [ - "client_credentials" + "id": "cgr_pbwejzhwoujrsNE8", + "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", + "audience": "https://auth0-deploy-cli-e2e.us.auth0.com/api/v2/", + "scope": [ + "read:client_grants", + "create:client_grants", + "delete:client_grants", + "update:client_grants", + "read:users", + "update:users", + "delete:users", + "create:users", + "read:users_app_metadata", + "update:users_app_metadata", + "delete:users_app_metadata", + "create:users_app_metadata", + "read:user_custom_blocks", + "create:user_custom_blocks", + "delete:user_custom_blocks", + "create:user_tickets", + "read:clients", + "update:clients", + "delete:clients", + "create:clients", + "read:client_keys", + "update:client_keys", + "delete:client_keys", + "create:client_keys", + "read:client_credentials", + "update:client_credentials", + "delete:client_credentials", + "create:client_credentials", + "read:connections", + "update:connections", + "delete:connections", + "create:connections", + "read:resource_servers", + "update:resource_servers", + "delete:resource_servers", + "create:resource_servers", + "read:device_credentials", + "update:device_credentials", + "delete:device_credentials", + "create:device_credentials", + "read:rules", + "update:rules", + "delete:rules", + "create:rules", + "read:rules_configs", + "update:rules_configs", + "delete:rules_configs", + "read:hooks", + "update:hooks", + "delete:hooks", + "create:hooks", + "read:actions", + "update:actions", + "delete:actions", + "create:actions", + "read:email_provider", + "update:email_provider", + "delete:email_provider", + "create:email_provider", + "blacklist:tokens", + "read:stats", + "read:insights", + "read:tenant_settings", + "update:tenant_settings", + "read:logs", + "read:logs_users", + "read:shields", + "create:shields", + "update:shields", + "delete:shields", + "read:anomaly_blocks", + "delete:anomaly_blocks", + "update:triggers", + "read:triggers", + "read:grants", + "delete:grants", + "read:guardian_factors", + "update:guardian_factors", + "read:guardian_enrollments", + "delete:guardian_enrollments", + "create:guardian_enrollment_tickets", + "read:user_idp_tokens", + "create:passwords_checking_job", + "delete:passwords_checking_job", + "read:custom_domains", + "delete:custom_domains", + "create:custom_domains", + "update:custom_domains", + "read:email_templates", + "create:email_templates", + "update:email_templates", + "read:mfa_policies", + "update:mfa_policies", + "read:roles", + "create:roles", + "delete:roles", + "update:roles", + "read:prompts", + "update:prompts", + "read:branding", + "update:branding", + "delete:branding", + "read:log_streams", + "create:log_streams", + "delete:log_streams", + "update:log_streams", + "create:signing_keys", + "read:signing_keys", + "update:signing_keys", + "read:limits", + "update:limits", + "create:role_members", + "read:role_members", + "delete:role_members", + "read:entitlements", + "read:attack_protection", + "update:attack_protection", + "read:organizations_summary", + "create:authentication_methods", + "read:authentication_methods", + "update:authentication_methods", + "delete:authentication_methods", + "read:organizations", + "update:organizations", + "create:organizations", + "delete:organizations", + "read:organization_discovery_domains", + "update:organization_discovery_domains", + "create:organization_discovery_domains", + "delete:organization_discovery_domains", + "create:organization_members", + "read:organization_members", + "delete:organization_members", + "create:organization_connections", + "read:organization_connections", + "update:organization_connections", + "delete:organization_connections", + "create:organization_member_roles", + "read:organization_member_roles", + "delete:organization_member_roles", + "create:organization_invitations", + "read:organization_invitations", + "delete:organization_invitations", + "read:scim_config", + "create:scim_config", + "update:scim_config", + "delete:scim_config", + "create:scim_token", + "read:scim_token", + "delete:scim_token", + "delete:phone_providers", + "create:phone_providers", + "read:phone_providers", + "update:phone_providers", + "delete:phone_templates", + "create:phone_templates", + "read:phone_templates", + "update:phone_templates", + "create:encryption_keys", + "read:encryption_keys", + "update:encryption_keys", + "delete:encryption_keys", + "read:sessions", + "update:sessions", + "delete:sessions", + "read:refresh_tokens", + "delete:refresh_tokens", + "create:self_service_profiles", + "read:self_service_profiles", + "update:self_service_profiles", + "delete:self_service_profiles", + "create:sso_access_tickets", + "delete:sso_access_tickets", + "read:forms", + "update:forms", + "delete:forms", + "create:forms", + "read:flows", + "update:flows", + "delete:flows", + "create:flows", + "read:flows_vault", + "read:flows_vault_connections", + "update:flows_vault_connections", + "delete:flows_vault_connections", + "create:flows_vault_connections", + "read:flows_executions", + "delete:flows_executions", + "read:connections_options", + "update:connections_options", + "read:self_service_profile_custom_texts", + "update:self_service_profile_custom_texts", + "create:network_acls", + "update:network_acls", + "read:network_acls", + "delete:network_acls", + "delete:vdcs_templates", + "read:vdcs_templates", + "create:vdcs_templates", + "update:vdcs_templates", + "create:custom_signing_keys", + "read:custom_signing_keys", + "update:custom_signing_keys", + "delete:custom_signing_keys", + "read:federated_connections_tokens", + "delete:federated_connections_tokens", + "create:user_attribute_profiles", + "read:user_attribute_profiles", + "update:user_attribute_profiles", + "delete:user_attribute_profiles", + "read:event_streams", + "create:event_streams", + "delete:event_streams", + "update:event_streams", + "read:event_deliveries", + "update:event_deliveries", + "create:connection_profiles", + "read:connection_profiles", + "update:connection_profiles", + "delete:connection_profiles", + "read:organization_client_grants", + "create:organization_client_grants", + "delete:organization_client_grants", + "read:security_metrics", + "read:connections_keys", + "update:connections_keys", + "create:connections_keys" ], - "custom_login_page_on": true - }, + "subject_type": "client" + } + ] + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/roles?per_page=100&page=0&include_totals=true", + "body": "", + "status": 200, + "response": { + "roles": [], + "start": 0, + "limit": 100, + "total": 0 + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/organizations?take=50", + "body": "", + "status": 200, + "response": { + "organizations": [] + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/clients?page=0&per_page=100&include_totals=true", + "body": "", + "status": 200, + "response": { + "total": 3, + "start": 0, + "limit": 100, + "clients": [ { "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "Node App", - "allowed_clients": [], - "allowed_logout_urls": [], - "callbacks": [], - "client_metadata": {}, + "name": "Deploy CLI", "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, "sso_disabled": false, - "cross_origin_authentication": false, "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "allowed_origins": [], - "client_id": "k15LH4UseegSadRNaQhwB1sRTLPSLBTo", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "regular_web", - "grant_types": [ - "authorization_code", - "implicit", - "refresh_token", - "client_credentials" - ], - "web_origins": [], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Quickstarts API (Test Application)", - "client_metadata": { - "foo": "bar" - }, - "is_first_party": true, - "oidc_conformant": true, "refresh_token": { "expiration_type": "non-expiring", "leeway": 0, @@ -6701,40 +2757,9 @@ "idle_token_lifetime": 2592000, "rotation_type": "non-rotating" }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "PLgyapzr13G0aryQTRzgSsMJ9dbbYvqp", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", - "grant_types": [ - "client_credentials" - ], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "The Default App", + "cross_origin_authentication": true, "allowed_clients": [], "callbacks": [], - "client_metadata": {}, - "is_first_party": true, "native_social_login": { "apple": { "enabled": false @@ -6743,20 +2768,6 @@ "enabled": false } }, - "oidc_conformant": false, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 2592000, - "idle_token_lifetime": 1296000, - "rotation_type": "non-rotating" - }, - "sso": false, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, "signing_keys": [ { "cert": "[REDACTED]", @@ -6764,7 +2775,7 @@ "subject": "deprecated" } ], - "client_id": "uw8hjIHcxeL2LaKGbBtFGwEdPXkzhWl3", + "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -6774,143 +2785,30 @@ }, "client_aliases": [], "token_endpoint_auth_method": "client_secret_post", - "grant_types": [ - "authorization_code", - "implicit", - "refresh_token", - "client_credentials" - ], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Terraform Provider", - "is_first_party": true, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "KsK8Stn8v2U4JSoYY6QEcDcSFyDqratO", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "token_endpoint_auth_method": "client_secret_post", "app_type": "non_interactive", "grant_types": [ - "client_credentials" - ], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Test SPA", - "allowed_clients": [], - "allowed_logout_urls": [ - "http://localhost:3000" - ], - "callbacks": [ - "http://localhost:3000" - ], - "client_metadata": {}, - "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "expiring", - "leeway": 0, - "token_lifetime": 2592000, - "idle_token_lifetime": 1296000, - "infinite_token_lifetime": false, - "infinite_idle_token_lifetime": false, - "rotation_type": "rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "WM7pCOae5czoa1vUFr8vLEnX8pyoNgYV", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "client_aliases": [], - "token_endpoint_auth_method": "none", - "app_type": "spa", - "grant_types": [ - "authorization_code", + "client_credentials", "implicit", + "authorization_code", "refresh_token" ], - "web_origins": [ - "http://localhost:3000" - ], "custom_login_page_on": true }, { "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "auth0-deploy-cli-extension", - "allowed_clients": [], + "name": "Default App", "callbacks": [], - "client_metadata": {}, "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, "oidc_conformant": true, "refresh_token": { "expiration_type": "non-expiring", "leeway": 0, "infinite_token_lifetime": true, "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, + "token_lifetime": 2592000, + "idle_token_lifetime": 1296000, "rotation_type": "non-rotating" }, "sso_disabled": false, @@ -6923,7 +2821,7 @@ "subject": "deprecated" } ], - "client_id": "CFSqJJvGh1dleeE9m7FXd52VbNTG6z5g", + "client_id": "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -6931,10 +2829,10 @@ "lifetime_in_seconds": 36000, "secret_encoded": false }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", "grant_types": [ + "authorization_code", + "implicit", + "refresh_token", "client_credentials" ], "custom_login_page_on": true @@ -6984,290 +2882,244 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/client-grants?per_page=100&page=0&include_totals=true", + "path": "/api/v2/connections?take=50", + "body": "", + "status": 200, + "response": { + "connections": [ + { + "id": "con_lfhXlIY73LFJlMks", + "options": { + "email": true, + "scope": [ + "email", + "profile" + ], + "profile": true + }, + "strategy": "google-oauth2", + "name": "google-oauth2", + "is_domain_connection": false, + "authentication": { + "active": true + }, + "connected_accounts": { + "active": false + }, + "realms": [ + "google-oauth2" + ], + "enabled_clients": [ + "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", + "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" + ] + }, + { + "id": "con_3R2lX4rln4ArocW5", + "options": { + "mfa": { + "active": true, + "return_enroll_settings": true + }, + "passwordPolicy": "good", + "passkey_options": { + "challenge_ui": "both", + "local_enrollment_enabled": true, + "progressive_enrollment_enabled": true + }, + "strategy_version": 2, + "authentication_methods": { + "passkey": { + "enabled": false + }, + "password": { + "enabled": true, + "api_behavior": "required" + } + }, + "brute_force_protection": true + }, + "strategy": "auth0", + "name": "Username-Password-Authentication", + "is_domain_connection": false, + "authentication": { + "active": true + }, + "connected_accounts": { + "active": false + }, + "realms": [ + "Username-Password-Authentication" + ], + "enabled_clients": [ + "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", + "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" + ] + } + ] + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/clients?page=0&per_page=100&include_totals=true", "body": "", "status": 200, "response": { "total": 3, "start": 0, "limit": 100, - "client_grants": [ + "clients": [ { - "id": "cgr_HYZXCfVcMMieVFRJ", - "client_id": "KsK8Stn8v2U4JSoYY6QEcDcSFyDqratO", - "audience": "https://auth0-deploy-cli-e2e.us.auth0.com/api/v2/", - "scope": [ - "read:client_grants", - "create:client_grants", - "delete:client_grants", - "update:client_grants", - "read:users", - "update:users", - "delete:users", - "create:users", - "read:users_app_metadata", - "update:users_app_metadata", - "delete:users_app_metadata", - "create:users_app_metadata", - "read:user_custom_blocks", - "create:user_custom_blocks", - "delete:user_custom_blocks", - "create:user_tickets", - "read:clients", - "update:clients", - "delete:clients", - "create:clients", - "read:client_keys", - "update:client_keys", - "delete:client_keys", - "create:client_keys", - "read:connections", - "update:connections", - "delete:connections", - "create:connections", - "read:resource_servers", - "update:resource_servers", - "delete:resource_servers", - "create:resource_servers", - "read:device_credentials", - "update:device_credentials", - "delete:device_credentials", - "create:device_credentials", - "read:rules", - "update:rules", - "delete:rules", - "create:rules", - "read:rules_configs", - "update:rules_configs", - "delete:rules_configs", - "read:hooks", - "update:hooks", - "delete:hooks", - "create:hooks", - "read:actions", - "update:actions", - "delete:actions", - "create:actions", - "read:email_provider", - "update:email_provider", - "delete:email_provider", - "create:email_provider", - "blacklist:tokens", - "read:stats", - "read:insights", - "read:tenant_settings", - "update:tenant_settings", - "read:logs", - "read:logs_users", - "read:shields", - "create:shields", - "update:shields", - "delete:shields", - "read:anomaly_blocks", - "delete:anomaly_blocks", - "update:triggers", - "read:triggers", - "read:grants", - "delete:grants", - "read:guardian_factors", - "update:guardian_factors", - "read:guardian_enrollments", - "delete:guardian_enrollments", - "create:guardian_enrollment_tickets", - "read:user_idp_tokens", - "create:passwords_checking_job", - "delete:passwords_checking_job", - "read:custom_domains", - "delete:custom_domains", - "create:custom_domains", - "update:custom_domains", - "read:email_templates", - "create:email_templates", - "update:email_templates", - "read:mfa_policies", - "update:mfa_policies", - "read:roles", - "create:roles", - "delete:roles", - "update:roles", - "read:prompts", - "update:prompts", - "read:branding", - "update:branding", - "delete:branding", - "read:log_streams", - "create:log_streams", - "delete:log_streams", - "update:log_streams", - "create:signing_keys", - "read:signing_keys", - "update:signing_keys", - "read:limits", - "update:limits", - "create:role_members", - "read:role_members", - "delete:role_members", - "read:entitlements", - "read:attack_protection", - "update:attack_protection", - "read:organizations", - "update:organizations", - "create:organizations", - "delete:organizations", - "create:organization_members", - "read:organization_members", - "delete:organization_members", - "create:organization_connections", - "read:organization_connections", - "update:organization_connections", - "delete:organization_connections", - "create:organization_member_roles", - "read:organization_member_roles", - "delete:organization_member_roles", - "create:organization_invitations", - "read:organization_invitations", - "delete:organization_invitations" + "tenant": "auth0-deploy-cli-e2e", + "global": false, + "is_token_endpoint_ip_header_trusted": false, + "name": "Deploy CLI", + "is_first_party": true, + "oidc_conformant": true, + "sso_disabled": false, + "cross_origin_auth": false, + "refresh_token": { + "expiration_type": "non-expiring", + "leeway": 0, + "infinite_token_lifetime": true, + "infinite_idle_token_lifetime": true, + "token_lifetime": 31557600, + "idle_token_lifetime": 2592000, + "rotation_type": "non-rotating" + }, + "cross_origin_authentication": true, + "allowed_clients": [], + "callbacks": [], + "native_social_login": { + "apple": { + "enabled": false + }, + "facebook": { + "enabled": false + } + }, + "signing_keys": [ + { + "cert": "[REDACTED]", + "pkcs7": "[REDACTED]", + "subject": "deprecated" + } + ], + "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", + "callback_url_template": false, + "client_secret": "[REDACTED]", + "jwt_configuration": { + "alg": "RS256", + "lifetime_in_seconds": 36000, + "secret_encoded": false + }, + "client_aliases": [], + "token_endpoint_auth_method": "client_secret_post", + "app_type": "non_interactive", + "grant_types": [ + "client_credentials", + "implicit", + "authorization_code", + "refresh_token" ], - "subject_type": "client" + "custom_login_page_on": true }, { - "id": "cgr_T9StWvZSFEbXzMA7", - "client_id": "uuEKiBwEtHSFm9qiQoUrnbFg55ZD63QW", - "audience": "https://auth0-deploy-cli-e2e.us.auth0.com/api/v2/", - "scope": [ - "read:client_grants", - "create:client_grants", - "delete:client_grants", - "update:client_grants", - "read:users", - "update:users", - "delete:users", - "create:users", - "read:users_app_metadata", - "update:users_app_metadata", - "delete:users_app_metadata", - "create:users_app_metadata", - "read:user_custom_blocks", - "create:user_custom_blocks", - "delete:user_custom_blocks", - "create:user_tickets", - "read:clients", - "update:clients", - "delete:clients", - "create:clients", - "read:client_keys", - "update:client_keys", - "delete:client_keys", - "create:client_keys", - "read:connections", - "update:connections", - "delete:connections", - "create:connections", - "read:resource_servers", - "update:resource_servers", - "delete:resource_servers", - "create:resource_servers", - "read:device_credentials", - "update:device_credentials", - "delete:device_credentials", - "create:device_credentials", - "read:rules", - "update:rules", - "delete:rules", - "create:rules", - "read:rules_configs", - "update:rules_configs", - "delete:rules_configs", - "read:hooks", - "update:hooks", - "delete:hooks", - "create:hooks", - "read:actions", - "update:actions", - "delete:actions", - "create:actions", - "read:email_provider", - "update:email_provider", - "delete:email_provider", - "create:email_provider", - "blacklist:tokens", - "read:stats", - "read:insights", - "read:tenant_settings", - "update:tenant_settings", - "read:logs", - "read:logs_users", - "read:shields", - "create:shields", - "update:shields", - "delete:shields", - "read:anomaly_blocks", - "delete:anomaly_blocks", - "update:triggers", - "read:triggers", - "read:grants", - "delete:grants", - "read:guardian_factors", - "update:guardian_factors", - "read:guardian_enrollments", - "delete:guardian_enrollments", - "create:guardian_enrollment_tickets", - "read:user_idp_tokens", - "create:passwords_checking_job", - "delete:passwords_checking_job", - "read:custom_domains", - "delete:custom_domains", - "create:custom_domains", - "update:custom_domains", - "read:email_templates", - "create:email_templates", - "update:email_templates", - "read:mfa_policies", - "update:mfa_policies", - "read:roles", - "create:roles", - "delete:roles", - "update:roles", - "read:prompts", - "update:prompts", - "read:branding", - "update:branding", - "delete:branding", - "read:log_streams", - "create:log_streams", - "delete:log_streams", - "update:log_streams", - "create:signing_keys", - "read:signing_keys", - "update:signing_keys", - "read:limits", - "update:limits", - "create:role_members", - "read:role_members", - "delete:role_members", - "read:entitlements", - "read:attack_protection", - "update:attack_protection", - "read:organizations", - "update:organizations", - "create:organizations", - "delete:organizations", - "create:organization_members", - "read:organization_members", - "delete:organization_members", - "create:organization_connections", - "read:organization_connections", - "update:organization_connections", - "delete:organization_connections", - "create:organization_member_roles", - "read:organization_member_roles", - "delete:organization_member_roles", - "create:organization_invitations", - "read:organization_invitations", - "delete:organization_invitations" + "tenant": "auth0-deploy-cli-e2e", + "global": false, + "is_token_endpoint_ip_header_trusted": false, + "name": "Default App", + "callbacks": [], + "is_first_party": true, + "oidc_conformant": true, + "refresh_token": { + "expiration_type": "non-expiring", + "leeway": 0, + "infinite_token_lifetime": true, + "infinite_idle_token_lifetime": true, + "token_lifetime": 2592000, + "idle_token_lifetime": 1296000, + "rotation_type": "non-rotating" + }, + "sso_disabled": false, + "cross_origin_authentication": false, + "cross_origin_auth": false, + "signing_keys": [ + { + "cert": "[REDACTED]", + "pkcs7": "[REDACTED]", + "subject": "deprecated" + } ], - "subject_type": "client" + "client_id": "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V", + "callback_url_template": false, + "client_secret": "[REDACTED]", + "jwt_configuration": { + "alg": "RS256", + "lifetime_in_seconds": 36000, + "secret_encoded": false + }, + "grant_types": [ + "authorization_code", + "implicit", + "refresh_token", + "client_credentials" + ], + "custom_login_page_on": true }, + { + "tenant": "auth0-deploy-cli-e2e", + "global": true, + "callbacks": [], + "is_first_party": true, + "name": "All Applications", + "refresh_token": { + "expiration_type": "non-expiring", + "leeway": 0, + "infinite_token_lifetime": true, + "infinite_idle_token_lifetime": true, + "token_lifetime": 2592000, + "idle_token_lifetime": 1296000, + "rotation_type": "non-rotating" + }, + "owners": [ + "mr|samlp|okta|will.vedder@auth0.com", + "mr|google-oauth2|102002633619863830825", + "mr|samlp|okta|frederik.prijck@auth0.com", + "mr|google-oauth2|109614534713742077035", + "mr|google-oauth2|116771660953104383819", + "mr|google-oauth2|112839029247827700155", + "mr|samlp|okta|ewan.harris@auth0.com" + ], + "custom_login_page": "TEST123\n", + "cross_origin_authentication": true, + "signing_keys": [ + { + "cert": "[REDACTED]", + "pkcs7": "[REDACTED]", + "subject": "deprecated" + } + ], + "client_id": "Isi93ibGHIGwmdYjsLwTOn7Gu7nwxU3V", + "client_secret": "[REDACTED]", + "custom_login_page_on": true + } + ] + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/client-grants?take=50", + "body": "", + "status": 200, + "response": { + "client_grants": [ { "id": "cgr_pbwejzhwoujrsNE8", "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", @@ -7514,69 +3366,7 @@ "path": "/api/v2/log-streams", "body": "", "status": 200, - "response": [ - { - "id": "lst_0000000000025369", - "name": "Suspended DD Log Stream", - "type": "datadog", - "status": "active", - "sink": { - "datadogApiKey": "some-sensitive-api-key", - "datadogRegion": "us" - }, - "isPriority": false - }, - { - "id": "lst_0000000000025370", - "name": "Amazon EventBridge", - "type": "eventbridge", - "status": "active", - "sink": { - "awsAccountId": "123456789012", - "awsRegion": "us-east-2", - "awsPartnerEventSource": "aws.partner/auth0.com/auth0-deploy-cli-e2e-cfc5325e-4577-409f-8e7b-2e4a664cb6ff/auth0.logs" - }, - "filters": [ - { - "type": "category", - "name": "auth.login.success" - }, - { - "type": "category", - "name": "auth.login.notification" - }, - { - "type": "category", - "name": "auth.login.fail" - }, - { - "type": "category", - "name": "auth.signup.success" - }, - { - "type": "category", - "name": "auth.logout.success" - }, - { - "type": "category", - "name": "auth.logout.fail" - }, - { - "type": "category", - "name": "auth.silent_auth.fail" - }, - { - "type": "category", - "name": "auth.silent_auth.success" - }, - { - "type": "category", - "name": "auth.token_exchange.fail" - } - ], - "isPriority": false - } - ], + "response": [], "rawHeaders": [], "responseIsBinary": false }, diff --git a/test/e2e/recordings/should-dump-and-deploy-without-throwing-an-error.json b/test/e2e/recordings/should-dump-and-deploy-without-throwing-an-error.json index 09a996c76..8c0522401 100644 --- a/test/e2e/recordings/should-dump-and-deploy-without-throwing-an-error.json +++ b/test/e2e/recordings/should-dump-and-deploy-without-throwing-an-error.json @@ -1089,6 +1089,22 @@ "value": "delete:organization_client_grants", "description": "Delete Organization Client Grants" }, + { + "value": "create:token_exchange_profiles", + "description": "Create Token Exchange Profile" + }, + { + "value": "read:token_exchange_profiles", + "description": "Read Token Exchange Profiles" + }, + { + "value": "update:token_exchange_profiles", + "description": "Update Token Exchange Profile" + }, + { + "value": "delete:token_exchange_profiles", + "description": "Delete Token Exchange Profile" + }, { "value": "read:security_metrics", "description": "Read Security Metrics" @@ -1120,7 +1136,7 @@ "body": "", "status": 200, "response": { - "total": 8, + "total": 2, "start": 0, "limit": 100, "clients": [ @@ -1183,27 +1199,17 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "API Explorer Application", - "allowed_clients": [], + "name": "Default App", "callbacks": [], - "client_metadata": {}, "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, "oidc_conformant": true, "refresh_token": { "expiration_type": "non-expiring", "leeway": 0, "infinite_token_lifetime": true, "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, + "token_lifetime": 2592000, + "idle_token_lifetime": 1296000, "rotation_type": "non-rotating" }, "sso_disabled": false, @@ -1216,7 +1222,7 @@ "subject": "deprecated" } ], - "client_id": "vVbUuOLzLQ9k7iwdZoLRtQuhG8XHUkSY", + "client_id": "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -1224,329 +1230,188 @@ "lifetime_in_seconds": 36000, "secret_encoded": false }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", "grant_types": [ + "authorization_code", + "implicit", + "refresh_token", "client_credentials" ], "custom_login_page_on": true - }, + } + ] + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/connections?take=50&strategy=auth0", + "body": "", + "status": 200, + "response": { + "connections": [ { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Quickstarts API (Test Application)", - "client_metadata": { - "foo": "bar" + "id": "con_3R2lX4rln4ArocW5", + "options": { + "mfa": { + "active": true, + "return_enroll_settings": true + }, + "passwordPolicy": "good", + "passkey_options": { + "challenge_ui": "both", + "local_enrollment_enabled": true, + "progressive_enrollment_enabled": true + }, + "strategy_version": 2, + "authentication_methods": { + "passkey": { + "enabled": false + }, + "password": { + "enabled": true, + "api_behavior": "required" + } + }, + "brute_force_protection": true }, - "is_first_party": true, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" + "strategy": "auth0", + "name": "Username-Password-Authentication", + "is_domain_connection": false, + "authentication": { + "active": true }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "O0AMH5MORoUOkQ8g31aPVmBZ11jyApI5", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false + "connected_accounts": { + "active": false }, - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", - "grant_types": [ - "client_credentials" + "realms": [ + "Username-Password-Authentication" ], - "custom_login_page_on": true + "enabled_clients": [ + "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", + "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" + ] + } + ] + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/connections/con_3R2lX4rln4ArocW5/clients?take=50", + "body": "", + "status": 200, + "response": { + "clients": [ + { + "client_id": "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" }, { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Node App", - "allowed_clients": [], - "allowed_logout_urls": [], - "callbacks": [], - "client_metadata": {}, - "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } + "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE" + } + ] + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/connections/con_3R2lX4rln4ArocW5/clients?take=50", + "body": "", + "status": 200, + "response": { + "clients": [ + { + "client_id": "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" + }, + { + "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE" + } + ] + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/connections?take=50", + "body": "", + "status": 200, + "response": { + "connections": [ + { + "id": "con_lfhXlIY73LFJlMks", + "options": { + "email": true, + "scope": [ + "email", + "profile" + ], + "profile": true }, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" + "strategy": "google-oauth2", + "name": "google-oauth2", + "is_domain_connection": false, + "authentication": { + "active": true }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "allowed_origins": [], - "client_id": "88gPebiknBTdBHOAYrSdF2WWRyuroAax", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false + "connected_accounts": { + "active": false }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "regular_web", - "grant_types": [ - "authorization_code", - "implicit", - "refresh_token", - "client_credentials" + "realms": [ + "google-oauth2" ], - "web_origins": [], - "custom_login_page_on": true + "enabled_clients": [ + "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", + "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" + ] }, { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "The Default App", - "allowed_clients": [], - "callbacks": [], - "client_metadata": {}, - "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false + "id": "con_3R2lX4rln4ArocW5", + "options": { + "mfa": { + "active": true, + "return_enroll_settings": true + }, + "passwordPolicy": "good", + "passkey_options": { + "challenge_ui": "both", + "local_enrollment_enabled": true, + "progressive_enrollment_enabled": true + }, + "strategy_version": 2, + "authentication_methods": { + "passkey": { + "enabled": false + }, + "password": { + "enabled": true, + "api_behavior": "required" + } }, - "facebook": { - "enabled": false - } + "brute_force_protection": true }, - "oidc_conformant": false, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 2592000, - "idle_token_lifetime": 1296000, - "rotation_type": "non-rotating" + "strategy": "auth0", + "name": "Username-Password-Authentication", + "is_domain_connection": false, + "authentication": { + "active": true }, - "sso": false, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "7vlUKQihTlaGoILrgQ51JW4xMbU1XhI0", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false + "connected_accounts": { + "active": false }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "grant_types": [ - "authorization_code", - "implicit", - "refresh_token", - "client_credentials" + "realms": [ + "Username-Password-Authentication" ], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Terraform Provider", - "is_first_party": true, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "R9N1M3jJcxlEKpIcm4EX8glA7Krb9h1k", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", - "grant_types": [ - "client_credentials" - ], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Test SPA", - "allowed_clients": [], - "allowed_logout_urls": [ - "http://localhost:3000" - ], - "callbacks": [ - "http://localhost:3000" - ], - "client_metadata": {}, - "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "expiring", - "leeway": 0, - "token_lifetime": 2592000, - "idle_token_lifetime": 1296000, - "infinite_token_lifetime": false, - "infinite_idle_token_lifetime": false, - "rotation_type": "rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "9ztJ1ZaM0iTa9eR2Ga08KOrwBNqNuRmr", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "client_aliases": [], - "token_endpoint_auth_method": "none", - "app_type": "spa", - "grant_types": [ - "authorization_code", - "implicit", - "refresh_token" - ], - "web_origins": [ - "http://localhost:3000" - ], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "auth0-deploy-cli-extension", - "allowed_clients": [], - "callbacks": [], - "client_metadata": {}, - "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "8DngHjTrjB57cRXo74zYn4qohnAxjFsG", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", - "grant_types": [ - "client_credentials" - ], - "custom_login_page_on": true + "enabled_clients": [ + "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", + "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" + ] } ] }, @@ -1556,64 +1421,16 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections?include_totals=true&strategy=auth0", + "path": "/api/v2/connections/con_lfhXlIY73LFJlMks/clients?take=50", "body": "", "status": 200, "response": { - "total": 0, - "start": 0, - "limit": 50, - "connections": [] - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/connections?include_totals=true&take=50&strategy=auth0", - "body": "", - "status": 200, - "response": { - "connections": [] - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/connections?include_totals=true", - "body": "", - "status": 200, - "response": { - "total": 1, - "start": 0, - "limit": 50, - "connections": [ + "clients": [ { - "id": "con_K6JOwBbKFCexaEHM", - "options": { - "email": true, - "scope": [ - "email", - "profile" - ], - "profile": true - }, - "strategy": "google-oauth2", - "name": "google-oauth2", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "google-oauth2" - ], - "enabled_clients": [] + "client_id": "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" + }, + { + "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE" } ] }, @@ -1623,52 +1440,22 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections?include_totals=true&take=50", + "path": "/api/v2/connections/con_lfhXlIY73LFJlMks/clients?take=50", "body": "", "status": 200, "response": { - "connections": [ + "clients": [ { - "id": "con_K6JOwBbKFCexaEHM", - "options": { - "email": true, - "scope": [ - "email", - "profile" - ], - "profile": true - }, - "strategy": "google-oauth2", - "name": "google-oauth2", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "google-oauth2" - ], - "enabled_clients": [] + "client_id": "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" + }, + { + "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE" } ] }, "rawHeaders": [], "responseIsBinary": false }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/connections/con_K6JOwBbKFCexaEHM/clients?take=50", - "body": "", - "status": 200, - "response": { - "clients": [] - }, - "rawHeaders": [], - "responseIsBinary": false - }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", @@ -1777,7 +1564,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/email-templates/user_invitation", + "path": "/api/v2/email-templates/blocked_account", "body": "", "status": 404, "response": { @@ -1792,7 +1579,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/email-templates/verify_email_by_code", + "path": "/api/v2/email-templates/reset_email", "body": "", "status": 404, "response": { @@ -1807,7 +1594,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/email-templates/reset_email_by_code", + "path": "/api/v2/email-templates/user_invitation", "body": "", "status": 404, "response": { @@ -1822,7 +1609,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/email-templates/reset_email", + "path": "/api/v2/email-templates/stolen_credentials", "body": "", "status": 404, "response": { @@ -1837,7 +1624,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/email-templates/blocked_account", + "path": "/api/v2/email-templates/verify_email_by_code", "body": "", "status": 404, "response": { @@ -1852,7 +1639,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/email-templates/stolen_credentials", + "path": "/api/v2/email-templates/reset_email_by_code", "body": "", "status": 404, "response": { @@ -1897,7 +1684,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/email-templates/password_reset", + "path": "/api/v2/email-templates/change_password", "body": "", "status": 404, "response": { @@ -1909,25 +1696,6 @@ "rawHeaders": [], "responseIsBinary": false }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/email-templates/welcome_email", - "body": "", - "status": 200, - "response": { - "template": "welcome_email", - "body": "\n \n

Welcome!

\n \n\n", - "from": "", - "resultUrl": "https://example.com/welcome", - "subject": "Welcome", - "syntax": "liquid", - "urlLifetimeInSeconds": 3600, - "enabled": false - }, - "rawHeaders": [], - "responseIsBinary": false - }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", @@ -1946,7 +1714,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/email-templates/change_password", + "path": "/api/v2/email-templates/password_reset", "body": "", "status": 404, "response": { @@ -1961,16 +1729,32 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/client-grants?per_page=100&page=0&include_totals=true", + "path": "/api/v2/email-templates/welcome_email", "body": "", "status": 200, "response": { - "total": 1, - "start": 0, - "limit": 100, - "client_grants": [ - { - "id": "cgr_pbwejzhwoujrsNE8", + "template": "welcome_email", + "body": "\n \n

Welcome!

\n \n\n", + "from": "", + "resultUrl": "https://example.com/welcome", + "subject": "Welcome", + "syntax": "liquid", + "urlLifetimeInSeconds": 3600, + "enabled": false + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/client-grants?take=50", + "body": "", + "status": 200, + "response": { + "client_grants": [ + { + "id": "cgr_pbwejzhwoujrsNE8", "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", "audience": "https://auth0-deploy-cli-e2e.us.auth0.com/api/v2/", "scope": [ @@ -2223,7 +2007,7 @@ }, { "name": "push-notification", - "enabled": true, + "enabled": false, "trial_expired": false }, { @@ -2263,7 +2047,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/guardian/factors/sms/providers/twilio", + "path": "/api/v2/guardian/factors/push-notification/providers/sns", "body": "", "status": 200, "response": {}, @@ -2273,7 +2057,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/guardian/factors/push-notification/providers/sns", + "path": "/api/v2/guardian/factors/sms/providers/twilio", "body": "", "status": 200, "response": {}, @@ -2299,9 +2083,7 @@ "path": "/api/v2/guardian/policies", "body": "", "status": 200, - "response": [ - "all-applications" - ], + "response": [], "rawHeaders": [], "responseIsBinary": false }, @@ -2336,58 +2118,7 @@ "body": "", "status": 200, "response": { - "roles": [ - { - "id": "rol_jVbPH8r1ZIGS2gXN", - "name": "Admin", - "description": "Can read and write things" - }, - { - "id": "rol_xWADOPL9iJP4nUdr", - "name": "Reader", - "description": "Can only read things" - }, - { - "id": "rol_Iu8aIRwIrZ7Zk2Bz", - "name": "read_only", - "description": "Read Only" - }, - { - "id": "rol_hjHjIWbcLZccpcmF", - "name": "read_osnly", - "description": "Readz Only" - } - ], - "start": 0, - "limit": 100, - "total": 4 - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/roles/rol_jVbPH8r1ZIGS2gXN/permissions?per_page=100&page=0&include_totals=true", - "body": "", - "status": 200, - "response": { - "permissions": [], - "start": 0, - "limit": 100, - "total": 0 - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/roles/rol_xWADOPL9iJP4nUdr/permissions?per_page=100&page=0&include_totals=true", - "body": "", - "status": 200, - "response": { - "permissions": [], + "roles": [], "start": 0, "limit": 100, "total": 0 @@ -2398,14 +2129,15 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/roles/rol_Iu8aIRwIrZ7Zk2Bz/permissions?per_page=100&page=0&include_totals=true", + "path": "/api/v2/branding", "body": "", "status": 200, "response": { - "permissions": [], - "start": 0, - "limit": 100, - "total": 0 + "colors": { + "primary": "#F8F8F2", + "page_background": "#222221" + }, + "logo_url": "https://upload.wikimedia.org/wikipedia/commons/0/0d/Grandmas_marathon_finishers.png" }, "rawHeaders": [], "responseIsBinary": false @@ -2413,30 +2145,37 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/roles/rol_hjHjIWbcLZccpcmF/permissions?per_page=100&page=0&include_totals=true", + "path": "/api/v2/custom-domains", "body": "", "status": 200, - "response": { - "permissions": [], - "start": 0, - "limit": 100, - "total": 0 - }, + "response": [], "rawHeaders": [], "responseIsBinary": false }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/branding", + "path": "/api/v2/branding/phone/providers", "body": "", "status": 200, "response": { - "colors": { - "primary": "#F8F8F2", - "page_background": "#222221" - }, - "logo_url": "https://upload.wikimedia.org/wikipedia/commons/0/0d/Grandmas_marathon_finishers.png" + "providers": [ + { + "id": "pro_mY3L5BP6iVUUzpv22opofm", + "tenant": "auth0-deploy-cli-e2e", + "name": "custom", + "channel": "phone", + "disabled": false, + "configuration": { + "delivery_methods": [ + "text" + ] + }, + "credentials": null, + "created_at": "2025-12-09T12:24:00.604Z", + "updated_at": "2025-12-16T10:10:43.073Z" + } + ] }, "rawHeaders": [], "responseIsBinary": false @@ -2444,21 +2183,77 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/custom-domains", - "body": "", - "status": 200, - "response": [], - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/branding/phone/providers", + "path": "/api/v2/branding/phone/templates", "body": "", "status": 200, "response": { - "providers": [] + "templates": [ + { + "id": "tem_xqbUSF83fpnRv8r8rqXFDZ", + "tenant": "auth0-deploy-cli-e2e", + "channel": "phone", + "type": "change_password", + "disabled": false, + "created_at": "2025-12-09T12:26:20.243Z", + "updated_at": "2025-12-16T08:58:36.831Z", + "content": { + "syntax": "liquid", + "body": { + "text": "{{ code | escape }} is your password change code for {{ friendly_name | escape }}", + "voice": "Hello. Your password change code for {{ friendly_name | escape }} is {{ pause }} {{ code | escape }}. I repeat, your password change code is {{ pause }} {{ code | escape }}" + } + } + }, + { + "id": "tem_dL83uTmWn8moGzm8UgAk4Q", + "tenant": "auth0-deploy-cli-e2e", + "channel": "phone", + "type": "blocked_account", + "disabled": false, + "created_at": "2025-12-09T12:22:47.683Z", + "updated_at": "2025-12-16T08:58:36.736Z", + "content": { + "syntax": "liquid", + "body": { + "text": "We detected suspicious activity on your account from the ip {{user.source_ip}}{% if user.city %} from {{user.city}}, {{user.country}}{% elsif user.country %} from {{user.country}}{% endif %}. Logins from this IP have been blocked on your account. If this is your IP, please reset your password to unblock your account. Otherwise, disregard this message.", + "voice": "We detected suspicious activity on your account from the ip {{user.source_ip}}{% if user.city %} from {{user.city}}, {{user.country}}{% elsif user.country %} from {{user.country}}{% endif %}. Logins from this IP have been blocked on your account. If this is your IP, please reset your password to unblock your account. Otherwise, disregard this message." + }, + "from": "0032232323" + } + }, + { + "id": "tem_o4LBTt4NQyX8K4vC9dPafR", + "tenant": "auth0-deploy-cli-e2e", + "channel": "phone", + "type": "otp_verify", + "disabled": false, + "created_at": "2025-12-09T12:26:30.547Z", + "updated_at": "2025-12-16T08:58:37.073Z", + "content": { + "syntax": "liquid", + "body": { + "text": "{{ code | escape }} is your verification code for {{ friendly_name | escape }}", + "voice": "Hello. Your verification code for {{ friendly_name | escape }} is {{ pause }} {{ code | escape }}. I repeat, your verification code is {{ pause }} {{ code | escape }}" + } + } + }, + { + "id": "tem_qarYST5TTE5pbMNB5NHZAj", + "tenant": "auth0-deploy-cli-e2e", + "channel": "phone", + "type": "otp_enroll", + "disabled": false, + "created_at": "2025-12-09T12:26:25.327Z", + "updated_at": "2025-12-16T08:58:36.804Z", + "content": { + "syntax": "liquid", + "body": { + "text": "{{ code | escape }} is your verification code for {{ friendly_name | escape }}. Please enter this code to verify your enrollment.", + "voice": "Hello. Your verification code for {{ friendly_name | escape }} is {{ pause }} {{ code | escape }}. I repeat, your verification code is {{ pause }} {{ code | escape }}" + } + } + } + ] }, "rawHeaders": [], "responseIsBinary": false @@ -2551,7 +2346,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/prompts/login/custom-text/en", + "path": "/api/v2/prompts/login-id/custom-text/en", "body": "", "status": 200, "response": {}, @@ -2561,7 +2356,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/prompts/login-id/custom-text/en", + "path": "/api/v2/prompts/login/custom-text/en", "body": "", "status": 200, "response": {}, @@ -2591,7 +2386,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/prompts/signup/custom-text/en", + "path": "/api/v2/prompts/login-email-verification/custom-text/en", "body": "", "status": 200, "response": {}, @@ -2601,7 +2396,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/prompts/login-email-verification/custom-text/en", + "path": "/api/v2/prompts/signup/custom-text/en", "body": "", "status": 200, "response": {}, @@ -2611,7 +2406,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/prompts/signup-password/custom-text/en", + "path": "/api/v2/prompts/signup-id/custom-text/en", "body": "", "status": 200, "response": {}, @@ -2621,7 +2416,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/prompts/phone-identifier-enrollment/custom-text/en", + "path": "/api/v2/prompts/signup-password/custom-text/en", "body": "", "status": 200, "response": {}, @@ -2631,7 +2426,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/prompts/signup-id/custom-text/en", + "path": "/api/v2/prompts/phone-identifier-enrollment/custom-text/en", "body": "", "status": 200, "response": {}, @@ -2641,7 +2436,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/prompts/email-identifier-challenge/custom-text/en", + "path": "/api/v2/prompts/phone-identifier-challenge/custom-text/en", "body": "", "status": 200, "response": {}, @@ -2651,7 +2446,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/prompts/phone-identifier-challenge/custom-text/en", + "path": "/api/v2/prompts/email-identifier-challenge/custom-text/en", "body": "", "status": 200, "response": {}, @@ -2711,7 +2506,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/prompts/mfa-push/custom-text/en", + "path": "/api/v2/prompts/mfa-otp/custom-text/en", "body": "", "status": 200, "response": {}, @@ -2721,7 +2516,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/prompts/mfa-voice/custom-text/en", + "path": "/api/v2/prompts/mfa-push/custom-text/en", "body": "", "status": 200, "response": {}, @@ -2731,7 +2526,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/prompts/mfa-phone/custom-text/en", + "path": "/api/v2/prompts/mfa-voice/custom-text/en", "body": "", "status": 200, "response": {}, @@ -2741,7 +2536,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/prompts/mfa-otp/custom-text/en", + "path": "/api/v2/prompts/mfa-phone/custom-text/en", "body": "", "status": 200, "response": {}, @@ -2801,7 +2596,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/prompts/status/custom-text/en", + "path": "/api/v2/prompts/device-flow/custom-text/en", "body": "", "status": 200, "response": {}, @@ -2811,7 +2606,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/prompts/device-flow/custom-text/en", + "path": "/api/v2/prompts/status/custom-text/en", "body": "", "status": 200, "response": {}, @@ -2831,7 +2626,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/prompts/organizations/custom-text/en", + "path": "/api/v2/prompts/email-otp-challenge/custom-text/en", "body": "", "status": 200, "response": {}, @@ -2841,7 +2636,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/prompts/email-otp-challenge/custom-text/en", + "path": "/api/v2/prompts/organizations/custom-text/en", "body": "", "status": 200, "response": {}, @@ -2891,7 +2686,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/prompts/login-id/partials", + "path": "/api/v2/prompts/brute-force-protection/custom-text/en", "body": "", "status": 200, "response": {}, @@ -2901,7 +2696,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/prompts/login/partials", + "path": "/api/v2/prompts/login-password/partials", "body": "", "status": 200, "response": {}, @@ -2911,7 +2706,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/prompts/login-password/partials", + "path": "/api/v2/prompts/login/partials", "body": "", "status": 200, "response": {}, @@ -2921,7 +2716,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/prompts/signup-id/partials", + "path": "/api/v2/prompts/login-id/partials", "body": "", "status": 200, "response": {}, @@ -2948,6 +2743,16 @@ "rawHeaders": [], "responseIsBinary": false }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/prompts/signup-id/partials", + "body": "", + "status": 200, + "response": {}, + "rawHeaders": [], + "responseIsBinary": false + }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", @@ -2961,10 +2766,15 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/prompts/rendering", + "path": "/api/v2/prompts/rendering?page=0&per_page=100&include_totals=true", "body": "", "status": 200, - "response": [], + "response": { + "configs": [], + "start": 0, + "limit": 100, + "total": 0 + }, "rawHeaders": [], "responseIsBinary": false }, @@ -2977,47 +2787,47 @@ "response": { "actions": [ { - "id": "bae9165a-5430-464c-b900-7de6abc92c29", - "name": "My Custom Action", + "id": "ead7d2a3-5a93-43e2-9ec3-455f3c39daf9", + "name": "Custom Phone Provider", "supported_triggers": [ { - "id": "post-login", - "version": "v2" + "id": "custom-phone-provider", + "version": "v1" } ], - "created_at": "2025-12-04T10:16:43.559450240Z", - "updated_at": "2025-12-04T10:16:43.581547208Z", - "code": "/**\n * Handler that will be called during the execution of a PostLogin flow.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\nexports.onExecutePostLogin = async (event, api) => {\n console.log('Some custom action!');\n};\n\n/**\n * Handler that will be invoked when this action is resuming after an external redirect. If your\n * onExecutePostLogin function does not perform a redirect, this function can be safely ignored.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\n// exports.onContinuePostLogin = async (event, api) => {\n// };\n", + "created_at": "2025-12-16T10:10:30.752146844Z", + "updated_at": "2025-12-16T10:10:40.768168491Z", + "code": "/**\n* Handler to be executed while sending a phone notification\n* @param {Event} event - Details about the user and the context in which they are logging in.\n* @param {CustomPhoneProviderAPI} api - Methods and utilities to help change the behavior of sending a phone notification.\n*/\nexports.onExecuteCustomPhoneProvider = async (event, api) => {\n // Code goes here\n return;\n};", "dependencies": [], - "runtime": "node18", + "runtime": "node22", "status": "built", "secrets": [], "current_version": { - "id": "ccddd308-9d7e-4da4-9dd7-89a2c4323f38", - "code": "/**\n * Handler that will be called during the execution of a PostLogin flow.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\nexports.onExecutePostLogin = async (event, api) => {\n console.log('Some custom action!');\n};\n\n/**\n * Handler that will be invoked when this action is resuming after an external redirect. If your\n * onExecutePostLogin function does not perform a redirect, this function can be safely ignored.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\n// exports.onContinuePostLogin = async (event, api) => {\n// };\n", - "runtime": "node18", + "id": "07db7147-9c58-45ac-ad9b-07d88303a9fc", + "code": "/**\n* Handler to be executed while sending a phone notification\n* @param {Event} event - Details about the user and the context in which they are logging in.\n* @param {CustomPhoneProviderAPI} api - Methods and utilities to help change the behavior of sending a phone notification.\n*/\nexports.onExecuteCustomPhoneProvider = async (event, api) => {\n // Code goes here\n return;\n};", + "runtime": "node22", "status": "BUILT", "number": 1, - "build_time": "2025-12-04T10:16:44.464501727Z", - "created_at": "2025-12-04T10:16:44.387189873Z", - "updated_at": "2025-12-04T10:16:44.465373484Z" + "build_time": "2025-12-16T10:10:41.915596370Z", + "created_at": "2025-12-16T10:10:41.831216643Z", + "updated_at": "2025-12-16T10:10:41.917804190Z" }, "deployed_version": { - "code": "/**\n * Handler that will be called during the execution of a PostLogin flow.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\nexports.onExecutePostLogin = async (event, api) => {\n console.log('Some custom action!');\n};\n\n/**\n * Handler that will be invoked when this action is resuming after an external redirect. If your\n * onExecutePostLogin function does not perform a redirect, this function can be safely ignored.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\n// exports.onContinuePostLogin = async (event, api) => {\n// };\n", + "code": "/**\n* Handler to be executed while sending a phone notification\n* @param {Event} event - Details about the user and the context in which they are logging in.\n* @param {CustomPhoneProviderAPI} api - Methods and utilities to help change the behavior of sending a phone notification.\n*/\nexports.onExecuteCustomPhoneProvider = async (event, api) => {\n // Code goes here\n return;\n};", "dependencies": [], - "id": "ccddd308-9d7e-4da4-9dd7-89a2c4323f38", + "id": "07db7147-9c58-45ac-ad9b-07d88303a9fc", "deployed": true, "number": 1, - "built_at": "2025-12-04T10:16:44.464501727Z", + "built_at": "2025-12-16T10:10:41.915596370Z", "secrets": [], "status": "built", - "created_at": "2025-12-04T10:16:44.387189873Z", - "updated_at": "2025-12-04T10:16:44.465373484Z", - "runtime": "node18", + "created_at": "2025-12-16T10:10:41.831216643Z", + "updated_at": "2025-12-16T10:10:41.917804190Z", + "runtime": "node22", "supported_triggers": [ { - "id": "post-login", - "version": "v2" + "id": "custom-phone-provider", + "version": "v1" } ] }, @@ -3038,6 +2848,18 @@ "status": 200, "response": { "triggers": [ + { + "id": "post-login", + "version": "v2", + "status": "DEPRECATED", + "runtimes": [ + "node12", + "node18" + ], + "default_runtime": "node16", + "binding_policy": "trigger-bound", + "compatible_triggers": [] + }, { "id": "post-login", "version": "v3", @@ -3056,18 +2878,19 @@ ] }, { - "id": "post-login", + "id": "credentials-exchange", "version": "v2", - "status": "DEPRECATED", + "status": "CURRENT", "runtimes": [ - "node18" + "node18-actions", + "node22" ], - "default_runtime": "node16", + "default_runtime": "node22", "binding_policy": "trigger-bound", "compatible_triggers": [] }, { - "id": "credentials-exchange", + "id": "pre-user-registration", "version": "v2", "status": "CURRENT", "runtimes": [ @@ -3080,7 +2903,7 @@ "compatible_triggers": [] }, { - "id": "pre-user-registration", + "id": "post-user-registration", "version": "v1", "status": "DEPRECATED", "runtimes": [ @@ -3091,7 +2914,7 @@ "compatible_triggers": [] }, { - "id": "pre-user-registration", + "id": "post-user-registration", "version": "v2", "status": "CURRENT", "runtimes": [ @@ -3103,11 +2926,10 @@ "compatible_triggers": [] }, { - "id": "post-user-registration", + "id": "post-change-password", "version": "v2", "status": "CURRENT", "runtimes": [ - "node12", "node18-actions", "node22" ], @@ -3116,15 +2938,13 @@ "compatible_triggers": [] }, { - "id": "post-change-password", - "version": "v2", - "status": "CURRENT", + "id": "send-phone-message", + "version": "v1", + "status": "DEPRECATED", "runtimes": [ - "node12", - "node18-actions", - "node22" + "node12" ], - "default_runtime": "node22", + "default_runtime": "node12", "binding_policy": "trigger-bound", "compatible_triggers": [] }, @@ -3133,7 +2953,6 @@ "version": "v2", "status": "CURRENT", "runtimes": [ - "node12", "node18-actions", "node22" ], @@ -3211,6 +3030,17 @@ "default_runtime": "node22", "binding_policy": "entity-bound", "compatible_triggers": [] + }, + { + "id": "password-hash-migration", + "version": "v1", + "status": "CURRENT", + "runtimes": [ + "node22" + ], + "default_runtime": "node22", + "binding_policy": "entity-bound", + "compatible_triggers": [] } ] }, @@ -3220,12 +3050,12 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/actions/triggers/post-login/bindings", + "path": "/api/v2/actions/triggers/post-login/bindings?page=0&per_page=50", "body": "", "status": 200, "response": { "bindings": [], - "per_page": 20 + "per_page": 50 }, "rawHeaders": [], "responseIsBinary": false @@ -3233,12 +3063,12 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/actions/triggers/credentials-exchange/bindings", + "path": "/api/v2/actions/triggers/credentials-exchange/bindings?page=0&per_page=50", "body": "", "status": 200, "response": { "bindings": [], - "per_page": 20 + "per_page": 50 }, "rawHeaders": [], "responseIsBinary": false @@ -3246,12 +3076,12 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/actions/triggers/pre-user-registration/bindings", + "path": "/api/v2/actions/triggers/pre-user-registration/bindings?page=0&per_page=50", "body": "", "status": 200, "response": { "bindings": [], - "per_page": 20 + "per_page": 50 }, "rawHeaders": [], "responseIsBinary": false @@ -3259,12 +3089,12 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/actions/triggers/post-user-registration/bindings", + "path": "/api/v2/actions/triggers/post-user-registration/bindings?page=0&per_page=50", "body": "", "status": 200, "response": { "bindings": [], - "per_page": 20 + "per_page": 50 }, "rawHeaders": [], "responseIsBinary": false @@ -3272,12 +3102,12 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/actions/triggers/post-change-password/bindings", + "path": "/api/v2/actions/triggers/post-change-password/bindings?page=0&per_page=50", "body": "", "status": 200, "response": { "bindings": [], - "per_page": 20 + "per_page": 50 }, "rawHeaders": [], "responseIsBinary": false @@ -3285,12 +3115,12 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/actions/triggers/send-phone-message/bindings", + "path": "/api/v2/actions/triggers/send-phone-message/bindings?page=0&per_page=50", "body": "", "status": 200, "response": { "bindings": [], - "per_page": 20 + "per_page": 50 }, "rawHeaders": [], "responseIsBinary": false @@ -3298,12 +3128,12 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/actions/triggers/password-reset-post-challenge/bindings", + "path": "/api/v2/actions/triggers/password-reset-post-challenge/bindings?page=0&per_page=50", "body": "", "status": 200, "response": { "bindings": [], - "per_page": 20 + "per_page": 50 }, "rawHeaders": [], "responseIsBinary": false @@ -3311,12 +3141,12 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/actions/triggers/login-post-identifier/bindings", + "path": "/api/v2/actions/triggers/login-post-identifier/bindings?page=0&per_page=50", "body": "", "status": 200, "response": { "bindings": [], - "per_page": 20 + "per_page": 50 }, "rawHeaders": [], "responseIsBinary": false @@ -3324,12 +3154,63 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/actions/triggers/custom-phone-provider/bindings", + "path": "/api/v2/actions/triggers/custom-phone-provider/bindings?page=0&per_page=50", "body": "", "status": 200, "response": { - "bindings": [], - "per_page": 20 + "bindings": [ + { + "id": "6992e6d2-9dc9-4709-9c32-1054748c9d49", + "trigger_id": "custom-phone-provider", + "action": { + "id": "ead7d2a3-5a93-43e2-9ec3-455f3c39daf9", + "name": "Custom Phone Provider", + "supported_triggers": [ + { + "id": "custom-phone-provider", + "version": "v1" + } + ], + "created_at": "2025-12-16T10:10:30.752146844Z", + "updated_at": "2025-12-16T10:10:40.760476319Z", + "current_version": { + "id": "07db7147-9c58-45ac-ad9b-07d88303a9fc", + "code": "/**\n* Handler to be executed while sending a phone notification\n* @param {Event} event - Details about the user and the context in which they are logging in.\n* @param {CustomPhoneProviderAPI} api - Methods and utilities to help change the behavior of sending a phone notification.\n*/\nexports.onExecuteCustomPhoneProvider = async (event, api) => {\n // Code goes here\n return;\n};", + "runtime": "node22", + "status": "BUILT", + "number": 1, + "build_time": "2025-12-16T10:10:41.915596370Z", + "created_at": "2025-12-16T10:10:41.831216643Z", + "updated_at": "2025-12-16T10:10:41.917804190Z" + }, + "deployed_version": { + "code": "/**\n* Handler to be executed while sending a phone notification\n* @param {Event} event - Details about the user and the context in which they are logging in.\n* @param {CustomPhoneProviderAPI} api - Methods and utilities to help change the behavior of sending a phone notification.\n*/\nexports.onExecuteCustomPhoneProvider = async (event, api) => {\n // Code goes here\n return;\n};", + "dependencies": [], + "id": "07db7147-9c58-45ac-ad9b-07d88303a9fc", + "deployed": true, + "number": 1, + "built_at": "2025-12-16T10:10:41.915596370Z", + "secrets": [], + "status": "built", + "created_at": "2025-12-16T10:10:41.831216643Z", + "updated_at": "2025-12-16T10:10:41.917804190Z", + "runtime": "node22", + "supported_triggers": [ + { + "id": "custom-phone-provider", + "version": "v1" + } + ] + }, + "all_changes_deployed": false + }, + "created_at": "2025-12-16T10:10:43.021381087Z", + "updated_at": "2025-12-16T10:10:43.021381087Z", + "display_name": "Custom Phone Provider" + } + ], + "total": 1, + "per_page": 50 }, "rawHeaders": [], "responseIsBinary": false @@ -3337,12 +3218,12 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/actions/triggers/custom-email-provider/bindings", + "path": "/api/v2/actions/triggers/custom-email-provider/bindings?page=0&per_page=50", "body": "", "status": 200, "response": { "bindings": [], - "per_page": 20 + "per_page": 50 }, "rawHeaders": [], "responseIsBinary": false @@ -3350,12 +3231,12 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/actions/triggers/custom-token-exchange/bindings", + "path": "/api/v2/actions/triggers/custom-token-exchange/bindings?page=0&per_page=50", "body": "", "status": 200, "response": { "bindings": [], - "per_page": 20 + "per_page": 50 }, "rawHeaders": [], "responseIsBinary": false @@ -3363,12 +3244,12 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/actions/triggers/event-stream/bindings", + "path": "/api/v2/actions/triggers/event-stream/bindings?page=0&per_page=50", "body": "", "status": 200, "response": { "bindings": [], - "per_page": 20 + "per_page": 50 }, "rawHeaders": [], "responseIsBinary": false @@ -3376,31 +3257,24 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/organizations?include_totals=true", + "path": "/api/v2/actions/triggers/password-hash-migration/bindings?page=0&per_page=50", "body": "", "status": 200, "response": { - "organizations": [ - { - "id": "org_GDDGaXDUPC3vLmot", - "name": "org1", - "display_name": "Organization", - "branding": { - "colors": { - "page_background": "#fff5f5", - "primary": "#57ddff" - } - } - }, - { - "id": "org_dg75TodzDZQ3yqAV", - "name": "org2", - "display_name": "Organization2" - } - ], - "start": 0, - "limit": 50, - "total": 2 + "bindings": [], + "per_page": 50 + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/organizations?take=50", + "body": "", + "status": 200, + "response": { + "organizations": [] }, "rawHeaders": [], "responseIsBinary": false @@ -3412,7 +3286,7 @@ "body": "", "status": 200, "response": { - "total": 9, + "total": 3, "start": 0, "limit": 100, "clients": [ @@ -3475,125 +3349,17 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "API Explorer Application", - "allowed_clients": [], - "callbacks": [], - "client_metadata": {}, - "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "vVbUuOLzLQ9k7iwdZoLRtQuhG8XHUkSY", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", - "grant_types": [ - "client_credentials" - ], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Quickstarts API (Test Application)", - "client_metadata": { - "foo": "bar" - }, - "is_first_party": true, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "O0AMH5MORoUOkQ8g31aPVmBZ11jyApI5", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", - "grant_types": [ - "client_credentials" - ], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Node App", - "allowed_clients": [], - "allowed_logout_urls": [], + "name": "Default App", "callbacks": [], - "client_metadata": {}, "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, "oidc_conformant": true, "refresh_token": { "expiration_type": "non-expiring", "leeway": 0, "infinite_token_lifetime": true, "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, + "token_lifetime": 2592000, + "idle_token_lifetime": 1296000, "rotation_type": "non-rotating" }, "sso_disabled": false, @@ -3606,8 +3372,7 @@ "subject": "deprecated" } ], - "allowed_origins": [], - "client_id": "88gPebiknBTdBHOAYrSdF2WWRyuroAax", + "client_id": "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -3615,36 +3380,20 @@ "lifetime_in_seconds": 36000, "secret_encoded": false }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "regular_web", "grant_types": [ "authorization_code", "implicit", "refresh_token", "client_credentials" ], - "web_origins": [], "custom_login_page_on": true }, { "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "The Default App", - "allowed_clients": [], + "global": true, "callbacks": [], - "client_metadata": {}, "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "oidc_conformant": false, + "name": "All Applications", "refresh_token": { "expiration_type": "non-expiring", "leeway": 0, @@ -3654,54 +3403,17 @@ "idle_token_lifetime": 1296000, "rotation_type": "non-rotating" }, - "sso": false, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "7vlUKQihTlaGoILrgQ51JW4xMbU1XhI0", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "grant_types": [ - "authorization_code", - "implicit", - "refresh_token", - "client_credentials" + "owners": [ + "mr|samlp|okta|will.vedder@auth0.com", + "mr|google-oauth2|102002633619863830825", + "mr|samlp|okta|frederik.prijck@auth0.com", + "mr|google-oauth2|109614534713742077035", + "mr|google-oauth2|116771660953104383819", + "mr|google-oauth2|112839029247827700155", + "mr|samlp|okta|ewan.harris@auth0.com" ], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Terraform Provider", - "is_first_party": true, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, + "custom_login_page": "TEST123\n", + "cross_origin_authentication": true, "signing_keys": [ { "cert": "[REDACTED]", @@ -3709,278 +3421,34 @@ "subject": "deprecated" } ], - "client_id": "R9N1M3jJcxlEKpIcm4EX8glA7Krb9h1k", - "callback_url_template": false, + "client_id": "Isi93ibGHIGwmdYjsLwTOn7Gu7nwxU3V", "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", - "grant_types": [ - "client_credentials" - ], "custom_login_page_on": true + } + ] + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/attack-protection/breached-password-detection", + "body": "", + "status": 200, + "response": { + "enabled": false, + "shields": [], + "admin_notification_frequency": [], + "method": "standard", + "stage": { + "pre-user-registration": { + "shields": [] }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Test SPA", - "allowed_clients": [], - "allowed_logout_urls": [ - "http://localhost:3000" - ], - "callbacks": [ - "http://localhost:3000" - ], - "client_metadata": {}, - "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "expiring", - "leeway": 0, - "token_lifetime": 2592000, - "idle_token_lifetime": 1296000, - "infinite_token_lifetime": false, - "infinite_idle_token_lifetime": false, - "rotation_type": "rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "9ztJ1ZaM0iTa9eR2Ga08KOrwBNqNuRmr", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "client_aliases": [], - "token_endpoint_auth_method": "none", - "app_type": "spa", - "grant_types": [ - "authorization_code", - "implicit", - "refresh_token" - ], - "web_origins": [ - "http://localhost:3000" - ], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "auth0-deploy-cli-extension", - "allowed_clients": [], - "callbacks": [], - "client_metadata": {}, - "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "8DngHjTrjB57cRXo74zYn4qohnAxjFsG", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", - "grant_types": [ - "client_credentials" - ], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": true, - "callbacks": [], - "is_first_party": true, - "name": "All Applications", - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 2592000, - "idle_token_lifetime": 1296000, - "rotation_type": "non-rotating" - }, - "owners": [ - "mr|samlp|okta|will.vedder@auth0.com", - "mr|google-oauth2|102002633619863830825", - "mr|samlp|okta|frederik.prijck@auth0.com", - "mr|google-oauth2|109614534713742077035", - "mr|google-oauth2|116771660953104383819", - "mr|google-oauth2|112839029247827700155", - "mr|samlp|okta|ewan.harris@auth0.com" - ], - "custom_login_page": "TEST123\n", - "cross_origin_authentication": true, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "Isi93ibGHIGwmdYjsLwTOn7Gu7nwxU3V", - "client_secret": "[REDACTED]", - "custom_login_page_on": true - } - ] - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/organizations?include_totals=true&take=50", - "body": "", - "status": 200, - "response": { - "organizations": [ - { - "id": "org_dg75TodzDZQ3yqAV", - "name": "org2", - "display_name": "Organization2" - }, - { - "id": "org_GDDGaXDUPC3vLmot", - "name": "org1", - "display_name": "Organization", - "branding": { - "colors": { - "page_background": "#fff5f5", - "primary": "#57ddff" - } - } + "pre-change-password": { + "shields": [] } - ] - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/organizations/org_dg75TodzDZQ3yqAV/enabled_connections", - "body": "", - "status": 200, - "response": [], - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/organizations/org_dg75TodzDZQ3yqAV/client-grants?page=0&per_page=100&include_totals=true", - "body": "", - "status": 200, - "response": { - "client_grants": [], - "start": 0, - "limit": 100, - "total": 0 - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/organizations/org_dg75TodzDZQ3yqAV/discovery-domains?take=50", - "body": "", - "status": 200, - "response": { - "domains": [] - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/organizations/org_GDDGaXDUPC3vLmot/enabled_connections", - "body": "", - "status": 200, - "response": [], - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/organizations/org_GDDGaXDUPC3vLmot/client-grants?page=0&per_page=100&include_totals=true", - "body": "", - "status": 200, - "response": { - "client_grants": [], - "start": 0, - "limit": 100, - "total": 0 - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/organizations/org_GDDGaXDUPC3vLmot/discovery-domains?take=50", - "body": "", - "status": 200, - "response": { - "domains": [] + } }, "rawHeaders": [], "responseIsBinary": false @@ -3988,22 +3456,18 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/attack-protection/breached-password-detection", + "path": "/api/v2/attack-protection/brute-force-protection", "body": "", "status": 200, "response": { - "enabled": false, - "shields": [], - "admin_notification_frequency": [], - "method": "standard", - "stage": { - "pre-user-registration": { - "shields": [] - }, - "pre-change-password": { - "shields": [] - } - } + "enabled": true, + "shields": [ + "block", + "user_notification" + ], + "mode": "count_per_identifier_and_ip", + "allowlist": [], + "max_attempts": 10 }, "rawHeaders": [], "responseIsBinary": false @@ -4017,19 +3481,22 @@ "response": { "enabled": true, "shields": [ - "admin_notification" - ], - "allowlist": [ - "127.0.0.1" + "admin_notification", + "block" ], + "allowlist": [], "stage": { "pre-login": { - "max_attempts": 66, + "max_attempts": 100, "rate": 864000 }, "pre-user-registration": { - "max_attempts": 66, + "max_attempts": 50, "rate": 1200 + }, + "pre-custom-token-exchange": { + "max_attempts": 10, + "rate": 600000 } } }, @@ -4039,18 +3506,16 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/attack-protection/brute-force-protection", + "path": "/api/v2/attack-protection/bot-detection", "body": "", "status": 200, "response": { - "enabled": true, - "shields": [ - "block", - "user_notification" - ], - "mode": "count_per_identifier_and_ip", + "challenge_password_policy": "never", + "challenge_passwordless_policy": "never", + "challenge_password_reset_policy": "never", "allowlist": [], - "max_attempts": 66 + "bot_detection_level": "medium", + "monitoring_mode_enabled": false }, "rawHeaders": [], "responseIsBinary": false @@ -4093,16 +3558,34 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/attack-protection/bot-detection", + "path": "/api/v2/log-streams", "body": "", "status": 200, + "response": [], + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/custom-domains", + "body": "", + "status": 200, + "response": [], + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/branding/themes/default", + "body": "", + "status": 404, "response": { - "challenge_password_policy": "never", - "challenge_passwordless_policy": "never", - "challenge_password_reset_policy": "never", - "allowlist": [], - "bot_detection_level": "medium", - "monitoring_mode_enabled": false + "statusCode": 404, + "error": "Not Found", + "message": "There was an error retrieving branding settings: invalid theme ID", + "errorCode": "theme_not_found" }, "rawHeaders": [], "responseIsBinary": false @@ -4110,116 +3593,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/log-streams", - "body": "", - "status": 200, - "response": [ - { - "id": "lst_0000000000025369", - "name": "Suspended DD Log Stream", - "type": "datadog", - "status": "active", - "sink": { - "datadogApiKey": "some-sensitive-api-key", - "datadogRegion": "us" - }, - "isPriority": false - }, - { - "id": "lst_0000000000025370", - "name": "Amazon EventBridge", - "type": "eventbridge", - "status": "active", - "sink": { - "awsAccountId": "123456789012", - "awsRegion": "us-east-2", - "awsPartnerEventSource": "aws.partner/auth0.com/auth0-deploy-cli-e2e-cfc5325e-4577-409f-8e7b-2e4a664cb6ff/auth0.logs" - }, - "filters": [ - { - "type": "category", - "name": "auth.login.success" - }, - { - "type": "category", - "name": "auth.login.notification" - }, - { - "type": "category", - "name": "auth.login.fail" - }, - { - "type": "category", - "name": "auth.signup.success" - }, - { - "type": "category", - "name": "auth.logout.success" - }, - { - "type": "category", - "name": "auth.logout.fail" - }, - { - "type": "category", - "name": "auth.silent_auth.fail" - }, - { - "type": "category", - "name": "auth.silent_auth.success" - }, - { - "type": "category", - "name": "auth.token_exchange.fail" - } - ], - "isPriority": false - } - ], - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/custom-domains", - "body": "", - "status": 200, - "response": [], - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/custom-domains?take=50", - "body": "", - "status": 200, - "response": { - "custom_domains": [] - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/branding/themes/default", - "body": "", - "status": 404, - "response": { - "statusCode": 404, - "error": "Not Found", - "message": "There was an error retrieving branding settings: invalid theme ID", - "errorCode": "theme_not_found" - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/flows?page=0&per_page=100&include_totals=true", + "path": "/api/v2/flows?page=0&per_page=100&include_totals=true", "body": "", "status": 200, "response": { @@ -4247,7 +3621,7 @@ "name": "Blank-form", "flow_count": 0, "created_at": "2024-11-26T11:58:18.187Z", - "updated_at": "2025-12-04T10:12:36.577Z" + "updated_at": "2025-12-16T09:02:21.881Z" } ] }, @@ -4318,7 +3692,7 @@ } }, "created_at": "2024-11-26T11:58:18.187Z", - "updated_at": "2025-12-04T10:12:36.577Z" + "updated_at": "2025-12-16T09:02:21.881Z" }, "rawHeaders": [], "responseIsBinary": false @@ -4326,14 +3700,14 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/flows/vault/connections?page=0&per_page=100&include_totals=true", + "path": "/api/v2/flows?page=0&per_page=100&include_totals=true", "body": "", "status": 200, "response": { "limit": 100, "start": 0, "total": 0, - "connections": [] + "flows": [] }, "rawHeaders": [], "responseIsBinary": false @@ -4341,14 +3715,14 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/flows?page=0&per_page=100&include_totals=true", + "path": "/api/v2/flows/vault/connections?page=0&per_page=50&include_totals=true", "body": "", "status": 200, "response": { - "limit": 100, + "limit": 50, "start": 0, "total": 0, - "flows": [] + "connections": [] }, "rawHeaders": [], "responseIsBinary": false @@ -4356,11 +3730,26 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/flows/vault/connections?page=0&per_page=100&include_totals=true", + "path": "/api/v2/flows/vault/connections?page=1&per_page=50&include_totals=true", "body": "", "status": 200, "response": { - "limit": 100, + "limit": 50, + "start": 50, + "total": 0, + "connections": [] + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/flows/vault/connections?page=0&per_page=50&include_totals=true", + "body": "", + "status": 200, + "response": { + "limit": 50, "start": 0, "total": 0, "connections": [] @@ -4368,6 +3757,21 @@ "rawHeaders": [], "responseIsBinary": false }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/flows/vault/connections?page=1&per_page=50&include_totals=true", + "body": "", + "status": 200, + "response": { + "limit": 50, + "start": 50, + "total": 0, + "connections": [] + }, + "rawHeaders": [], + "responseIsBinary": false + }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", @@ -4397,7 +3801,7 @@ "okta" ], "created_at": "2024-11-26T11:58:18.962Z", - "updated_at": "2025-12-04T10:12:26.568Z", + "updated_at": "2025-12-16T09:02:11.327Z", "branding": { "colors": { "primary": "#19aecc" @@ -4449,7 +3853,7 @@ } }, "created_at": "2025-09-09T04:41:43.671Z", - "updated_at": "2025-12-04T10:16:46.164Z", + "updated_at": "2025-12-16T10:09:43.241Z", "id": "acl_wpZ6oScRU5L6QKAxMUMHmx" } ] @@ -4512,61 +3916,6 @@ "rawHeaders": [], "responseIsBinary": false }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/user-attribute-profiles?take=10", - "body": "", - "status": 200, - "response": { - "user_attribute_profiles": [ - { - "id": "uap_1csDj3szFsgxGS1oTZTdFm", - "name": "test-user-attribute-profile-2", - "user_id": { - "oidc_mapping": "sub", - "saml_mapping": [ - "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier", - "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn", - "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name" - ], - "scim_mapping": "externalId" - }, - "user_attributes": { - "email": { - "label": "Email", - "description": "Email of the User", - "auth0_mapping": "email", - "profile_required": true - } - } - }, - { - "id": "uap_1csDj3sAVu6n5eTzLw6XZg", - "name": "test-user-attribute-profile", - "user_id": { - "oidc_mapping": "sub", - "saml_mapping": [ - "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier", - "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn", - "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name" - ], - "scim_mapping": "externalId" - }, - "user_attributes": { - "email": { - "label": "Email", - "description": "Email of the User", - "auth0_mapping": "email", - "profile_required": true - } - } - } - ] - }, - "rawHeaders": [], - "responseIsBinary": false - }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", @@ -4582,11 +3931,14 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connection-profiles?take=10", + "path": "/api/v2/token-exchange-profiles?take=50", "body": "", - "status": 200, + "status": 403, "response": { - "connection_profiles": [] + "statusCode": 403, + "error": "Forbidden", + "message": "Insufficient scope, expected any of: read:token_exchange_profiles", + "errorCode": "insufficient_scope" }, "rawHeaders": [], "responseIsBinary": false @@ -5762,6 +5114,22 @@ "value": "delete:organization_client_grants", "description": "Delete Organization Client Grants" }, + { + "value": "create:token_exchange_profiles", + "description": "Create Token Exchange Profile" + }, + { + "value": "read:token_exchange_profiles", + "description": "Read Token Exchange Profiles" + }, + { + "value": "update:token_exchange_profiles", + "description": "Update Token Exchange Profile" + }, + { + "value": "delete:token_exchange_profiles", + "description": "Delete Token Exchange Profile" + }, { "value": "read:security_metrics", "description": "Read Security Metrics" @@ -5793,7 +5161,7 @@ "body": "", "status": 200, "response": { - "total": 8, + "total": 2, "start": 0, "limit": 100, "clients": [ @@ -5856,27 +5224,17 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "API Explorer Application", - "allowed_clients": [], + "name": "Default App", "callbacks": [], - "client_metadata": {}, "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, "oidc_conformant": true, "refresh_token": { "expiration_type": "non-expiring", "leeway": 0, "infinite_token_lifetime": true, "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, + "token_lifetime": 2592000, + "idle_token_lifetime": 1296000, "rotation_type": "non-rotating" }, "sso_disabled": false, @@ -5889,7 +5247,7 @@ "subject": "deprecated" } ], - "client_id": "vVbUuOLzLQ9k7iwdZoLRtQuhG8XHUkSY", + "client_id": "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -5897,3076 +5255,689 @@ "lifetime_in_seconds": 36000, "secret_encoded": false }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", "grant_types": [ + "authorization_code", + "implicit", + "refresh_token", "client_credentials" ], "custom_login_page_on": true - }, + } + ] + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "PATCH", + "path": "/api/v2/clients/lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V", + "body": { + "name": "Default App", + "callbacks": [], + "cross_origin_authentication": false, + "custom_login_page_on": true, + "grant_types": [ + "authorization_code", + "implicit", + "refresh_token", + "client_credentials" + ], + "is_first_party": true, + "is_token_endpoint_ip_header_trusted": false, + "jwt_configuration": { + "alg": "RS256", + "lifetime_in_seconds": 36000 + }, + "oidc_conformant": true, + "refresh_token": { + "expiration_type": "non-expiring", + "leeway": 0, + "infinite_token_lifetime": true, + "infinite_idle_token_lifetime": true, + "token_lifetime": 2592000, + "idle_token_lifetime": 1296000, + "rotation_type": "non-rotating" + }, + "sso_disabled": false + }, + "status": 200, + "response": { + "tenant": "auth0-deploy-cli-e2e", + "global": false, + "is_token_endpoint_ip_header_trusted": false, + "name": "Default App", + "callbacks": [], + "is_first_party": true, + "oidc_conformant": true, + "refresh_token": { + "expiration_type": "non-expiring", + "leeway": 0, + "infinite_token_lifetime": true, + "infinite_idle_token_lifetime": true, + "token_lifetime": 2592000, + "idle_token_lifetime": 1296000, + "rotation_type": "non-rotating" + }, + "sso_disabled": false, + "cross_origin_authentication": false, + "cross_origin_auth": false, + "signing_keys": [ { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Quickstarts API (Test Application)", - "client_metadata": { - "foo": "bar" - }, - "is_first_party": true, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "O0AMH5MORoUOkQ8g31aPVmBZ11jyApI5", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", - "grant_types": [ - "client_credentials" - ], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Node App", - "allowed_clients": [], - "allowed_logout_urls": [], - "callbacks": [], - "client_metadata": {}, - "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "allowed_origins": [], - "client_id": "88gPebiknBTdBHOAYrSdF2WWRyuroAax", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "regular_web", - "grant_types": [ - "authorization_code", - "implicit", - "refresh_token", - "client_credentials" - ], - "web_origins": [], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "The Default App", - "allowed_clients": [], - "callbacks": [], - "client_metadata": {}, - "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "oidc_conformant": false, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 2592000, - "idle_token_lifetime": 1296000, - "rotation_type": "non-rotating" - }, - "sso": false, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "7vlUKQihTlaGoILrgQ51JW4xMbU1XhI0", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "grant_types": [ - "authorization_code", - "implicit", - "refresh_token", - "client_credentials" - ], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Terraform Provider", - "is_first_party": true, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "R9N1M3jJcxlEKpIcm4EX8glA7Krb9h1k", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", - "grant_types": [ - "client_credentials" - ], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Test SPA", - "allowed_clients": [], - "allowed_logout_urls": [ - "http://localhost:3000" - ], - "callbacks": [ - "http://localhost:3000" - ], - "client_metadata": {}, - "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "expiring", - "leeway": 0, - "token_lifetime": 2592000, - "idle_token_lifetime": 1296000, - "infinite_token_lifetime": false, - "infinite_idle_token_lifetime": false, - "rotation_type": "rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "9ztJ1ZaM0iTa9eR2Ga08KOrwBNqNuRmr", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "client_aliases": [], - "token_endpoint_auth_method": "none", - "app_type": "spa", - "grant_types": [ - "authorization_code", - "implicit", - "refresh_token" - ], - "web_origins": [ - "http://localhost:3000" - ], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "auth0-deploy-cli-extension", - "allowed_clients": [], - "callbacks": [], - "client_metadata": {}, - "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "8DngHjTrjB57cRXo74zYn4qohnAxjFsG", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", - "grant_types": [ - "client_credentials" - ], - "custom_login_page_on": true - } - ] - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "PATCH", - "path": "/api/v2/clients/vVbUuOLzLQ9k7iwdZoLRtQuhG8XHUkSY", - "body": { - "name": "API Explorer Application", - "allowed_clients": [], - "app_type": "non_interactive", - "callbacks": [], - "client_aliases": [], - "client_metadata": {}, - "cross_origin_authentication": false, - "custom_login_page_on": true, - "grant_types": [ - "client_credentials" - ], - "is_first_party": true, - "is_token_endpoint_ip_header_trusted": false, - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000 - }, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, - "sso_disabled": false, - "token_endpoint_auth_method": "client_secret_post" - }, - "status": 200, - "response": { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "API Explorer Application", - "allowed_clients": [], - "callbacks": [], - "client_metadata": {}, - "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "/CN=auth0-deploy-cli-e2e.us.auth0.com" - } - ], - "client_id": "vVbUuOLzLQ9k7iwdZoLRtQuhG8XHUkSY", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", - "grant_types": [ - "client_credentials" - ], - "custom_login_page_on": true - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "PATCH", - "path": "/api/v2/clients/O0AMH5MORoUOkQ8g31aPVmBZ11jyApI5", - "body": { - "name": "Quickstarts API (Test Application)", - "app_type": "non_interactive", - "client_metadata": { - "foo": "bar" - }, - "cross_origin_authentication": false, - "custom_login_page_on": true, - "grant_types": [ - "client_credentials" - ], - "is_first_party": true, - "is_token_endpoint_ip_header_trusted": false, - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000 - }, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, - "sso_disabled": false, - "token_endpoint_auth_method": "client_secret_post" - }, - "status": 200, - "response": { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Quickstarts API (Test Application)", - "client_metadata": { - "foo": "bar" - }, - "is_first_party": true, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "/CN=auth0-deploy-cli-e2e.us.auth0.com" - } - ], - "client_id": "O0AMH5MORoUOkQ8g31aPVmBZ11jyApI5", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", - "grant_types": [ - "client_credentials" - ], - "custom_login_page_on": true - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "PATCH", - "path": "/api/v2/clients/88gPebiknBTdBHOAYrSdF2WWRyuroAax", - "body": { - "name": "Node App", - "allowed_clients": [], - "allowed_logout_urls": [], - "allowed_origins": [], - "app_type": "regular_web", - "callbacks": [], - "client_aliases": [], - "client_metadata": {}, - "cross_origin_authentication": false, - "custom_login_page_on": true, - "grant_types": [ - "authorization_code", - "implicit", - "refresh_token", - "client_credentials" - ], - "is_first_party": true, - "is_token_endpoint_ip_header_trusted": false, - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000 - }, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, - "sso_disabled": false, - "token_endpoint_auth_method": "client_secret_post", - "web_origins": [] - }, - "status": 200, - "response": { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Node App", - "allowed_clients": [], - "allowed_logout_urls": [], - "callbacks": [], - "client_metadata": {}, - "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "/CN=auth0-deploy-cli-e2e.us.auth0.com" - } - ], - "allowed_origins": [], - "client_id": "88gPebiknBTdBHOAYrSdF2WWRyuroAax", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "regular_web", - "grant_types": [ - "authorization_code", - "implicit", - "refresh_token", - "client_credentials" - ], - "web_origins": [], - "custom_login_page_on": true - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "PATCH", - "path": "/api/v2/clients/9ztJ1ZaM0iTa9eR2Ga08KOrwBNqNuRmr", - "body": { - "name": "Test SPA", - "allowed_clients": [], - "allowed_logout_urls": [ - "http://localhost:3000" - ], - "app_type": "spa", - "callbacks": [ - "http://localhost:3000" - ], - "client_aliases": [], - "client_metadata": {}, - "cross_origin_authentication": false, - "custom_login_page_on": true, - "grant_types": [ - "authorization_code", - "implicit", - "refresh_token" - ], - "is_first_party": true, - "is_token_endpoint_ip_header_trusted": false, - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000 - }, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "expiring", - "leeway": 0, - "token_lifetime": 2592000, - "idle_token_lifetime": 1296000, - "infinite_token_lifetime": false, - "infinite_idle_token_lifetime": false, - "rotation_type": "rotating" - }, - "sso_disabled": false, - "token_endpoint_auth_method": "none", - "web_origins": [ - "http://localhost:3000" - ] - }, - "status": 200, - "response": { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Test SPA", - "allowed_clients": [], - "allowed_logout_urls": [ - "http://localhost:3000" - ], - "callbacks": [ - "http://localhost:3000" - ], - "client_metadata": {}, - "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "expiring", - "leeway": 0, - "token_lifetime": 2592000, - "idle_token_lifetime": 1296000, - "infinite_token_lifetime": false, - "infinite_idle_token_lifetime": false, - "rotation_type": "rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "/CN=auth0-deploy-cli-e2e.us.auth0.com" - } - ], - "client_id": "9ztJ1ZaM0iTa9eR2Ga08KOrwBNqNuRmr", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "client_aliases": [], - "token_endpoint_auth_method": "none", - "app_type": "spa", - "grant_types": [ - "authorization_code", - "implicit", - "refresh_token" - ], - "web_origins": [ - "http://localhost:3000" - ], - "custom_login_page_on": true - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "PATCH", - "path": "/api/v2/clients/7vlUKQihTlaGoILrgQ51JW4xMbU1XhI0", - "body": { - "name": "The Default App", - "allowed_clients": [], - "callbacks": [], - "client_aliases": [], - "client_metadata": {}, - "cross_origin_authentication": false, - "custom_login_page_on": true, - "grant_types": [ - "authorization_code", - "implicit", - "refresh_token", - "client_credentials" - ], - "is_first_party": true, - "is_token_endpoint_ip_header_trusted": false, - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000 - }, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "oidc_conformant": false, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 2592000, - "idle_token_lifetime": 1296000, - "rotation_type": "non-rotating" - }, - "sso": false, - "sso_disabled": false, - "token_endpoint_auth_method": "client_secret_post" - }, - "status": 200, - "response": { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "The Default App", - "allowed_clients": [], - "callbacks": [], - "client_metadata": {}, - "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "oidc_conformant": false, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 2592000, - "idle_token_lifetime": 1296000, - "rotation_type": "non-rotating" - }, - "sso": false, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "/CN=auth0-deploy-cli-e2e.us.auth0.com" - } - ], - "client_id": "7vlUKQihTlaGoILrgQ51JW4xMbU1XhI0", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "grant_types": [ - "authorization_code", - "implicit", - "refresh_token", - "client_credentials" - ], - "custom_login_page_on": true - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "PATCH", - "path": "/api/v2/clients/R9N1M3jJcxlEKpIcm4EX8glA7Krb9h1k", - "body": { - "name": "Terraform Provider", - "app_type": "non_interactive", - "cross_origin_authentication": false, - "custom_login_page_on": true, - "grant_types": [ - "client_credentials" - ], - "is_first_party": true, - "is_token_endpoint_ip_header_trusted": false, - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000 - }, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, - "sso_disabled": false, - "token_endpoint_auth_method": "client_secret_post" - }, - "status": 200, - "response": { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Terraform Provider", - "is_first_party": true, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "/CN=auth0-deploy-cli-e2e.us.auth0.com" - } - ], - "client_id": "R9N1M3jJcxlEKpIcm4EX8glA7Krb9h1k", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", - "grant_types": [ - "client_credentials" - ], - "custom_login_page_on": true - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "PATCH", - "path": "/api/v2/clients/8DngHjTrjB57cRXo74zYn4qohnAxjFsG", - "body": { - "name": "auth0-deploy-cli-extension", - "allowed_clients": [], - "app_type": "non_interactive", - "callbacks": [], - "client_aliases": [], - "client_metadata": {}, - "cross_origin_authentication": false, - "custom_login_page_on": true, - "grant_types": [ - "client_credentials" - ], - "is_first_party": true, - "is_token_endpoint_ip_header_trusted": false, - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000 - }, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, - "sso_disabled": false, - "token_endpoint_auth_method": "client_secret_post" - }, - "status": 200, - "response": { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "auth0-deploy-cli-extension", - "allowed_clients": [], - "callbacks": [], - "client_metadata": {}, - "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "/CN=auth0-deploy-cli-e2e.us.auth0.com" - } - ], - "client_id": "8DngHjTrjB57cRXo74zYn4qohnAxjFsG", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", - "grant_types": [ - "client_credentials" - ], - "custom_login_page_on": true - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "PUT", - "path": "/api/v2/guardian/factors/email", - "body": { - "enabled": false - }, - "status": 200, - "response": { - "enabled": false - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "PUT", - "path": "/api/v2/guardian/factors/otp", - "body": { - "enabled": false - }, - "status": 200, - "response": { - "enabled": false - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "PUT", - "path": "/api/v2/guardian/factors/push-notification", - "body": { - "enabled": true - }, - "status": 200, - "response": { - "enabled": true - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "PUT", - "path": "/api/v2/guardian/factors/webauthn-roaming", - "body": { - "enabled": false - }, - "status": 200, - "response": { - "enabled": false - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "PUT", - "path": "/api/v2/guardian/factors/duo", - "body": { - "enabled": false - }, - "status": 200, - "response": { - "enabled": false - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "PUT", - "path": "/api/v2/guardian/factors/recovery-code", - "body": { - "enabled": false - }, - "status": 200, - "response": { - "enabled": false - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "PUT", - "path": "/api/v2/guardian/factors/sms", - "body": { - "enabled": false - }, - "status": 200, - "response": { - "enabled": false - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "PUT", - "path": "/api/v2/guardian/factors/webauthn-platform", - "body": { - "enabled": false - }, - "status": 200, - "response": { - "enabled": false - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "PUT", - "path": "/api/v2/guardian/factors/sms/templates", - "body": { - "enrollment_message": "enroll foo", - "verification_message": "verify foo" - }, - "status": 200, - "response": { - "enrollment_message": "enroll foo", - "verification_message": "verify foo" - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "PUT", - "path": "/api/v2/guardian/policies", - "body": [ - "all-applications" - ], - "status": 200, - "response": [ - "all-applications" - ], - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "PUT", - "path": "/api/v2/guardian/factors/phone/selected-provider", - "body": { - "provider": "auth0" - }, - "status": 200, - "response": { - "provider": "auth0" - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "PUT", - "path": "/api/v2/guardian/factors/phone/message-types", - "body": { - "message_types": [] - }, - "status": 200, - "response": { - "message_types": [] - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "PATCH", - "path": "/api/v2/prompts", - "body": { - "identifier_first": true, - "universal_login_experience": "new" - }, - "status": 200, - "response": { - "universal_login_experience": "new", - "identifier_first": true - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/actions/actions?page=0&per_page=100", - "body": "", - "status": 200, - "response": { - "actions": [ - { - "id": "bae9165a-5430-464c-b900-7de6abc92c29", - "name": "My Custom Action", - "supported_triggers": [ - { - "id": "post-login", - "version": "v2" - } - ], - "created_at": "2025-12-04T10:16:43.559450240Z", - "updated_at": "2025-12-04T10:16:43.581547208Z", - "code": "/**\n * Handler that will be called during the execution of a PostLogin flow.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\nexports.onExecutePostLogin = async (event, api) => {\n console.log('Some custom action!');\n};\n\n/**\n * Handler that will be invoked when this action is resuming after an external redirect. If your\n * onExecutePostLogin function does not perform a redirect, this function can be safely ignored.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\n// exports.onContinuePostLogin = async (event, api) => {\n// };\n", - "dependencies": [], - "runtime": "node18", - "status": "built", - "secrets": [], - "current_version": { - "id": "ccddd308-9d7e-4da4-9dd7-89a2c4323f38", - "code": "/**\n * Handler that will be called during the execution of a PostLogin flow.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\nexports.onExecutePostLogin = async (event, api) => {\n console.log('Some custom action!');\n};\n\n/**\n * Handler that will be invoked when this action is resuming after an external redirect. If your\n * onExecutePostLogin function does not perform a redirect, this function can be safely ignored.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\n// exports.onContinuePostLogin = async (event, api) => {\n// };\n", - "runtime": "node18", - "status": "BUILT", - "number": 1, - "build_time": "2025-12-04T10:16:44.464501727Z", - "created_at": "2025-12-04T10:16:44.387189873Z", - "updated_at": "2025-12-04T10:16:44.465373484Z" - }, - "deployed_version": { - "code": "/**\n * Handler that will be called during the execution of a PostLogin flow.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\nexports.onExecutePostLogin = async (event, api) => {\n console.log('Some custom action!');\n};\n\n/**\n * Handler that will be invoked when this action is resuming after an external redirect. If your\n * onExecutePostLogin function does not perform a redirect, this function can be safely ignored.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\n// exports.onContinuePostLogin = async (event, api) => {\n// };\n", - "dependencies": [], - "id": "ccddd308-9d7e-4da4-9dd7-89a2c4323f38", - "deployed": true, - "number": 1, - "built_at": "2025-12-04T10:16:44.464501727Z", - "secrets": [], - "status": "built", - "created_at": "2025-12-04T10:16:44.387189873Z", - "updated_at": "2025-12-04T10:16:44.465373484Z", - "runtime": "node18", - "supported_triggers": [ - { - "id": "post-login", - "version": "v2" - } - ] - }, - "all_changes_deployed": true - } - ], - "total": 1, - "per_page": 100 - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "PATCH", - "path": "/api/v2/actions/actions/bae9165a-5430-464c-b900-7de6abc92c29", - "body": { - "name": "My Custom Action", - "code": "/**\n * Handler that will be called during the execution of a PostLogin flow.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\nexports.onExecutePostLogin = async (event, api) => {\n console.log('Some custom action!');\n};\n\n/**\n * Handler that will be invoked when this action is resuming after an external redirect. If your\n * onExecutePostLogin function does not perform a redirect, this function can be safely ignored.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\n// exports.onContinuePostLogin = async (event, api) => {\n// };\n", - "dependencies": [], - "runtime": "node18", - "secrets": [], - "supported_triggers": [ - { - "id": "post-login", - "version": "v2" - } - ] - }, - "status": 200, - "response": { - "id": "bae9165a-5430-464c-b900-7de6abc92c29", - "name": "My Custom Action", - "supported_triggers": [ - { - "id": "post-login", - "version": "v2" - } - ], - "created_at": "2025-12-04T10:16:43.559450240Z", - "updated_at": "2025-12-04T10:20:27.883210614Z", - "code": "/**\n * Handler that will be called during the execution of a PostLogin flow.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\nexports.onExecutePostLogin = async (event, api) => {\n console.log('Some custom action!');\n};\n\n/**\n * Handler that will be invoked when this action is resuming after an external redirect. If your\n * onExecutePostLogin function does not perform a redirect, this function can be safely ignored.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\n// exports.onContinuePostLogin = async (event, api) => {\n// };\n", - "dependencies": [], - "runtime": "node18", - "status": "pending", - "secrets": [], - "current_version": { - "id": "ccddd308-9d7e-4da4-9dd7-89a2c4323f38", - "code": "/**\n * Handler that will be called during the execution of a PostLogin flow.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\nexports.onExecutePostLogin = async (event, api) => {\n console.log('Some custom action!');\n};\n\n/**\n * Handler that will be invoked when this action is resuming after an external redirect. If your\n * onExecutePostLogin function does not perform a redirect, this function can be safely ignored.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\n// exports.onContinuePostLogin = async (event, api) => {\n// };\n", - "runtime": "node18", - "status": "BUILT", - "number": 1, - "build_time": "2025-12-04T10:16:44.464501727Z", - "created_at": "2025-12-04T10:16:44.387189873Z", - "updated_at": "2025-12-04T10:16:44.465373484Z" - }, - "deployed_version": { - "code": "/**\n * Handler that will be called during the execution of a PostLogin flow.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\nexports.onExecutePostLogin = async (event, api) => {\n console.log('Some custom action!');\n};\n\n/**\n * Handler that will be invoked when this action is resuming after an external redirect. If your\n * onExecutePostLogin function does not perform a redirect, this function can be safely ignored.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\n// exports.onContinuePostLogin = async (event, api) => {\n// };\n", - "dependencies": [], - "id": "ccddd308-9d7e-4da4-9dd7-89a2c4323f38", - "deployed": true, - "number": 1, - "built_at": "2025-12-04T10:16:44.464501727Z", - "secrets": [], - "status": "built", - "created_at": "2025-12-04T10:16:44.387189873Z", - "updated_at": "2025-12-04T10:16:44.465373484Z", - "runtime": "node18", - "supported_triggers": [ - { - "id": "post-login", - "version": "v2" - } - ] - }, - "all_changes_deployed": true - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/actions/actions?page=0&per_page=100", - "body": "", - "status": 200, - "response": { - "actions": [ - { - "id": "bae9165a-5430-464c-b900-7de6abc92c29", - "name": "My Custom Action", - "supported_triggers": [ - { - "id": "post-login", - "version": "v2" - } - ], - "created_at": "2025-12-04T10:16:43.559450240Z", - "updated_at": "2025-12-04T10:20:27.883210614Z", - "code": "/**\n * Handler that will be called during the execution of a PostLogin flow.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\nexports.onExecutePostLogin = async (event, api) => {\n console.log('Some custom action!');\n};\n\n/**\n * Handler that will be invoked when this action is resuming after an external redirect. If your\n * onExecutePostLogin function does not perform a redirect, this function can be safely ignored.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\n// exports.onContinuePostLogin = async (event, api) => {\n// };\n", - "dependencies": [], - "runtime": "node18", - "status": "built", - "secrets": [], - "current_version": { - "id": "ccddd308-9d7e-4da4-9dd7-89a2c4323f38", - "code": "/**\n * Handler that will be called during the execution of a PostLogin flow.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\nexports.onExecutePostLogin = async (event, api) => {\n console.log('Some custom action!');\n};\n\n/**\n * Handler that will be invoked when this action is resuming after an external redirect. If your\n * onExecutePostLogin function does not perform a redirect, this function can be safely ignored.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\n// exports.onContinuePostLogin = async (event, api) => {\n// };\n", - "runtime": "node18", - "status": "BUILT", - "number": 1, - "build_time": "2025-12-04T10:16:44.464501727Z", - "created_at": "2025-12-04T10:16:44.387189873Z", - "updated_at": "2025-12-04T10:16:44.465373484Z" - }, - "deployed_version": { - "code": "/**\n * Handler that will be called during the execution of a PostLogin flow.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\nexports.onExecutePostLogin = async (event, api) => {\n console.log('Some custom action!');\n};\n\n/**\n * Handler that will be invoked when this action is resuming after an external redirect. If your\n * onExecutePostLogin function does not perform a redirect, this function can be safely ignored.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\n// exports.onContinuePostLogin = async (event, api) => {\n// };\n", - "dependencies": [], - "id": "ccddd308-9d7e-4da4-9dd7-89a2c4323f38", - "deployed": true, - "number": 1, - "built_at": "2025-12-04T10:16:44.464501727Z", - "secrets": [], - "status": "built", - "created_at": "2025-12-04T10:16:44.387189873Z", - "updated_at": "2025-12-04T10:16:44.465373484Z", - "runtime": "node18", - "supported_triggers": [ - { - "id": "post-login", - "version": "v2" - } - ] - }, - "all_changes_deployed": true - } - ], - "total": 1, - "per_page": 100 - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "POST", - "path": "/api/v2/actions/actions/bae9165a-5430-464c-b900-7de6abc92c29/deploy", - "body": "", - "status": 200, - "response": { - "code": "/**\n * Handler that will be called during the execution of a PostLogin flow.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\nexports.onExecutePostLogin = async (event, api) => {\n console.log('Some custom action!');\n};\n\n/**\n * Handler that will be invoked when this action is resuming after an external redirect. If your\n * onExecutePostLogin function does not perform a redirect, this function can be safely ignored.\n *\n * @param {Event} event - Details about the user and the context in which they are logging in.\n * @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.\n */\n// exports.onContinuePostLogin = async (event, api) => {\n// };\n", - "dependencies": [], - "id": "18c46cb3-5c9f-4515-b904-1cba058d59e3", - "deployed": false, - "number": 2, - "secrets": [], - "status": "built", - "created_at": "2025-12-04T10:20:28.641773164Z", - "updated_at": "2025-12-04T10:20:28.641773164Z", - "runtime": "node18", - "supported_triggers": [ - { - "id": "post-login", - "version": "v2" - } - ], - "action": { - "id": "bae9165a-5430-464c-b900-7de6abc92c29", - "name": "My Custom Action", - "supported_triggers": [ - { - "id": "post-login", - "version": "v2" - } - ], - "created_at": "2025-12-04T10:16:43.559450240Z", - "updated_at": "2025-12-04T10:20:27.874490222Z", - "all_changes_deployed": false - } - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "PATCH", - "path": "/api/v2/attack-protection/bot-detection", - "body": { - "challenge_password_policy": "never", - "challenge_passwordless_policy": "never", - "challenge_password_reset_policy": "never", - "allowlist": [], - "bot_detection_level": "medium", - "monitoring_mode_enabled": false - }, - "status": 200, - "response": { - "challenge_password_policy": "never", - "challenge_passwordless_policy": "never", - "challenge_password_reset_policy": "never", - "allowlist": [], - "bot_detection_level": "medium", - "monitoring_mode_enabled": false - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "PATCH", - "path": "/api/v2/attack-protection/brute-force-protection", - "body": { - "enabled": true, - "shields": [ - "block", - "user_notification" - ], - "mode": "count_per_identifier_and_ip", - "allowlist": [], - "max_attempts": 66 - }, - "status": 200, - "response": { - "enabled": true, - "shields": [ - "block", - "user_notification" - ], - "mode": "count_per_identifier_and_ip", - "allowlist": [], - "max_attempts": 66 - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "PATCH", - "path": "/api/v2/attack-protection/captcha", - "body": { - "active_provider_id": "auth_challenge", - "auth_challenge": { - "fail_open": false - } - }, - "status": 200, - "response": { - "active_provider_id": "auth_challenge", - "simple_captcha": {}, - "auth_challenge": { - "fail_open": false - }, - "recaptcha_v2": { - "site_key": "" - }, - "recaptcha_enterprise": { - "site_key": "", - "project_id": "" - }, - "hcaptcha": { - "site_key": "" - }, - "friendly_captcha": { - "site_key": "" - }, - "arkose": { - "site_key": "", - "client_subdomain": "client-api", - "verify_subdomain": "verify-api", - "fail_open": false - } - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "PATCH", - "path": "/api/v2/attack-protection/suspicious-ip-throttling", - "body": { - "enabled": true, - "shields": [ - "admin_notification" - ], - "allowlist": [ - "127.0.0.1" - ], - "stage": { - "pre-login": { - "max_attempts": 66, - "rate": 864000 - }, - "pre-user-registration": { - "max_attempts": 66, - "rate": 1200 - } - } - }, - "status": 200, - "response": { - "enabled": true, - "shields": [ - "admin_notification" - ], - "allowlist": [ - "127.0.0.1" - ], - "stage": { - "pre-login": { - "max_attempts": 66, - "rate": 864000 - }, - "pre-user-registration": { - "max_attempts": 66, - "rate": 1200 - } - } - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "PATCH", - "path": "/api/v2/attack-protection/breached-password-detection", - "body": { - "enabled": false, - "shields": [], - "admin_notification_frequency": [], - "method": "standard", - "stage": { - "pre-user-registration": { - "shields": [] - }, - "pre-change-password": { - "shields": [] - } - } - }, - "status": 200, - "response": { - "enabled": false, - "shields": [], - "admin_notification_frequency": [], - "method": "standard", - "stage": { - "pre-user-registration": { - "shields": [] - }, - "pre-change-password": { - "shields": [] - } - } - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/custom-domains", - "body": "", - "status": 200, - "response": [], - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/custom-domains?take=50", - "body": "", - "status": 200, - "response": { - "custom_domains": [] - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/network-acls?page=0&per_page=100&include_totals=true", - "body": "", - "status": 200, - "response": { - "total": 1, - "start": 0, - "limit": 100, - "network_acls": [ - { - "description": "Allow Specific Countries", - "active": false, - "priority": 1, - "rule": { - "match": { - "geo_country_codes": [ - "US" - ] - }, - "scope": "authentication", - "action": { - "allow": true - } - }, - "created_at": "2025-09-09T04:41:43.671Z", - "updated_at": "2025-12-04T10:16:46.164Z", - "id": "acl_wpZ6oScRU5L6QKAxMUMHmx" - } - ] - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "PUT", - "path": "/api/v2/network-acls/acl_wpZ6oScRU5L6QKAxMUMHmx", - "body": { - "priority": 1, - "rule": { - "match": { - "geo_country_codes": [ - "US" - ] - }, - "scope": "authentication", - "action": { - "allow": true - } - }, - "active": false, - "description": "Allow Specific Countries" - }, - "status": 200, - "response": { - "description": "Allow Specific Countries", - "active": false, - "priority": 1, - "rule": { - "match": { - "geo_country_codes": [ - "US" - ] - }, - "scope": "authentication", - "action": { - "allow": true - } - }, - "created_at": "2025-09-09T04:41:43.671Z", - "updated_at": "2025-12-04T10:20:31.007Z", - "id": "acl_wpZ6oScRU5L6QKAxMUMHmx" - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/user-attribute-profiles?take=10", - "body": "", - "status": 200, - "response": { - "user_attribute_profiles": [ - { - "id": "uap_1csDj3szFsgxGS1oTZTdFm", - "name": "test-user-attribute-profile-2", - "user_id": { - "oidc_mapping": "sub", - "saml_mapping": [ - "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier", - "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn", - "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name" - ], - "scim_mapping": "externalId" - }, - "user_attributes": { - "email": { - "label": "Email", - "description": "Email of the User", - "auth0_mapping": "email", - "profile_required": true - } - } - }, - { - "id": "uap_1csDj3sAVu6n5eTzLw6XZg", - "name": "test-user-attribute-profile", - "user_id": { - "oidc_mapping": "sub", - "saml_mapping": [ - "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier", - "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn", - "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name" - ], - "scim_mapping": "externalId" - }, - "user_attributes": { - "email": { - "label": "Email", - "description": "Email of the User", - "auth0_mapping": "email", - "profile_required": true - } - } - } - ] - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/user-attribute-profiles?take=10", - "body": "", - "status": 200, - "response": { - "user_attribute_profiles": [ - { - "id": "uap_1csDj3szFsgxGS1oTZTdFm", - "name": "test-user-attribute-profile-2", - "user_id": { - "oidc_mapping": "sub", - "saml_mapping": [ - "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier", - "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn", - "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name" - ], - "scim_mapping": "externalId" - }, - "user_attributes": { - "email": { - "label": "Email", - "description": "Email of the User", - "auth0_mapping": "email", - "profile_required": true - } - } - }, - { - "id": "uap_1csDj3sAVu6n5eTzLw6XZg", - "name": "test-user-attribute-profile", - "user_id": { - "oidc_mapping": "sub", - "saml_mapping": [ - "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier", - "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn", - "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name" - ], - "scim_mapping": "externalId" - }, - "user_attributes": { - "email": { - "label": "Email", - "description": "Email of the User", - "auth0_mapping": "email", - "profile_required": true - } - } - } - ] - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "PATCH", - "path": "/api/v2/user-attribute-profiles/uap_1csDj3szFsgxGS1oTZTdFm", - "body": { - "name": "test-user-attribute-profile-2", - "user_attributes": { - "email": { - "label": "Email", - "description": "Email of the User", - "auth0_mapping": "email", - "profile_required": true - } - }, - "user_id": { - "oidc_mapping": "sub", - "saml_mapping": [ - "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier", - "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn", - "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name" - ], - "scim_mapping": "externalId" - } - }, - "status": 200, - "response": { - "id": "uap_1csDj3szFsgxGS1oTZTdFm", - "name": "test-user-attribute-profile-2", - "user_id": { - "oidc_mapping": "sub", - "saml_mapping": [ - "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier", - "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn", - "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name" - ], - "scim_mapping": "externalId" - }, - "user_attributes": { - "email": { - "label": "Email", - "description": "Email of the User", - "auth0_mapping": "email", - "profile_required": true - } - } - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "PATCH", - "path": "/api/v2/user-attribute-profiles/uap_1csDj3sAVu6n5eTzLw6XZg", - "body": { - "name": "test-user-attribute-profile", - "user_attributes": { - "email": { - "label": "Email", - "description": "Email of the User", - "auth0_mapping": "email", - "profile_required": true - } - }, - "user_id": { - "oidc_mapping": "sub", - "saml_mapping": [ - "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier", - "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn", - "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name" - ], - "scim_mapping": "externalId" - } - }, - "status": 200, - "response": { - "id": "uap_1csDj3sAVu6n5eTzLw6XZg", - "name": "test-user-attribute-profile", - "user_id": { - "oidc_mapping": "sub", - "saml_mapping": [ - "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier", - "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn", - "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name" - ], - "scim_mapping": "externalId" - }, - "user_attributes": { - "email": { - "label": "Email", - "description": "Email of the User", - "auth0_mapping": "email", - "profile_required": true - } - } - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/connection-profiles?take=10", - "body": "", - "status": 200, - "response": { - "connection_profiles": [] - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/connection-profiles?take=10", - "body": "", - "status": 200, - "response": { - "connection_profiles": [] - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/clients?page=0&per_page=100&include_totals=true", - "body": "", - "status": 200, - "response": { - "total": 9, - "start": 0, - "limit": 100, - "clients": [ - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Deploy CLI", - "is_first_party": true, - "oidc_conformant": true, - "sso_disabled": false, - "cross_origin_auth": false, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, - "cross_origin_authentication": true, - "allowed_clients": [], - "callbacks": [], - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", - "grant_types": [ - "client_credentials", - "implicit", - "authorization_code", - "refresh_token" - ], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "API Explorer Application", - "allowed_clients": [], - "callbacks": [], - "client_metadata": {}, - "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "vVbUuOLzLQ9k7iwdZoLRtQuhG8XHUkSY", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", - "grant_types": [ - "client_credentials" - ], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Quickstarts API (Test Application)", - "client_metadata": { - "foo": "bar" - }, - "is_first_party": true, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "O0AMH5MORoUOkQ8g31aPVmBZ11jyApI5", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", - "grant_types": [ - "client_credentials" - ], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Node App", - "allowed_clients": [], - "allowed_logout_urls": [], - "callbacks": [], - "client_metadata": {}, - "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "allowed_origins": [], - "client_id": "88gPebiknBTdBHOAYrSdF2WWRyuroAax", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "regular_web", - "grant_types": [ - "authorization_code", - "implicit", - "refresh_token", - "client_credentials" - ], - "web_origins": [], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "The Default App", - "allowed_clients": [], - "callbacks": [], - "client_metadata": {}, - "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "oidc_conformant": false, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 2592000, - "idle_token_lifetime": 1296000, - "rotation_type": "non-rotating" - }, - "sso": false, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "7vlUKQihTlaGoILrgQ51JW4xMbU1XhI0", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "grant_types": [ - "authorization_code", - "implicit", - "refresh_token", - "client_credentials" - ], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Terraform Provider", - "is_first_party": true, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "R9N1M3jJcxlEKpIcm4EX8glA7Krb9h1k", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", - "grant_types": [ - "client_credentials" - ], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Test SPA", - "allowed_clients": [], - "allowed_logout_urls": [ - "http://localhost:3000" - ], - "callbacks": [ - "http://localhost:3000" - ], - "client_metadata": {}, - "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "expiring", - "leeway": 0, - "token_lifetime": 2592000, - "idle_token_lifetime": 1296000, - "infinite_token_lifetime": false, - "infinite_idle_token_lifetime": false, - "rotation_type": "rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "9ztJ1ZaM0iTa9eR2Ga08KOrwBNqNuRmr", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "client_aliases": [], - "token_endpoint_auth_method": "none", - "app_type": "spa", - "grant_types": [ - "authorization_code", - "implicit", - "refresh_token" - ], - "web_origins": [ - "http://localhost:3000" - ], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "auth0-deploy-cli-extension", - "allowed_clients": [], - "callbacks": [], - "client_metadata": {}, - "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "8DngHjTrjB57cRXo74zYn4qohnAxjFsG", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", - "grant_types": [ - "client_credentials" - ], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": true, - "callbacks": [], - "is_first_party": true, - "name": "All Applications", - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 2592000, - "idle_token_lifetime": 1296000, - "rotation_type": "non-rotating" - }, - "owners": [ - "mr|samlp|okta|will.vedder@auth0.com", - "mr|google-oauth2|102002633619863830825", - "mr|samlp|okta|frederik.prijck@auth0.com", - "mr|google-oauth2|109614534713742077035", - "mr|google-oauth2|116771660953104383819", - "mr|google-oauth2|112839029247827700155", - "mr|samlp|okta|ewan.harris@auth0.com" - ], - "custom_login_page": "TEST123\n", - "cross_origin_authentication": true, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "Isi93ibGHIGwmdYjsLwTOn7Gu7nwxU3V", - "client_secret": "[REDACTED]", - "custom_login_page_on": true - } - ] - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/connections?include_totals=true&strategy=auth0", - "body": "", - "status": 200, - "response": { - "total": 0, - "start": 0, - "limit": 50, - "connections": [] - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/connections?include_totals=true&take=50&strategy=auth0", - "body": "", - "status": 200, - "response": { - "connections": [] - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/connections?include_totals=true&strategy=auth0", - "body": "", - "status": 200, - "response": { - "total": 0, - "start": 0, - "limit": 50, - "connections": [] - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/connections?include_totals=true&take=50&strategy=auth0", - "body": "", - "status": 200, - "response": { - "connections": [] - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/clients?page=0&per_page=100&include_totals=true", - "body": "", - "status": 200, - "response": { - "total": 9, - "start": 0, - "limit": 100, - "clients": [ - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Deploy CLI", - "is_first_party": true, - "oidc_conformant": true, - "sso_disabled": false, - "cross_origin_auth": false, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, - "cross_origin_authentication": true, - "allowed_clients": [], - "callbacks": [], - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", - "grant_types": [ - "client_credentials", - "implicit", - "authorization_code", - "refresh_token" - ], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "API Explorer Application", - "allowed_clients": [], - "callbacks": [], - "client_metadata": {}, - "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "vVbUuOLzLQ9k7iwdZoLRtQuhG8XHUkSY", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", - "grant_types": [ - "client_credentials" - ], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Quickstarts API (Test Application)", - "client_metadata": { - "foo": "bar" - }, - "is_first_party": true, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "O0AMH5MORoUOkQ8g31aPVmBZ11jyApI5", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", - "grant_types": [ - "client_credentials" - ], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Node App", - "allowed_clients": [], - "allowed_logout_urls": [], - "callbacks": [], - "client_metadata": {}, - "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "allowed_origins": [], - "client_id": "88gPebiknBTdBHOAYrSdF2WWRyuroAax", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "regular_web", - "grant_types": [ - "authorization_code", - "implicit", - "refresh_token", - "client_credentials" - ], - "web_origins": [], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "The Default App", - "allowed_clients": [], - "callbacks": [], - "client_metadata": {}, - "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "oidc_conformant": false, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 2592000, - "idle_token_lifetime": 1296000, - "rotation_type": "non-rotating" - }, - "sso": false, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "7vlUKQihTlaGoILrgQ51JW4xMbU1XhI0", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "grant_types": [ - "authorization_code", - "implicit", - "refresh_token", - "client_credentials" - ], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Terraform Provider", - "is_first_party": true, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "R9N1M3jJcxlEKpIcm4EX8glA7Krb9h1k", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", - "grant_types": [ - "client_credentials" - ], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Test SPA", - "allowed_clients": [], - "allowed_logout_urls": [ - "http://localhost:3000" - ], - "callbacks": [ - "http://localhost:3000" - ], - "client_metadata": {}, - "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "expiring", - "leeway": 0, - "token_lifetime": 2592000, - "idle_token_lifetime": 1296000, - "infinite_token_lifetime": false, - "infinite_idle_token_lifetime": false, - "rotation_type": "rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "9ztJ1ZaM0iTa9eR2Ga08KOrwBNqNuRmr", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "client_aliases": [], - "token_endpoint_auth_method": "none", - "app_type": "spa", - "grant_types": [ - "authorization_code", - "implicit", - "refresh_token" - ], - "web_origins": [ - "http://localhost:3000" - ], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "auth0-deploy-cli-extension", - "allowed_clients": [], - "callbacks": [], - "client_metadata": {}, - "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ + "cert": "[REDACTED]", + "pkcs7": "[REDACTED]", + "subject": "/CN=auth0-deploy-cli-e2e.us.auth0.com" + } + ], + "client_id": "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V", + "callback_url_template": false, + "client_secret": "[REDACTED]", + "jwt_configuration": { + "alg": "RS256", + "lifetime_in_seconds": 36000, + "secret_encoded": false + }, + "grant_types": [ + "authorization_code", + "implicit", + "refresh_token", + "client_credentials" + ], + "custom_login_page_on": true + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "PUT", + "path": "/api/v2/guardian/factors/duo", + "body": { + "enabled": false + }, + "status": 200, + "response": { + "enabled": false + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "PUT", + "path": "/api/v2/guardian/factors/email", + "body": { + "enabled": false + }, + "status": 200, + "response": { + "enabled": false + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "PUT", + "path": "/api/v2/guardian/factors/recovery-code", + "body": { + "enabled": false + }, + "status": 200, + "response": { + "enabled": false + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "PUT", + "path": "/api/v2/guardian/factors/sms", + "body": { + "enabled": false + }, + "status": 200, + "response": { + "enabled": false + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "PUT", + "path": "/api/v2/guardian/factors/otp", + "body": { + "enabled": false + }, + "status": 200, + "response": { + "enabled": false + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "PUT", + "path": "/api/v2/guardian/factors/webauthn-roaming", + "body": { + "enabled": false + }, + "status": 200, + "response": { + "enabled": false + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "PUT", + "path": "/api/v2/guardian/factors/push-notification", + "body": { + "enabled": false + }, + "status": 200, + "response": { + "enabled": false + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "PUT", + "path": "/api/v2/guardian/factors/webauthn-platform", + "body": { + "enabled": false + }, + "status": 200, + "response": { + "enabled": false + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "PUT", + "path": "/api/v2/guardian/factors/sms/templates", + "body": { + "enrollment_message": "enroll foo", + "verification_message": "verify foo" + }, + "status": 200, + "response": { + "enrollment_message": "enroll foo", + "verification_message": "verify foo" + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "PUT", + "path": "/api/v2/guardian/policies", + "body": [], + "status": 200, + "response": [], + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "PUT", + "path": "/api/v2/guardian/factors/phone/selected-provider", + "body": { + "provider": "auth0" + }, + "status": 200, + "response": { + "provider": "auth0" + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "PUT", + "path": "/api/v2/guardian/factors/phone/message-types", + "body": { + "message_types": [] + }, + "status": 200, + "response": { + "message_types": [] + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "PATCH", + "path": "/api/v2/prompts", + "body": { + "identifier_first": true, + "universal_login_experience": "new" + }, + "status": 200, + "response": { + "universal_login_experience": "new", + "identifier_first": true + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/actions/actions?page=0&per_page=100", + "body": "", + "status": 200, + "response": { + "actions": [ + { + "id": "ead7d2a3-5a93-43e2-9ec3-455f3c39daf9", + "name": "Custom Phone Provider", + "supported_triggers": [ { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" + "id": "custom-phone-provider", + "version": "v1" } ], - "client_id": "8DngHjTrjB57cRXo74zYn4qohnAxjFsG", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false + "created_at": "2025-12-16T10:10:30.752146844Z", + "updated_at": "2025-12-16T10:10:40.768168491Z", + "code": "/**\n* Handler to be executed while sending a phone notification\n* @param {Event} event - Details about the user and the context in which they are logging in.\n* @param {CustomPhoneProviderAPI} api - Methods and utilities to help change the behavior of sending a phone notification.\n*/\nexports.onExecuteCustomPhoneProvider = async (event, api) => {\n // Code goes here\n return;\n};", + "dependencies": [], + "runtime": "node22", + "status": "built", + "secrets": [], + "current_version": { + "id": "07db7147-9c58-45ac-ad9b-07d88303a9fc", + "code": "/**\n* Handler to be executed while sending a phone notification\n* @param {Event} event - Details about the user and the context in which they are logging in.\n* @param {CustomPhoneProviderAPI} api - Methods and utilities to help change the behavior of sending a phone notification.\n*/\nexports.onExecuteCustomPhoneProvider = async (event, api) => {\n // Code goes here\n return;\n};", + "runtime": "node22", + "status": "BUILT", + "number": 1, + "build_time": "2025-12-16T10:10:41.915596370Z", + "created_at": "2025-12-16T10:10:41.831216643Z", + "updated_at": "2025-12-16T10:10:41.917804190Z" }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", - "grant_types": [ - "client_credentials" - ], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": true, - "callbacks": [], - "is_first_party": true, - "name": "All Applications", - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 2592000, - "idle_token_lifetime": 1296000, - "rotation_type": "non-rotating" + "deployed_version": { + "code": "/**\n* Handler to be executed while sending a phone notification\n* @param {Event} event - Details about the user and the context in which they are logging in.\n* @param {CustomPhoneProviderAPI} api - Methods and utilities to help change the behavior of sending a phone notification.\n*/\nexports.onExecuteCustomPhoneProvider = async (event, api) => {\n // Code goes here\n return;\n};", + "dependencies": [], + "id": "07db7147-9c58-45ac-ad9b-07d88303a9fc", + "deployed": true, + "number": 1, + "built_at": "2025-12-16T10:10:41.915596370Z", + "secrets": [], + "status": "built", + "created_at": "2025-12-16T10:10:41.831216643Z", + "updated_at": "2025-12-16T10:10:41.917804190Z", + "runtime": "node22", + "supported_triggers": [ + { + "id": "custom-phone-provider", + "version": "v1" + } + ] }, - "owners": [ - "mr|samlp|okta|will.vedder@auth0.com", - "mr|google-oauth2|102002633619863830825", - "mr|samlp|okta|frederik.prijck@auth0.com", - "mr|google-oauth2|109614534713742077035", - "mr|google-oauth2|116771660953104383819", - "mr|google-oauth2|112839029247827700155", - "mr|samlp|okta|ewan.harris@auth0.com" - ], - "custom_login_page": "TEST123\n", - "cross_origin_authentication": true, - "signing_keys": [ + "all_changes_deployed": true + } + ], + "total": 1, + "per_page": 100 + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "PATCH", + "path": "/api/v2/actions/actions/ead7d2a3-5a93-43e2-9ec3-455f3c39daf9", + "body": { + "name": "Custom Phone Provider", + "code": "/**\n* Handler to be executed while sending a phone notification\n* @param {Event} event - Details about the user and the context in which they are logging in.\n* @param {CustomPhoneProviderAPI} api - Methods and utilities to help change the behavior of sending a phone notification.\n*/\nexports.onExecuteCustomPhoneProvider = async (event, api) => {\n // Code goes here\n return;\n};", + "dependencies": [], + "runtime": "node22", + "secrets": [], + "supported_triggers": [ + { + "id": "custom-phone-provider", + "version": "v1" + } + ] + }, + "status": 200, + "response": { + "id": "ead7d2a3-5a93-43e2-9ec3-455f3c39daf9", + "name": "Custom Phone Provider", + "supported_triggers": [ + { + "id": "custom-phone-provider", + "version": "v1" + } + ], + "created_at": "2025-12-16T10:10:30.752146844Z", + "updated_at": "2025-12-16T10:11:36.910288525Z", + "code": "/**\n* Handler to be executed while sending a phone notification\n* @param {Event} event - Details about the user and the context in which they are logging in.\n* @param {CustomPhoneProviderAPI} api - Methods and utilities to help change the behavior of sending a phone notification.\n*/\nexports.onExecuteCustomPhoneProvider = async (event, api) => {\n // Code goes here\n return;\n};", + "dependencies": [], + "runtime": "node22", + "status": "pending", + "secrets": [], + "current_version": { + "id": "07db7147-9c58-45ac-ad9b-07d88303a9fc", + "code": "/**\n* Handler to be executed while sending a phone notification\n* @param {Event} event - Details about the user and the context in which they are logging in.\n* @param {CustomPhoneProviderAPI} api - Methods and utilities to help change the behavior of sending a phone notification.\n*/\nexports.onExecuteCustomPhoneProvider = async (event, api) => {\n // Code goes here\n return;\n};", + "runtime": "node22", + "status": "BUILT", + "number": 1, + "build_time": "2025-12-16T10:10:41.915596370Z", + "created_at": "2025-12-16T10:10:41.831216643Z", + "updated_at": "2025-12-16T10:10:41.917804190Z" + }, + "deployed_version": { + "code": "/**\n* Handler to be executed while sending a phone notification\n* @param {Event} event - Details about the user and the context in which they are logging in.\n* @param {CustomPhoneProviderAPI} api - Methods and utilities to help change the behavior of sending a phone notification.\n*/\nexports.onExecuteCustomPhoneProvider = async (event, api) => {\n // Code goes here\n return;\n};", + "dependencies": [], + "id": "07db7147-9c58-45ac-ad9b-07d88303a9fc", + "deployed": true, + "number": 1, + "built_at": "2025-12-16T10:10:41.915596370Z", + "secrets": [], + "status": "built", + "created_at": "2025-12-16T10:10:41.831216643Z", + "updated_at": "2025-12-16T10:10:41.917804190Z", + "runtime": "node22", + "supported_triggers": [ + { + "id": "custom-phone-provider", + "version": "v1" + } + ] + }, + "all_changes_deployed": true + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/actions/actions?page=0&per_page=100", + "body": "", + "status": 200, + "response": { + "actions": [ + { + "id": "ead7d2a3-5a93-43e2-9ec3-455f3c39daf9", + "name": "Custom Phone Provider", + "supported_triggers": [ { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" + "id": "custom-phone-provider", + "version": "v1" } ], - "client_id": "Isi93ibGHIGwmdYjsLwTOn7Gu7nwxU3V", - "client_secret": "[REDACTED]", - "custom_login_page_on": true + "created_at": "2025-12-16T10:10:30.752146844Z", + "updated_at": "2025-12-16T10:11:36.910288525Z", + "code": "/**\n* Handler to be executed while sending a phone notification\n* @param {Event} event - Details about the user and the context in which they are logging in.\n* @param {CustomPhoneProviderAPI} api - Methods and utilities to help change the behavior of sending a phone notification.\n*/\nexports.onExecuteCustomPhoneProvider = async (event, api) => {\n // Code goes here\n return;\n};", + "dependencies": [], + "runtime": "node22", + "status": "built", + "secrets": [], + "current_version": { + "id": "07db7147-9c58-45ac-ad9b-07d88303a9fc", + "code": "/**\n* Handler to be executed while sending a phone notification\n* @param {Event} event - Details about the user and the context in which they are logging in.\n* @param {CustomPhoneProviderAPI} api - Methods and utilities to help change the behavior of sending a phone notification.\n*/\nexports.onExecuteCustomPhoneProvider = async (event, api) => {\n // Code goes here\n return;\n};", + "runtime": "node22", + "status": "BUILT", + "number": 1, + "build_time": "2025-12-16T10:10:41.915596370Z", + "created_at": "2025-12-16T10:10:41.831216643Z", + "updated_at": "2025-12-16T10:10:41.917804190Z" + }, + "deployed_version": { + "code": "/**\n* Handler to be executed while sending a phone notification\n* @param {Event} event - Details about the user and the context in which they are logging in.\n* @param {CustomPhoneProviderAPI} api - Methods and utilities to help change the behavior of sending a phone notification.\n*/\nexports.onExecuteCustomPhoneProvider = async (event, api) => {\n // Code goes here\n return;\n};", + "dependencies": [], + "id": "07db7147-9c58-45ac-ad9b-07d88303a9fc", + "deployed": true, + "number": 1, + "built_at": "2025-12-16T10:10:41.915596370Z", + "secrets": [], + "status": "built", + "created_at": "2025-12-16T10:10:41.831216643Z", + "updated_at": "2025-12-16T10:10:41.917804190Z", + "runtime": "node22", + "supported_triggers": [ + { + "id": "custom-phone-provider", + "version": "v1" + } + ] + }, + "all_changes_deployed": true } - ] + ], + "total": 1, + "per_page": 100 + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "POST", + "path": "/api/v2/actions/actions/ead7d2a3-5a93-43e2-9ec3-455f3c39daf9/deploy", + "body": "", + "status": 200, + "response": { + "code": "/**\n* Handler to be executed while sending a phone notification\n* @param {Event} event - Details about the user and the context in which they are logging in.\n* @param {CustomPhoneProviderAPI} api - Methods and utilities to help change the behavior of sending a phone notification.\n*/\nexports.onExecuteCustomPhoneProvider = async (event, api) => {\n // Code goes here\n return;\n};", + "dependencies": [], + "id": "83a87aec-f6f7-42bb-b6ad-6fa170f652d1", + "deployed": false, + "number": 2, + "secrets": [], + "status": "built", + "created_at": "2025-12-16T10:11:37.627490560Z", + "updated_at": "2025-12-16T10:11:37.627490560Z", + "runtime": "node22", + "supported_triggers": [ + { + "id": "custom-phone-provider", + "version": "v1" + } + ], + "action": { + "id": "ead7d2a3-5a93-43e2-9ec3-455f3c39daf9", + "name": "Custom Phone Provider", + "supported_triggers": [ + { + "id": "custom-phone-provider", + "version": "v1" + } + ], + "created_at": "2025-12-16T10:10:30.752146844Z", + "updated_at": "2025-12-16T10:11:36.902340019Z", + "all_changes_deployed": false + } + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "PATCH", + "path": "/api/v2/attack-protection/bot-detection", + "body": { + "challenge_password_policy": "never", + "challenge_passwordless_policy": "never", + "challenge_password_reset_policy": "never", + "allowlist": [], + "bot_detection_level": "medium", + "monitoring_mode_enabled": false + }, + "status": 200, + "response": { + "challenge_password_policy": "never", + "challenge_passwordless_policy": "never", + "challenge_password_reset_policy": "never", + "allowlist": [], + "bot_detection_level": "medium", + "monitoring_mode_enabled": false + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "PATCH", + "path": "/api/v2/attack-protection/captcha", + "body": { + "active_provider_id": "auth_challenge", + "auth_challenge": { + "fail_open": false + } + }, + "status": 200, + "response": { + "active_provider_id": "auth_challenge", + "simple_captcha": {}, + "auth_challenge": { + "fail_open": false + }, + "recaptcha_v2": { + "site_key": "" + }, + "recaptcha_enterprise": { + "site_key": "", + "project_id": "" + }, + "hcaptcha": { + "site_key": "" + }, + "friendly_captcha": { + "site_key": "" + }, + "arkose": { + "site_key": "", + "client_subdomain": "client-api", + "verify_subdomain": "verify-api", + "fail_open": false + } }, "rawHeaders": [], "responseIsBinary": false }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/connections?include_totals=true", - "body": "", + "method": "PATCH", + "path": "/api/v2/attack-protection/suspicious-ip-throttling", + "body": { + "enabled": true, + "shields": [ + "admin_notification", + "block" + ], + "allowlist": [], + "stage": { + "pre-login": { + "max_attempts": 100, + "rate": 864000 + }, + "pre-user-registration": { + "max_attempts": 50, + "rate": 1200 + }, + "pre-custom-token-exchange": { + "max_attempts": 10, + "rate": 600000 + } + } + }, "status": 200, "response": { - "total": 1, - "start": 0, - "limit": 50, - "connections": [ - { - "id": "con_K6JOwBbKFCexaEHM", - "options": { - "email": true, - "scope": [ - "email", - "profile" - ], - "profile": true - }, - "strategy": "google-oauth2", - "name": "google-oauth2", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "google-oauth2" - ], - "enabled_clients": [] + "enabled": true, + "shields": [ + "admin_notification", + "block" + ], + "allowlist": [], + "stage": { + "pre-login": { + "max_attempts": 100, + "rate": 864000 + }, + "pre-user-registration": { + "max_attempts": 50, + "rate": 1200 + }, + "pre-custom-token-exchange": { + "max_attempts": 10, + "rate": 600000 } - ] + } }, "rawHeaders": [], "responseIsBinary": false }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/connections?include_totals=true&take=50", - "body": "", + "method": "PATCH", + "path": "/api/v2/attack-protection/breached-password-detection", + "body": { + "enabled": false, + "shields": [], + "admin_notification_frequency": [], + "method": "standard", + "stage": { + "pre-user-registration": { + "shields": [] + }, + "pre-change-password": { + "shields": [] + } + } + }, "status": 200, "response": { - "connections": [ - { - "id": "con_K6JOwBbKFCexaEHM", - "options": { - "email": true, - "scope": [ - "email", - "profile" - ], - "profile": true - }, - "strategy": "google-oauth2", - "name": "google-oauth2", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "google-oauth2" - ], - "enabled_clients": [] + "enabled": false, + "shields": [], + "admin_notification_frequency": [], + "method": "standard", + "stage": { + "pre-user-registration": { + "shields": [] + }, + "pre-change-password": { + "shields": [] } - ] + } }, "rawHeaders": [], "responseIsBinary": false }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/connections?include_totals=true", - "body": "", + "method": "PATCH", + "path": "/api/v2/attack-protection/brute-force-protection", + "body": { + "enabled": true, + "shields": [ + "block", + "user_notification" + ], + "mode": "count_per_identifier_and_ip", + "allowlist": [], + "max_attempts": 10 + }, "status": 200, "response": { - "total": 1, - "start": 0, - "limit": 50, - "connections": [ - { - "id": "con_K6JOwBbKFCexaEHM", - "options": { - "email": true, - "scope": [ - "email", - "profile" - ], - "profile": true - }, - "strategy": "google-oauth2", - "name": "google-oauth2", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "google-oauth2" - ], - "enabled_clients": [] - } - ] + "enabled": true, + "shields": [ + "block", + "user_notification" + ], + "mode": "count_per_identifier_and_ip", + "allowlist": [], + "max_attempts": 10 }, "rawHeaders": [], "responseIsBinary": false @@ -8974,48 +5945,44 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections?include_totals=true&take=50", + "path": "/api/v2/custom-domains", "body": "", "status": 200, - "response": { - "connections": [ - { - "id": "con_K6JOwBbKFCexaEHM", - "options": { - "email": true, - "scope": [ - "email", - "profile" - ], - "profile": true - }, - "strategy": "google-oauth2", - "name": "google-oauth2", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "google-oauth2" - ], - "enabled_clients": [] - } - ] - }, + "response": [], "rawHeaders": [], "responseIsBinary": false }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections/con_K6JOwBbKFCexaEHM/clients?take=50", + "path": "/api/v2/network-acls?page=0&per_page=100&include_totals=true", "body": "", "status": 200, "response": { - "clients": [] + "total": 1, + "start": 0, + "limit": 100, + "network_acls": [ + { + "description": "Allow Specific Countries", + "active": false, + "priority": 1, + "rule": { + "match": { + "geo_country_codes": [ + "US" + ] + }, + "scope": "authentication", + "action": { + "allow": true + } + }, + "created_at": "2025-09-09T04:41:43.671Z", + "updated_at": "2025-12-16T10:09:43.241Z", + "id": "acl_wpZ6oScRU5L6QKAxMUMHmx" + } + ] }, "rawHeaders": [], "responseIsBinary": false @@ -9023,49 +5990,42 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PATCH", - "path": "/api/v2/connections/con_K6JOwBbKFCexaEHM", + "path": "/api/v2/network-acls/acl_wpZ6oScRU5L6QKAxMUMHmx", "body": { - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "enabled_clients": [], - "is_domain_connection": false, - "options": { - "email": true, - "scope": [ - "email", - "profile" - ], - "profile": true - } - }, - "status": 200, - "response": { - "id": "con_K6JOwBbKFCexaEHM", - "options": { - "email": true, - "scope": [ - "email", - "profile" - ], - "profile": true - }, - "strategy": "google-oauth2", - "name": "google-oauth2", - "is_domain_connection": false, - "authentication": { - "active": true + "priority": 1, + "rule": { + "match": { + "geo_country_codes": [ + "US" + ] + }, + "scope": "authentication", + "action": { + "allow": true + } }, - "connected_accounts": { - "active": false + "active": false, + "description": "Allow Specific Countries" + }, + "status": 200, + "response": { + "description": "Allow Specific Countries", + "active": false, + "priority": 1, + "rule": { + "match": { + "geo_country_codes": [ + "US" + ] + }, + "scope": "authentication", + "action": { + "allow": true + } }, - "enabled_clients": [], - "realms": [ - "google-oauth2" - ] + "created_at": "2025-09-09T04:41:43.671Z", + "updated_at": "2025-12-16T10:11:39.157Z", + "id": "acl_wpZ6oScRU5L6QKAxMUMHmx" }, "rawHeaders": [], "responseIsBinary": false @@ -9073,14 +6033,54 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/emails/provider?fields=name%2Cenabled%2Ccredentials%2Csettings%2Cdefault_from_address&include_fields=true", + "path": "/api/v2/user-attribute-profiles?take=10", "body": "", "status": 200, "response": { - "name": "mandrill", - "credentials": {}, - "default_from_address": "auth0-user@auth0.com", - "enabled": false + "user_attribute_profiles": [ + { + "id": "uap_1csDj3szFsgxGS1oTZTdFm", + "name": "test-user-attribute-profile-2", + "user_id": { + "oidc_mapping": "sub", + "saml_mapping": [ + "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier", + "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn", + "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name" + ], + "scim_mapping": "externalId" + }, + "user_attributes": { + "email": { + "label": "Email", + "description": "Email of the User", + "auth0_mapping": "email", + "profile_required": true + } + } + }, + { + "id": "uap_1csDj3sAVu6n5eTzLw6XZg", + "name": "test-user-attribute-profile", + "user_id": { + "oidc_mapping": "sub", + "saml_mapping": [ + "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier", + "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn", + "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name" + ], + "scim_mapping": "externalId" + }, + "user_attributes": { + "email": { + "label": "Email", + "description": "Email of the User", + "auth0_mapping": "email", + "profile_required": true + } + } + } + ] }, "rawHeaders": [], "responseIsBinary": false @@ -9088,207 +6088,133 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PATCH", - "path": "/api/v2/emails/provider", + "path": "/api/v2/user-attribute-profiles/uap_1csDj3szFsgxGS1oTZTdFm", "body": { - "name": "mandrill", - "credentials": { - "api_key": "##MANDRILL_API_KEY##" + "name": "test-user-attribute-profile-2", + "user_attributes": { + "email": { + "label": "Email", + "description": "Email of the User", + "auth0_mapping": "email", + "profile_required": true + } }, - "default_from_address": "auth0-user@auth0.com", - "enabled": false + "user_id": { + "oidc_mapping": "sub", + "saml_mapping": [ + "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier", + "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn", + "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name" + ], + "scim_mapping": "externalId" + } }, "status": 200, "response": { - "name": "mandrill", - "credentials": {}, - "default_from_address": "auth0-user@auth0.com", - "enabled": false + "id": "uap_1csDj3szFsgxGS1oTZTdFm", + "name": "test-user-attribute-profile-2", + "user_id": { + "oidc_mapping": "sub", + "saml_mapping": [ + "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier", + "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn", + "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name" + ], + "scim_mapping": "externalId" + }, + "user_attributes": { + "email": { + "label": "Email", + "description": "Email of the User", + "auth0_mapping": "email", + "profile_required": true + } + } }, "rawHeaders": [], "responseIsBinary": false }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/clients?page=0&per_page=100&include_totals=true", - "body": "", - "status": 200, - "response": { - "total": 9, - "start": 0, - "limit": 100, - "clients": [ - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Deploy CLI", - "is_first_party": true, - "oidc_conformant": true, - "sso_disabled": false, - "cross_origin_auth": false, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, - "cross_origin_authentication": true, - "allowed_clients": [], - "callbacks": [], - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", - "grant_types": [ - "client_credentials", - "implicit", - "authorization_code", - "refresh_token" - ], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "API Explorer Application", - "allowed_clients": [], - "callbacks": [], - "client_metadata": {}, - "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "vVbUuOLzLQ9k7iwdZoLRtQuhG8XHUkSY", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", - "grant_types": [ - "client_credentials" - ], - "custom_login_page_on": true - }, + "method": "PATCH", + "path": "/api/v2/user-attribute-profiles/uap_1csDj3sAVu6n5eTzLw6XZg", + "body": { + "name": "test-user-attribute-profile", + "user_attributes": { + "email": { + "label": "Email", + "description": "Email of the User", + "auth0_mapping": "email", + "profile_required": true + } + }, + "user_id": { + "oidc_mapping": "sub", + "saml_mapping": [ + "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier", + "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn", + "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name" + ], + "scim_mapping": "externalId" + } + }, + "status": 200, + "response": { + "id": "uap_1csDj3sAVu6n5eTzLw6XZg", + "name": "test-user-attribute-profile", + "user_id": { + "oidc_mapping": "sub", + "saml_mapping": [ + "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier", + "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn", + "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name" + ], + "scim_mapping": "externalId" + }, + "user_attributes": { + "email": { + "label": "Email", + "description": "Email of the User", + "auth0_mapping": "email", + "profile_required": true + } + } + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/connection-profiles?take=10", + "body": "", + "status": 200, + "response": { + "connection_profiles": [] + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/clients?page=0&per_page=100&include_totals=true", + "body": "", + "status": 200, + "response": { + "total": 3, + "start": 0, + "limit": 100, + "clients": [ { "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "Quickstarts API (Test Application)", - "client_metadata": { - "foo": "bar" - }, + "name": "Deploy CLI", "is_first_party": true, "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, "sso_disabled": false, - "cross_origin_authentication": false, "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "O0AMH5MORoUOkQ8g31aPVmBZ11jyApI5", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", - "grant_types": [ - "client_credentials" - ], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Node App", - "allowed_clients": [], - "allowed_logout_urls": [], - "callbacks": [], - "client_metadata": {}, - "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "oidc_conformant": true, "refresh_token": { "expiration_type": "non-expiring", "leeway": 0, @@ -9298,46 +6224,9 @@ "idle_token_lifetime": 2592000, "rotation_type": "non-rotating" }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "allowed_origins": [], - "client_id": "88gPebiknBTdBHOAYrSdF2WWRyuroAax", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "regular_web", - "grant_types": [ - "authorization_code", - "implicit", - "refresh_token", - "client_credentials" - ], - "web_origins": [], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "The Default App", + "cross_origin_authentication": true, "allowed_clients": [], "callbacks": [], - "client_metadata": {}, - "is_first_party": true, "native_social_login": { "apple": { "enabled": false @@ -9346,20 +6235,6 @@ "enabled": false } }, - "oidc_conformant": false, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 2592000, - "idle_token_lifetime": 1296000, - "rotation_type": "non-rotating" - }, - "sso": false, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, "signing_keys": [ { "cert": "[REDACTED]", @@ -9367,7 +6242,7 @@ "subject": "deprecated" } ], - "client_id": "7vlUKQihTlaGoILrgQ51JW4xMbU1XhI0", + "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -9377,143 +6252,30 @@ }, "client_aliases": [], "token_endpoint_auth_method": "client_secret_post", - "grant_types": [ - "authorization_code", - "implicit", - "refresh_token", - "client_credentials" - ], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Terraform Provider", - "is_first_party": true, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "R9N1M3jJcxlEKpIcm4EX8glA7Krb9h1k", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "token_endpoint_auth_method": "client_secret_post", "app_type": "non_interactive", "grant_types": [ - "client_credentials" - ], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Test SPA", - "allowed_clients": [], - "allowed_logout_urls": [ - "http://localhost:3000" - ], - "callbacks": [ - "http://localhost:3000" - ], - "client_metadata": {}, - "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "expiring", - "leeway": 0, - "token_lifetime": 2592000, - "idle_token_lifetime": 1296000, - "infinite_token_lifetime": false, - "infinite_idle_token_lifetime": false, - "rotation_type": "rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "9ztJ1ZaM0iTa9eR2Ga08KOrwBNqNuRmr", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "client_aliases": [], - "token_endpoint_auth_method": "none", - "app_type": "spa", - "grant_types": [ - "authorization_code", + "client_credentials", "implicit", + "authorization_code", "refresh_token" ], - "web_origins": [ - "http://localhost:3000" - ], "custom_login_page_on": true }, { "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "auth0-deploy-cli-extension", - "allowed_clients": [], + "name": "Default App", "callbacks": [], - "client_metadata": {}, "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, "oidc_conformant": true, "refresh_token": { "expiration_type": "non-expiring", "leeway": 0, "infinite_token_lifetime": true, "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, + "token_lifetime": 2592000, + "idle_token_lifetime": 1296000, "rotation_type": "non-rotating" }, "sso_disabled": false, @@ -9526,18 +6288,18 @@ "subject": "deprecated" } ], - "client_id": "8DngHjTrjB57cRXo74zYn4qohnAxjFsG", + "client_id": "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { "alg": "RS256", "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", + "secret_encoded": false + }, "grant_types": [ + "authorization_code", + "implicit", + "refresh_token", "client_credentials" ], "custom_login_page_on": true @@ -9577,258 +6339,7 @@ ], "client_id": "Isi93ibGHIGwmdYjsLwTOn7Gu7nwxU3V", "client_secret": "[REDACTED]", - "custom_login_page_on": true - } - ] - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/client-grants?per_page=100&page=0&include_totals=true", - "body": "", - "status": 200, - "response": { - "total": 1, - "start": 0, - "limit": 100, - "client_grants": [ - { - "id": "cgr_pbwejzhwoujrsNE8", - "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", - "audience": "https://auth0-deploy-cli-e2e.us.auth0.com/api/v2/", - "scope": [ - "read:client_grants", - "create:client_grants", - "delete:client_grants", - "update:client_grants", - "read:users", - "update:users", - "delete:users", - "create:users", - "read:users_app_metadata", - "update:users_app_metadata", - "delete:users_app_metadata", - "create:users_app_metadata", - "read:user_custom_blocks", - "create:user_custom_blocks", - "delete:user_custom_blocks", - "create:user_tickets", - "read:clients", - "update:clients", - "delete:clients", - "create:clients", - "read:client_keys", - "update:client_keys", - "delete:client_keys", - "create:client_keys", - "read:client_credentials", - "update:client_credentials", - "delete:client_credentials", - "create:client_credentials", - "read:connections", - "update:connections", - "delete:connections", - "create:connections", - "read:resource_servers", - "update:resource_servers", - "delete:resource_servers", - "create:resource_servers", - "read:device_credentials", - "update:device_credentials", - "delete:device_credentials", - "create:device_credentials", - "read:rules", - "update:rules", - "delete:rules", - "create:rules", - "read:rules_configs", - "update:rules_configs", - "delete:rules_configs", - "read:hooks", - "update:hooks", - "delete:hooks", - "create:hooks", - "read:actions", - "update:actions", - "delete:actions", - "create:actions", - "read:email_provider", - "update:email_provider", - "delete:email_provider", - "create:email_provider", - "blacklist:tokens", - "read:stats", - "read:insights", - "read:tenant_settings", - "update:tenant_settings", - "read:logs", - "read:logs_users", - "read:shields", - "create:shields", - "update:shields", - "delete:shields", - "read:anomaly_blocks", - "delete:anomaly_blocks", - "update:triggers", - "read:triggers", - "read:grants", - "delete:grants", - "read:guardian_factors", - "update:guardian_factors", - "read:guardian_enrollments", - "delete:guardian_enrollments", - "create:guardian_enrollment_tickets", - "read:user_idp_tokens", - "create:passwords_checking_job", - "delete:passwords_checking_job", - "read:custom_domains", - "delete:custom_domains", - "create:custom_domains", - "update:custom_domains", - "read:email_templates", - "create:email_templates", - "update:email_templates", - "read:mfa_policies", - "update:mfa_policies", - "read:roles", - "create:roles", - "delete:roles", - "update:roles", - "read:prompts", - "update:prompts", - "read:branding", - "update:branding", - "delete:branding", - "read:log_streams", - "create:log_streams", - "delete:log_streams", - "update:log_streams", - "create:signing_keys", - "read:signing_keys", - "update:signing_keys", - "read:limits", - "update:limits", - "create:role_members", - "read:role_members", - "delete:role_members", - "read:entitlements", - "read:attack_protection", - "update:attack_protection", - "read:organizations_summary", - "create:authentication_methods", - "read:authentication_methods", - "update:authentication_methods", - "delete:authentication_methods", - "read:organizations", - "update:organizations", - "create:organizations", - "delete:organizations", - "read:organization_discovery_domains", - "update:organization_discovery_domains", - "create:organization_discovery_domains", - "delete:organization_discovery_domains", - "create:organization_members", - "read:organization_members", - "delete:organization_members", - "create:organization_connections", - "read:organization_connections", - "update:organization_connections", - "delete:organization_connections", - "create:organization_member_roles", - "read:organization_member_roles", - "delete:organization_member_roles", - "create:organization_invitations", - "read:organization_invitations", - "delete:organization_invitations", - "read:scim_config", - "create:scim_config", - "update:scim_config", - "delete:scim_config", - "create:scim_token", - "read:scim_token", - "delete:scim_token", - "delete:phone_providers", - "create:phone_providers", - "read:phone_providers", - "update:phone_providers", - "delete:phone_templates", - "create:phone_templates", - "read:phone_templates", - "update:phone_templates", - "create:encryption_keys", - "read:encryption_keys", - "update:encryption_keys", - "delete:encryption_keys", - "read:sessions", - "update:sessions", - "delete:sessions", - "read:refresh_tokens", - "delete:refresh_tokens", - "create:self_service_profiles", - "read:self_service_profiles", - "update:self_service_profiles", - "delete:self_service_profiles", - "create:sso_access_tickets", - "delete:sso_access_tickets", - "read:forms", - "update:forms", - "delete:forms", - "create:forms", - "read:flows", - "update:flows", - "delete:flows", - "create:flows", - "read:flows_vault", - "read:flows_vault_connections", - "update:flows_vault_connections", - "delete:flows_vault_connections", - "create:flows_vault_connections", - "read:flows_executions", - "delete:flows_executions", - "read:connections_options", - "update:connections_options", - "read:self_service_profile_custom_texts", - "update:self_service_profile_custom_texts", - "create:network_acls", - "update:network_acls", - "read:network_acls", - "delete:network_acls", - "delete:vdcs_templates", - "read:vdcs_templates", - "create:vdcs_templates", - "update:vdcs_templates", - "create:custom_signing_keys", - "read:custom_signing_keys", - "update:custom_signing_keys", - "delete:custom_signing_keys", - "read:federated_connections_tokens", - "delete:federated_connections_tokens", - "create:user_attribute_profiles", - "read:user_attribute_profiles", - "update:user_attribute_profiles", - "delete:user_attribute_profiles", - "read:event_streams", - "create:event_streams", - "delete:event_streams", - "update:event_streams", - "read:event_deliveries", - "update:event_deliveries", - "create:connection_profiles", - "read:connection_profiles", - "update:connection_profiles", - "delete:connection_profiles", - "read:organization_client_grants", - "create:organization_client_grants", - "delete:organization_client_grants", - "read:security_metrics", - "read:connections_keys", - "update:connections_keys", - "create:connections_keys" - ], - "subject_type": "client" + "custom_login_page_on": true } ] }, @@ -9838,80 +6349,54 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/roles?per_page=100&page=0&include_totals=true", + "path": "/api/v2/connections?take=50&strategy=auth0", "body": "", "status": 200, "response": { - "roles": [ - { - "id": "rol_jVbPH8r1ZIGS2gXN", - "name": "Admin", - "description": "Can read and write things" - }, - { - "id": "rol_xWADOPL9iJP4nUdr", - "name": "Reader", - "description": "Can only read things" - }, - { - "id": "rol_Iu8aIRwIrZ7Zk2Bz", - "name": "read_only", - "description": "Read Only" - }, + "connections": [ { - "id": "rol_hjHjIWbcLZccpcmF", - "name": "read_osnly", - "description": "Readz Only" + "id": "con_3R2lX4rln4ArocW5", + "options": { + "mfa": { + "active": true, + "return_enroll_settings": true + }, + "passwordPolicy": "good", + "passkey_options": { + "challenge_ui": "both", + "local_enrollment_enabled": true, + "progressive_enrollment_enabled": true + }, + "strategy_version": 2, + "authentication_methods": { + "passkey": { + "enabled": false + }, + "password": { + "enabled": true, + "api_behavior": "required" + } + }, + "brute_force_protection": true + }, + "strategy": "auth0", + "name": "Username-Password-Authentication", + "is_domain_connection": false, + "authentication": { + "active": true + }, + "connected_accounts": { + "active": false + }, + "realms": [ + "Username-Password-Authentication" + ], + "enabled_clients": [ + "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", + "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" + ] } - ], - "start": 0, - "limit": 100, - "total": 4 - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/roles/rol_jVbPH8r1ZIGS2gXN/permissions?per_page=100&page=0&include_totals=true", - "body": "", - "status": 200, - "response": { - "permissions": [], - "start": 0, - "limit": 100, - "total": 0 - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/roles/rol_xWADOPL9iJP4nUdr/permissions?per_page=100&page=0&include_totals=true", - "body": "", - "status": 200, - "response": { - "permissions": [], - "start": 0, - "limit": 100, - "total": 0 - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/roles/rol_Iu8aIRwIrZ7Zk2Bz/permissions?per_page=100&page=0&include_totals=true", - "body": "", - "status": 200, - "response": { - "permissions": [], - "start": 0, - "limit": 100, - "total": 0 + ] }, "rawHeaders": [], "responseIsBinary": false @@ -9919,82 +6404,54 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/roles/rol_hjHjIWbcLZccpcmF/permissions?per_page=100&page=0&include_totals=true", + "path": "/api/v2/connections?take=50&strategy=auth0", "body": "", "status": 200, "response": { - "permissions": [], - "start": 0, - "limit": 100, - "total": 0 - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "PATCH", - "path": "/api/v2/roles/rol_jVbPH8r1ZIGS2gXN", - "body": { - "name": "Admin", - "description": "Can read and write things" - }, - "status": 200, - "response": { - "id": "rol_jVbPH8r1ZIGS2gXN", - "name": "Admin", - "description": "Can read and write things" - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "PATCH", - "path": "/api/v2/roles/rol_Iu8aIRwIrZ7Zk2Bz", - "body": { - "name": "read_only", - "description": "Read Only" - }, - "status": 200, - "response": { - "id": "rol_Iu8aIRwIrZ7Zk2Bz", - "name": "read_only", - "description": "Read Only" - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "PATCH", - "path": "/api/v2/roles/rol_xWADOPL9iJP4nUdr", - "body": { - "name": "Reader", - "description": "Can only read things" - }, - "status": 200, - "response": { - "id": "rol_xWADOPL9iJP4nUdr", - "name": "Reader", - "description": "Can only read things" - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "PATCH", - "path": "/api/v2/roles/rol_hjHjIWbcLZccpcmF", - "body": { - "name": "read_osnly", - "description": "Readz Only" - }, - "status": 200, - "response": { - "id": "rol_hjHjIWbcLZccpcmF", - "name": "read_osnly", - "description": "Readz Only" + "connections": [ + { + "id": "con_3R2lX4rln4ArocW5", + "options": { + "mfa": { + "active": true, + "return_enroll_settings": true + }, + "passwordPolicy": "good", + "passkey_options": { + "challenge_ui": "both", + "local_enrollment_enabled": true, + "progressive_enrollment_enabled": true + }, + "strategy_version": 2, + "authentication_methods": { + "passkey": { + "enabled": false + }, + "password": { + "enabled": true, + "api_behavior": "required" + } + }, + "brute_force_protection": true + }, + "strategy": "auth0", + "name": "Username-Password-Authentication", + "is_domain_connection": false, + "authentication": { + "active": true + }, + "connected_accounts": { + "active": false + }, + "realms": [ + "Username-Password-Authentication" + ], + "enabled_clients": [ + "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", + "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" + ] + } + ] }, "rawHeaders": [], "responseIsBinary": false @@ -10002,43 +6459,18 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/self-service-profiles?page=0&per_page=100&include_totals=true", + "path": "/api/v2/connections/con_3R2lX4rln4ArocW5/clients?take=50", "body": "", "status": 200, "response": { - "self_service_profiles": [ + "clients": [ { - "id": "ssp_f6qt3syGauLKbSgt6GRLim", - "name": "self-service-profile-1", - "description": "test description self-service-profile-1", - "user_attributes": [ - { - "name": "email", - "description": "Email of the User", - "is_optional": false - }, - { - "name": "name", - "description": "Name of the User", - "is_optional": true - } - ], - "allowed_strategies": [ - "google-apps", - "okta" - ], - "created_at": "2024-11-26T11:58:18.962Z", - "updated_at": "2025-12-04T10:12:26.568Z", - "branding": { - "colors": { - "primary": "#19aecc" - } - } + "client_id": "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" + }, + { + "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE" } - ], - "start": 0, - "limit": 100, - "total": 1 + ] }, "rawHeaders": [], "responseIsBinary": false @@ -10046,98 +6478,69 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/self-service-profiles/ssp_f6qt3syGauLKbSgt6GRLim/custom-text/en/get-started", + "path": "/api/v2/connections/con_3R2lX4rln4ArocW5/clients?take=50", "body": "", "status": 200, - "response": {}, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "PATCH", - "path": "/api/v2/self-service-profiles/ssp_f6qt3syGauLKbSgt6GRLim", - "body": { - "name": "self-service-profile-1", - "allowed_strategies": [ - "google-apps", - "okta" - ], - "branding": { - "colors": { - "primary": "#19aecc" - } - }, - "description": "test description self-service-profile-1", - "user_attributes": [ - { - "name": "email", - "description": "Email of the User", - "is_optional": false - }, - { - "name": "name", - "description": "Name of the User", - "is_optional": true - } - ] - }, - "status": 200, "response": { - "id": "ssp_f6qt3syGauLKbSgt6GRLim", - "name": "self-service-profile-1", - "description": "test description self-service-profile-1", - "user_attributes": [ + "clients": [ { - "name": "email", - "description": "Email of the User", - "is_optional": false + "client_id": "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" }, { - "name": "name", - "description": "Name of the User", - "is_optional": true - } - ], - "allowed_strategies": [ - "google-apps", - "okta" - ], - "created_at": "2024-11-26T11:58:18.962Z", - "updated_at": "2025-12-04T10:20:43.979Z", - "branding": { - "colors": { - "primary": "#19aecc" + "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE" } - } + ] }, "rawHeaders": [], "responseIsBinary": false }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "PATCH", - "path": "/api/v2/email-templates/welcome_email", - "body": { - "template": "welcome_email", - "body": "\n \n

Welcome!

\n \n\n", - "enabled": false, - "from": "", - "resultUrl": "https://example.com/welcome", - "subject": "Welcome", - "syntax": "liquid", - "urlLifetimeInSeconds": 3600 - }, + "method": "GET", + "path": "/api/v2/connections/con_3R2lX4rln4ArocW5", + "body": "", "status": 200, "response": { - "template": "welcome_email", - "body": "\n \n

Welcome!

\n \n\n", - "from": "", - "resultUrl": "https://example.com/welcome", - "subject": "Welcome", - "syntax": "liquid", - "urlLifetimeInSeconds": 3600, - "enabled": false + "id": "con_3R2lX4rln4ArocW5", + "options": { + "mfa": { + "active": true, + "return_enroll_settings": true + }, + "passwordPolicy": "good", + "passkey_options": { + "challenge_ui": "both", + "local_enrollment_enabled": true, + "progressive_enrollment_enabled": true + }, + "strategy_version": 2, + "authentication_methods": { + "passkey": { + "enabled": false + }, + "password": { + "enabled": true, + "api_behavior": "required" + } + }, + "brute_force_protection": true + }, + "strategy": "auth0", + "name": "Username-Password-Authentication", + "is_domain_connection": false, + "authentication": { + "active": true + }, + "connected_accounts": { + "active": false + }, + "enabled_clients": [ + "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", + "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" + ], + "realms": [ + "Username-Password-Authentication" + ] }, "rawHeaders": [], "responseIsBinary": false @@ -10145,25 +6548,88 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PATCH", - "path": "/api/v2/email-templates/verify_email", + "path": "/api/v2/connections/con_3R2lX4rln4ArocW5", "body": { - "template": "verify_email", - "body": "\n \n \n \n \n
\n \n \n \n
\n \n \n

\n\n

Welcome to {{ application.name}}!

\n\n

\n Thank you for signing up. Please verify your email address by clicking the following\n link:\n

\n\n

Confirm my account

\n\n

\n If you are having any issues with your account, please don’t hesitate to contact us\n by replying to this mail.\n

\n\n
\n Haha!!!\n
\n\n {{ application.name }}\n\n

\n
\n \n If you did not make this request, please contact us by replying to this mail.\n

\n
\n \n \n \n
\n \n\n", - "enabled": true, - "from": "", - "subject": "", - "syntax": "liquid", - "urlLifetimeInSeconds": 432000 + "authentication": { + "active": true + }, + "connected_accounts": { + "active": false + }, + "enabled_clients": [ + "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", + "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" + ], + "is_domain_connection": false, + "options": { + "mfa": { + "active": true, + "return_enroll_settings": true + }, + "passwordPolicy": "good", + "passkey_options": { + "challenge_ui": "both", + "local_enrollment_enabled": true, + "progressive_enrollment_enabled": true + }, + "strategy_version": 2, + "authentication_methods": { + "passkey": { + "enabled": false + }, + "password": { + "enabled": true, + "api_behavior": "required" + } + }, + "brute_force_protection": true + }, + "realms": [ + "Username-Password-Authentication" + ] }, "status": 200, "response": { - "template": "verify_email", - "body": "\n \n \n \n \n
\n \n \n \n
\n \n \n

\n\n

Welcome to {{ application.name}}!

\n\n

\n Thank you for signing up. Please verify your email address by clicking the following\n link:\n

\n\n

Confirm my account

\n\n

\n If you are having any issues with your account, please don’t hesitate to contact us\n by replying to this mail.\n

\n\n
\n Haha!!!\n
\n\n {{ application.name }}\n\n

\n
\n \n If you did not make this request, please contact us by replying to this mail.\n

\n
\n \n \n \n
\n \n\n", - "from": "", - "subject": "", - "syntax": "liquid", - "urlLifetimeInSeconds": 432000, - "enabled": true + "id": "con_3R2lX4rln4ArocW5", + "options": { + "mfa": { + "active": true, + "return_enroll_settings": true + }, + "passwordPolicy": "good", + "passkey_options": { + "challenge_ui": "both", + "local_enrollment_enabled": true, + "progressive_enrollment_enabled": true + }, + "strategy_version": 2, + "authentication_methods": { + "passkey": { + "enabled": false + }, + "password": { + "enabled": true, + "api_behavior": "required" + } + }, + "brute_force_protection": true + }, + "strategy": "auth0", + "name": "Username-Password-Authentication", + "is_domain_connection": false, + "authentication": { + "active": true + }, + "connected_accounts": { + "active": false + }, + "enabled_clients": [ + "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", + "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" + ], + "realms": [ + "Username-Password-Authentication" + ] }, "rawHeaders": [], "responseIsBinary": false @@ -10171,22 +6637,19 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PATCH", - "path": "/api/v2/branding", - "body": { - "colors": { - "primary": "#F8F8F2", - "page_background": "#222221" - }, - "logo_url": "https://upload.wikimedia.org/wikipedia/commons/0/0d/Grandmas_marathon_finishers.png" - }, - "status": 200, - "response": { - "colors": { - "primary": "#F8F8F2", - "page_background": "#222221" + "path": "/api/v2/connections/con_3R2lX4rln4ArocW5/clients", + "body": [ + { + "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", + "status": true }, - "logo_url": "https://upload.wikimedia.org/wikipedia/commons/0/0d/Grandmas_marathon_finishers.png" - }, + { + "client_id": "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V", + "status": true + } + ], + "status": 204, + "response": "", "rawHeaders": [], "responseIsBinary": false }, @@ -10197,7 +6660,7 @@ "body": "", "status": 200, "response": { - "total": 9, + "total": 3, "start": 0, "limit": 100, "clients": [ @@ -10260,27 +6723,17 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "API Explorer Application", - "allowed_clients": [], + "name": "Default App", "callbacks": [], - "client_metadata": {}, "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, "oidc_conformant": true, "refresh_token": { "expiration_type": "non-expiring", "leeway": 0, "infinite_token_lifetime": true, "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, + "token_lifetime": 2592000, + "idle_token_lifetime": 1296000, "rotation_type": "non-rotating" }, "sso_disabled": false, @@ -10293,7 +6746,7 @@ "subject": "deprecated" } ], - "client_id": "vVbUuOLzLQ9k7iwdZoLRtQuhG8XHUkSY", + "client_id": "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -10301,36 +6754,40 @@ "lifetime_in_seconds": 36000, "secret_encoded": false }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", "grant_types": [ + "authorization_code", + "implicit", + "refresh_token", "client_credentials" ], "custom_login_page_on": true }, { "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Quickstarts API (Test Application)", - "client_metadata": { - "foo": "bar" - }, + "global": true, + "callbacks": [], "is_first_party": true, - "oidc_conformant": true, + "name": "All Applications", "refresh_token": { "expiration_type": "non-expiring", "leeway": 0, "infinite_token_lifetime": true, "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, + "token_lifetime": 2592000, + "idle_token_lifetime": 1296000, "rotation_type": "non-rotating" }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, + "owners": [ + "mr|samlp|okta|will.vedder@auth0.com", + "mr|google-oauth2|102002633619863830825", + "mr|samlp|okta|frederik.prijck@auth0.com", + "mr|google-oauth2|109614534713742077035", + "mr|google-oauth2|116771660953104383819", + "mr|google-oauth2|112839029247827700155", + "mr|samlp|okta|ewan.harris@auth0.com" + ], + "custom_login_page": "TEST123\n", + "cross_origin_authentication": true, "signing_keys": [ { "cert": "[REDACTED]", @@ -10338,143 +6795,349 @@ "subject": "deprecated" } ], - "client_id": "O0AMH5MORoUOkQ8g31aPVmBZ11jyApI5", - "callback_url_template": false, + "client_id": "Isi93ibGHIGwmdYjsLwTOn7Gu7nwxU3V", "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false + "custom_login_page_on": true + } + ] + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/connections?take=50", + "body": "", + "status": 200, + "response": { + "connections": [ + { + "id": "con_lfhXlIY73LFJlMks", + "options": { + "email": true, + "scope": [ + "email", + "profile" + ], + "profile": true }, - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", - "grant_types": [ - "client_credentials" + "strategy": "google-oauth2", + "name": "google-oauth2", + "is_domain_connection": false, + "authentication": { + "active": true + }, + "connected_accounts": { + "active": false + }, + "realms": [ + "google-oauth2" ], - "custom_login_page_on": true + "enabled_clients": [ + "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", + "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" + ] }, { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Node App", - "allowed_clients": [], - "allowed_logout_urls": [], - "callbacks": [], - "client_metadata": {}, - "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false + "id": "con_3R2lX4rln4ArocW5", + "options": { + "mfa": { + "active": true, + "return_enroll_settings": true + }, + "passwordPolicy": "good", + "passkey_options": { + "challenge_ui": "both", + "local_enrollment_enabled": true, + "progressive_enrollment_enabled": true + }, + "strategy_version": 2, + "authentication_methods": { + "passkey": { + "enabled": false + }, + "password": { + "enabled": true, + "api_behavior": "required" + } }, - "facebook": { - "enabled": false - } + "brute_force_protection": true }, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" + "strategy": "auth0", + "name": "Username-Password-Authentication", + "is_domain_connection": false, + "authentication": { + "active": true }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "allowed_origins": [], - "client_id": "88gPebiknBTdBHOAYrSdF2WWRyuroAax", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false + "connected_accounts": { + "active": false }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "regular_web", - "grant_types": [ - "authorization_code", - "implicit", - "refresh_token", - "client_credentials" + "realms": [ + "Username-Password-Authentication" ], - "web_origins": [], - "custom_login_page_on": true - }, + "enabled_clients": [ + "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", + "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" + ] + } + ] + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/connections?take=50", + "body": "", + "status": 200, + "response": { + "connections": [ { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "The Default App", - "allowed_clients": [], - "callbacks": [], - "client_metadata": {}, - "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false + "id": "con_lfhXlIY73LFJlMks", + "options": { + "email": true, + "scope": [ + "email", + "profile" + ], + "profile": true + }, + "strategy": "google-oauth2", + "name": "google-oauth2", + "is_domain_connection": false, + "authentication": { + "active": true + }, + "connected_accounts": { + "active": false + }, + "realms": [ + "google-oauth2" + ], + "enabled_clients": [ + "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", + "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" + ] + }, + { + "id": "con_3R2lX4rln4ArocW5", + "options": { + "mfa": { + "active": true, + "return_enroll_settings": true + }, + "passwordPolicy": "good", + "passkey_options": { + "challenge_ui": "both", + "local_enrollment_enabled": true, + "progressive_enrollment_enabled": true + }, + "strategy_version": 2, + "authentication_methods": { + "passkey": { + "enabled": false + }, + "password": { + "enabled": true, + "api_behavior": "required" + } }, - "facebook": { - "enabled": false - } + "brute_force_protection": true }, - "oidc_conformant": false, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 2592000, - "idle_token_lifetime": 1296000, - "rotation_type": "non-rotating" + "strategy": "auth0", + "name": "Username-Password-Authentication", + "is_domain_connection": false, + "authentication": { + "active": true }, - "sso": false, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "7vlUKQihTlaGoILrgQ51JW4xMbU1XhI0", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false + "connected_accounts": { + "active": false }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "grant_types": [ - "authorization_code", - "implicit", - "refresh_token", - "client_credentials" + "realms": [ + "Username-Password-Authentication" ], - "custom_login_page_on": true + "enabled_clients": [ + "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", + "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" + ] + } + ] + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/connections/con_lfhXlIY73LFJlMks/clients?take=50", + "body": "", + "status": 200, + "response": { + "clients": [ + { + "client_id": "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" + }, + { + "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE" + } + ] + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/connections/con_lfhXlIY73LFJlMks/clients?take=50", + "body": "", + "status": 200, + "response": { + "clients": [ + { + "client_id": "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" }, + { + "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE" + } + ] + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "PATCH", + "path": "/api/v2/connections/con_lfhXlIY73LFJlMks", + "body": { + "authentication": { + "active": true + }, + "connected_accounts": { + "active": false + }, + "enabled_clients": [ + "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", + "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" + ], + "is_domain_connection": false, + "options": { + "email": true, + "scope": [ + "email", + "profile" + ], + "profile": true + } + }, + "status": 200, + "response": { + "id": "con_lfhXlIY73LFJlMks", + "options": { + "email": true, + "scope": [ + "email", + "profile" + ], + "profile": true + }, + "strategy": "google-oauth2", + "name": "google-oauth2", + "is_domain_connection": false, + "authentication": { + "active": true + }, + "connected_accounts": { + "active": false + }, + "enabled_clients": [ + "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", + "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" + ], + "realms": [ + "google-oauth2" + ] + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "PATCH", + "path": "/api/v2/connections/con_lfhXlIY73LFJlMks/clients", + "body": [ + { + "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", + "status": true + }, + { + "client_id": "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V", + "status": true + } + ], + "status": 204, + "response": "", + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/emails/provider?fields=name%2Cenabled%2Ccredentials%2Csettings%2Cdefault_from_address&include_fields=true", + "body": "", + "status": 200, + "response": { + "name": "mandrill", + "credentials": {}, + "default_from_address": "auth0-user@auth0.com", + "enabled": false + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "PATCH", + "path": "/api/v2/emails/provider", + "body": { + "name": "mandrill", + "credentials": { + "api_key": "##MANDRILL_API_KEY##" + }, + "default_from_address": "auth0-user@auth0.com", + "enabled": false + }, + "status": 200, + "response": { + "name": "mandrill", + "credentials": {}, + "default_from_address": "auth0-user@auth0.com", + "enabled": false + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/clients?page=0&per_page=100&include_totals=true", + "body": "", + "status": 200, + "response": { + "total": 3, + "start": 0, + "limit": 100, + "clients": [ { "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "Terraform Provider", + "name": "Deploy CLI", "is_first_party": true, "oidc_conformant": true, + "sso_disabled": false, + "cross_origin_auth": false, "refresh_token": { "expiration_type": "non-expiring", "leeway": 0, @@ -10484,45 +7147,9 @@ "idle_token_lifetime": 2592000, "rotation_type": "non-rotating" }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "R9N1M3jJcxlEKpIcm4EX8glA7Krb9h1k", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", - "grant_types": [ - "client_credentials" - ], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Test SPA", + "cross_origin_authentication": true, "allowed_clients": [], - "allowed_logout_urls": [ - "http://localhost:3000" - ], - "callbacks": [ - "http://localhost:3000" - ], - "client_metadata": {}, - "is_first_party": true, + "callbacks": [], "native_social_login": { "apple": { "enabled": false @@ -10531,19 +7158,6 @@ "enabled": false } }, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "expiring", - "leeway": 0, - "token_lifetime": 2592000, - "idle_token_lifetime": 1296000, - "infinite_token_lifetime": false, - "infinite_idle_token_lifetime": false, - "rotation_type": "rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, "signing_keys": [ { "cert": "[REDACTED]", @@ -10551,7 +7165,7 @@ "subject": "deprecated" } ], - "client_id": "9ztJ1ZaM0iTa9eR2Ga08KOrwBNqNuRmr", + "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -10560,43 +7174,31 @@ "secret_encoded": false }, "client_aliases": [], - "token_endpoint_auth_method": "none", - "app_type": "spa", + "token_endpoint_auth_method": "client_secret_post", + "app_type": "non_interactive", "grant_types": [ - "authorization_code", + "client_credentials", "implicit", + "authorization_code", "refresh_token" ], - "web_origins": [ - "http://localhost:3000" - ], "custom_login_page_on": true }, { "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "auth0-deploy-cli-extension", - "allowed_clients": [], + "name": "Default App", "callbacks": [], - "client_metadata": {}, "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, "oidc_conformant": true, "refresh_token": { "expiration_type": "non-expiring", "leeway": 0, "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, + "infinite_idle_token_lifetime": true, + "token_lifetime": 2592000, + "idle_token_lifetime": 1296000, "rotation_type": "non-rotating" }, "sso_disabled": false, @@ -10609,7 +7211,7 @@ "subject": "deprecated" } ], - "client_id": "8DngHjTrjB57cRXo74zYn4qohnAxjFsG", + "client_id": "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -10617,10 +7219,10 @@ "lifetime_in_seconds": 36000, "secret_encoded": false }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", "grant_types": [ + "authorization_code", + "implicit", + "refresh_token", "client_credentials" ], "custom_login_page_on": true @@ -10670,31 +7272,262 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/organizations?include_totals=true", + "path": "/api/v2/client-grants?take=50", + "body": "", + "status": 200, + "response": { + "client_grants": [ + { + "id": "cgr_pbwejzhwoujrsNE8", + "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", + "audience": "https://auth0-deploy-cli-e2e.us.auth0.com/api/v2/", + "scope": [ + "read:client_grants", + "create:client_grants", + "delete:client_grants", + "update:client_grants", + "read:users", + "update:users", + "delete:users", + "create:users", + "read:users_app_metadata", + "update:users_app_metadata", + "delete:users_app_metadata", + "create:users_app_metadata", + "read:user_custom_blocks", + "create:user_custom_blocks", + "delete:user_custom_blocks", + "create:user_tickets", + "read:clients", + "update:clients", + "delete:clients", + "create:clients", + "read:client_keys", + "update:client_keys", + "delete:client_keys", + "create:client_keys", + "read:client_credentials", + "update:client_credentials", + "delete:client_credentials", + "create:client_credentials", + "read:connections", + "update:connections", + "delete:connections", + "create:connections", + "read:resource_servers", + "update:resource_servers", + "delete:resource_servers", + "create:resource_servers", + "read:device_credentials", + "update:device_credentials", + "delete:device_credentials", + "create:device_credentials", + "read:rules", + "update:rules", + "delete:rules", + "create:rules", + "read:rules_configs", + "update:rules_configs", + "delete:rules_configs", + "read:hooks", + "update:hooks", + "delete:hooks", + "create:hooks", + "read:actions", + "update:actions", + "delete:actions", + "create:actions", + "read:email_provider", + "update:email_provider", + "delete:email_provider", + "create:email_provider", + "blacklist:tokens", + "read:stats", + "read:insights", + "read:tenant_settings", + "update:tenant_settings", + "read:logs", + "read:logs_users", + "read:shields", + "create:shields", + "update:shields", + "delete:shields", + "read:anomaly_blocks", + "delete:anomaly_blocks", + "update:triggers", + "read:triggers", + "read:grants", + "delete:grants", + "read:guardian_factors", + "update:guardian_factors", + "read:guardian_enrollments", + "delete:guardian_enrollments", + "create:guardian_enrollment_tickets", + "read:user_idp_tokens", + "create:passwords_checking_job", + "delete:passwords_checking_job", + "read:custom_domains", + "delete:custom_domains", + "create:custom_domains", + "update:custom_domains", + "read:email_templates", + "create:email_templates", + "update:email_templates", + "read:mfa_policies", + "update:mfa_policies", + "read:roles", + "create:roles", + "delete:roles", + "update:roles", + "read:prompts", + "update:prompts", + "read:branding", + "update:branding", + "delete:branding", + "read:log_streams", + "create:log_streams", + "delete:log_streams", + "update:log_streams", + "create:signing_keys", + "read:signing_keys", + "update:signing_keys", + "read:limits", + "update:limits", + "create:role_members", + "read:role_members", + "delete:role_members", + "read:entitlements", + "read:attack_protection", + "update:attack_protection", + "read:organizations_summary", + "create:authentication_methods", + "read:authentication_methods", + "update:authentication_methods", + "delete:authentication_methods", + "read:organizations", + "update:organizations", + "create:organizations", + "delete:organizations", + "read:organization_discovery_domains", + "update:organization_discovery_domains", + "create:organization_discovery_domains", + "delete:organization_discovery_domains", + "create:organization_members", + "read:organization_members", + "delete:organization_members", + "create:organization_connections", + "read:organization_connections", + "update:organization_connections", + "delete:organization_connections", + "create:organization_member_roles", + "read:organization_member_roles", + "delete:organization_member_roles", + "create:organization_invitations", + "read:organization_invitations", + "delete:organization_invitations", + "read:scim_config", + "create:scim_config", + "update:scim_config", + "delete:scim_config", + "create:scim_token", + "read:scim_token", + "delete:scim_token", + "delete:phone_providers", + "create:phone_providers", + "read:phone_providers", + "update:phone_providers", + "delete:phone_templates", + "create:phone_templates", + "read:phone_templates", + "update:phone_templates", + "create:encryption_keys", + "read:encryption_keys", + "update:encryption_keys", + "delete:encryption_keys", + "read:sessions", + "update:sessions", + "delete:sessions", + "read:refresh_tokens", + "delete:refresh_tokens", + "create:self_service_profiles", + "read:self_service_profiles", + "update:self_service_profiles", + "delete:self_service_profiles", + "create:sso_access_tickets", + "delete:sso_access_tickets", + "read:forms", + "update:forms", + "delete:forms", + "create:forms", + "read:flows", + "update:flows", + "delete:flows", + "create:flows", + "read:flows_vault", + "read:flows_vault_connections", + "update:flows_vault_connections", + "delete:flows_vault_connections", + "create:flows_vault_connections", + "read:flows_executions", + "delete:flows_executions", + "read:connections_options", + "update:connections_options", + "read:self_service_profile_custom_texts", + "update:self_service_profile_custom_texts", + "create:network_acls", + "update:network_acls", + "read:network_acls", + "delete:network_acls", + "delete:vdcs_templates", + "read:vdcs_templates", + "create:vdcs_templates", + "update:vdcs_templates", + "create:custom_signing_keys", + "read:custom_signing_keys", + "update:custom_signing_keys", + "delete:custom_signing_keys", + "read:federated_connections_tokens", + "delete:federated_connections_tokens", + "create:user_attribute_profiles", + "read:user_attribute_profiles", + "update:user_attribute_profiles", + "delete:user_attribute_profiles", + "read:event_streams", + "create:event_streams", + "delete:event_streams", + "update:event_streams", + "read:event_deliveries", + "update:event_deliveries", + "create:connection_profiles", + "read:connection_profiles", + "update:connection_profiles", + "delete:connection_profiles", + "read:organization_client_grants", + "create:organization_client_grants", + "delete:organization_client_grants", + "read:security_metrics", + "read:connections_keys", + "update:connections_keys", + "create:connections_keys" + ], + "subject_type": "client" + } + ] + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/roles?per_page=100&page=0&include_totals=true", "body": "", "status": 200, "response": { - "organizations": [ - { - "id": "org_GDDGaXDUPC3vLmot", - "name": "org1", - "display_name": "Organization", - "branding": { - "colors": { - "page_background": "#fff5f5", - "primary": "#57ddff" - } - } - }, - { - "id": "org_dg75TodzDZQ3yqAV", - "name": "org2", - "display_name": "Organization2" - } - ], + "roles": [], "start": 0, - "limit": 50, - "total": 2 + "limit": 100, + "total": 0 }, "rawHeaders": [], "responseIsBinary": false @@ -10702,26 +7535,25 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/organizations?include_totals=true&take=50", + "path": "/api/v2/branding/phone/providers", "body": "", "status": 200, "response": { - "organizations": [ - { - "id": "org_dg75TodzDZQ3yqAV", - "name": "org2", - "display_name": "Organization2" - }, + "providers": [ { - "id": "org_GDDGaXDUPC3vLmot", - "name": "org1", - "display_name": "Organization", - "branding": { - "colors": { - "page_background": "#fff5f5", - "primary": "#57ddff" - } - } + "id": "pro_mY3L5BP6iVUUzpv22opofm", + "tenant": "auth0-deploy-cli-e2e", + "name": "custom", + "channel": "phone", + "disabled": false, + "configuration": { + "delivery_methods": [ + "text" + ] + }, + "credentials": null, + "created_at": "2025-12-09T12:24:00.604Z", + "updated_at": "2025-12-16T10:10:43.073Z" } ] }, @@ -10730,25 +7562,75 @@ }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/organizations/org_dg75TodzDZQ3yqAV/enabled_connections", - "body": "", + "method": "PATCH", + "path": "/api/v2/branding/phone/providers/pro_mY3L5BP6iVUUzpv22opofm", + "body": { + "name": "custom", + "configuration": { + "delivery_methods": [ + "text" + ] + }, + "disabled": false + }, "status": 200, - "response": [], + "response": { + "id": "pro_mY3L5BP6iVUUzpv22opofm", + "tenant": "auth0-deploy-cli-e2e", + "name": "custom", + "channel": "phone", + "disabled": false, + "configuration": { + "delivery_methods": [ + "text" + ] + }, + "created_at": "2025-12-09T12:24:00.604Z", + "updated_at": "2025-12-16T10:11:48.093Z" + }, "rawHeaders": [], "responseIsBinary": false }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/organizations/org_dg75TodzDZQ3yqAV/client-grants?page=0&per_page=100&include_totals=true", + "path": "/api/v2/self-service-profiles?page=0&per_page=100&include_totals=true", "body": "", "status": 200, "response": { - "client_grants": [], + "self_service_profiles": [ + { + "id": "ssp_f6qt3syGauLKbSgt6GRLim", + "name": "self-service-profile-1", + "description": "test description self-service-profile-1", + "user_attributes": [ + { + "name": "email", + "description": "Email of the User", + "is_optional": false + }, + { + "name": "name", + "description": "Name of the User", + "is_optional": true + } + ], + "allowed_strategies": [ + "google-apps", + "okta" + ], + "created_at": "2024-11-26T11:58:18.962Z", + "updated_at": "2025-12-16T09:02:11.327Z", + "branding": { + "colors": { + "primary": "#19aecc" + } + } + } + ], "start": 0, "limit": 100, - "total": 0 + "total": 1 }, "rawHeaders": [], "responseIsBinary": false @@ -10756,11 +7638,70 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/organizations/org_dg75TodzDZQ3yqAV/discovery-domains?take=50", + "path": "/api/v2/self-service-profiles/ssp_f6qt3syGauLKbSgt6GRLim/custom-text/en/get-started", "body": "", "status": 200, + "response": {}, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "PATCH", + "path": "/api/v2/self-service-profiles/ssp_f6qt3syGauLKbSgt6GRLim", + "body": { + "name": "self-service-profile-1", + "allowed_strategies": [ + "google-apps", + "okta" + ], + "branding": { + "colors": { + "primary": "#19aecc" + } + }, + "description": "test description self-service-profile-1", + "user_attributes": [ + { + "name": "email", + "description": "Email of the User", + "is_optional": false + }, + { + "name": "name", + "description": "Name of the User", + "is_optional": true + } + ] + }, + "status": 200, "response": { - "domains": [] + "id": "ssp_f6qt3syGauLKbSgt6GRLim", + "name": "self-service-profile-1", + "description": "test description self-service-profile-1", + "user_attributes": [ + { + "name": "email", + "description": "Email of the User", + "is_optional": false + }, + { + "name": "name", + "description": "Name of the User", + "is_optional": true + } + ], + "allowed_strategies": [ + "google-apps", + "okta" + ], + "created_at": "2024-11-26T11:58:18.962Z", + "updated_at": "2025-12-16T10:11:49.300Z", + "branding": { + "colors": { + "primary": "#19aecc" + } + } }, "rawHeaders": [], "responseIsBinary": false @@ -10768,76 +7709,211 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/organizations/org_GDDGaXDUPC3vLmot/enabled_connections", + "path": "/api/v2/branding/phone/templates", "body": "", "status": 200, - "response": [], + "response": { + "templates": [ + { + "id": "tem_xqbUSF83fpnRv8r8rqXFDZ", + "tenant": "auth0-deploy-cli-e2e", + "channel": "phone", + "type": "change_password", + "disabled": false, + "created_at": "2025-12-09T12:26:20.243Z", + "updated_at": "2025-12-16T08:58:36.831Z", + "content": { + "syntax": "liquid", + "body": { + "text": "{{ code | escape }} is your password change code for {{ friendly_name | escape }}", + "voice": "Hello. Your password change code for {{ friendly_name | escape }} is {{ pause }} {{ code | escape }}. I repeat, your password change code is {{ pause }} {{ code | escape }}" + } + } + }, + { + "id": "tem_dL83uTmWn8moGzm8UgAk4Q", + "tenant": "auth0-deploy-cli-e2e", + "channel": "phone", + "type": "blocked_account", + "disabled": false, + "created_at": "2025-12-09T12:22:47.683Z", + "updated_at": "2025-12-16T08:58:36.736Z", + "content": { + "syntax": "liquid", + "body": { + "text": "We detected suspicious activity on your account from the ip {{user.source_ip}}{% if user.city %} from {{user.city}}, {{user.country}}{% elsif user.country %} from {{user.country}}{% endif %}. Logins from this IP have been blocked on your account. If this is your IP, please reset your password to unblock your account. Otherwise, disregard this message.", + "voice": "We detected suspicious activity on your account from the ip {{user.source_ip}}{% if user.city %} from {{user.city}}, {{user.country}}{% elsif user.country %} from {{user.country}}{% endif %}. Logins from this IP have been blocked on your account. If this is your IP, please reset your password to unblock your account. Otherwise, disregard this message." + }, + "from": "0032232323" + } + }, + { + "id": "tem_o4LBTt4NQyX8K4vC9dPafR", + "tenant": "auth0-deploy-cli-e2e", + "channel": "phone", + "type": "otp_verify", + "disabled": false, + "created_at": "2025-12-09T12:26:30.547Z", + "updated_at": "2025-12-16T08:58:37.073Z", + "content": { + "syntax": "liquid", + "body": { + "text": "{{ code | escape }} is your verification code for {{ friendly_name | escape }}", + "voice": "Hello. Your verification code for {{ friendly_name | escape }} is {{ pause }} {{ code | escape }}. I repeat, your verification code is {{ pause }} {{ code | escape }}" + } + } + }, + { + "id": "tem_qarYST5TTE5pbMNB5NHZAj", + "tenant": "auth0-deploy-cli-e2e", + "channel": "phone", + "type": "otp_enroll", + "disabled": false, + "created_at": "2025-12-09T12:26:25.327Z", + "updated_at": "2025-12-16T08:58:36.804Z", + "content": { + "syntax": "liquid", + "body": { + "text": "{{ code | escape }} is your verification code for {{ friendly_name | escape }}. Please enter this code to verify your enrollment.", + "voice": "Hello. Your verification code for {{ friendly_name | escape }} is {{ pause }} {{ code | escape }}. I repeat, your verification code is {{ pause }} {{ code | escape }}" + } + } + } + ] + }, "rawHeaders": [], "responseIsBinary": false }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/organizations/org_GDDGaXDUPC3vLmot/client-grants?page=0&per_page=100&include_totals=true", - "body": "", + "method": "PATCH", + "path": "/api/v2/branding/phone/templates/tem_xqbUSF83fpnRv8r8rqXFDZ", + "body": { + "content": { + "body": { + "text": "{{ code | escape }} is your password change code for {{ friendly_name | escape }}", + "voice": "Hello. Your password change code for {{ friendly_name | escape }} is {{ pause }} {{ code | escape }}. I repeat, your password change code is {{ pause }} {{ code | escape }}" + } + }, + "disabled": false + }, "status": 200, "response": { - "client_grants": [], - "start": 0, - "limit": 100, - "total": 0 + "id": "tem_xqbUSF83fpnRv8r8rqXFDZ", + "tenant": "auth0-deploy-cli-e2e", + "channel": "phone", + "type": "change_password", + "disabled": false, + "created_at": "2025-12-09T12:26:20.243Z", + "updated_at": "2025-12-16T10:11:50.047Z", + "content": { + "syntax": "liquid", + "body": { + "text": "{{ code | escape }} is your password change code for {{ friendly_name | escape }}", + "voice": "Hello. Your password change code for {{ friendly_name | escape }} is {{ pause }} {{ code | escape }}. I repeat, your password change code is {{ pause }} {{ code | escape }}" + } + } }, "rawHeaders": [], "responseIsBinary": false }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/organizations/org_GDDGaXDUPC3vLmot/discovery-domains?take=50", - "body": "", + "method": "PATCH", + "path": "/api/v2/branding/phone/templates/tem_dL83uTmWn8moGzm8UgAk4Q", + "body": { + "content": { + "from": "0032232323", + "body": { + "text": "We detected suspicious activity on your account from the ip {{user.source_ip}}{% if user.city %} from {{user.city}}, {{user.country}}{% elsif user.country %} from {{user.country}}{% endif %}. Logins from this IP have been blocked on your account. If this is your IP, please reset your password to unblock your account. Otherwise, disregard this message.", + "voice": "We detected suspicious activity on your account from the ip {{user.source_ip}}{% if user.city %} from {{user.city}}, {{user.country}}{% elsif user.country %} from {{user.country}}{% endif %}. Logins from this IP have been blocked on your account. If this is your IP, please reset your password to unblock your account. Otherwise, disregard this message." + } + }, + "disabled": false + }, "status": 200, "response": { - "domains": [] + "id": "tem_dL83uTmWn8moGzm8UgAk4Q", + "tenant": "auth0-deploy-cli-e2e", + "channel": "phone", + "type": "blocked_account", + "disabled": false, + "created_at": "2025-12-09T12:22:47.683Z", + "updated_at": "2025-12-16T10:11:50.118Z", + "content": { + "syntax": "liquid", + "body": { + "text": "We detected suspicious activity on your account from the ip {{user.source_ip}}{% if user.city %} from {{user.city}}, {{user.country}}{% elsif user.country %} from {{user.country}}{% endif %}. Logins from this IP have been blocked on your account. If this is your IP, please reset your password to unblock your account. Otherwise, disregard this message.", + "voice": "We detected suspicious activity on your account from the ip {{user.source_ip}}{% if user.city %} from {{user.city}}, {{user.country}}{% elsif user.country %} from {{user.country}}{% endif %}. Logins from this IP have been blocked on your account. If this is your IP, please reset your password to unblock your account. Otherwise, disregard this message." + }, + "from": "0032232323" + } }, "rawHeaders": [], "responseIsBinary": false }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/connections?include_totals=true", - "body": "", + "method": "PATCH", + "path": "/api/v2/branding/phone/templates/tem_o4LBTt4NQyX8K4vC9dPafR", + "body": { + "content": { + "body": { + "text": "{{ code | escape }} is your verification code for {{ friendly_name | escape }}", + "voice": "Hello. Your verification code for {{ friendly_name | escape }} is {{ pause }} {{ code | escape }}. I repeat, your verification code is {{ pause }} {{ code | escape }}" + } + }, + "disabled": false + }, "status": 200, "response": { - "total": 1, - "start": 0, - "limit": 50, - "connections": [ - { - "id": "con_K6JOwBbKFCexaEHM", - "options": { - "email": true, - "scope": [ - "email", - "profile" - ], - "profile": true - }, - "strategy": "google-oauth2", - "name": "google-oauth2", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "google-oauth2" - ], - "enabled_clients": [] + "id": "tem_o4LBTt4NQyX8K4vC9dPafR", + "tenant": "auth0-deploy-cli-e2e", + "channel": "phone", + "type": "otp_verify", + "disabled": false, + "created_at": "2025-12-09T12:26:30.547Z", + "updated_at": "2025-12-16T10:11:50.208Z", + "content": { + "syntax": "liquid", + "body": { + "text": "{{ code | escape }} is your verification code for {{ friendly_name | escape }}", + "voice": "Hello. Your verification code for {{ friendly_name | escape }} is {{ pause }} {{ code | escape }}. I repeat, your verification code is {{ pause }} {{ code | escape }}" } - ] + } + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "PATCH", + "path": "/api/v2/branding/phone/templates/tem_qarYST5TTE5pbMNB5NHZAj", + "body": { + "content": { + "body": { + "text": "{{ code | escape }} is your verification code for {{ friendly_name | escape }}. Please enter this code to verify your enrollment.", + "voice": "Hello. Your verification code for {{ friendly_name | escape }} is {{ pause }} {{ code | escape }}. I repeat, your verification code is {{ pause }} {{ code | escape }}" + } + }, + "disabled": false + }, + "status": 200, + "response": { + "id": "tem_qarYST5TTE5pbMNB5NHZAj", + "tenant": "auth0-deploy-cli-e2e", + "channel": "phone", + "type": "otp_enroll", + "disabled": false, + "created_at": "2025-12-09T12:26:25.327Z", + "updated_at": "2025-12-16T10:11:50.397Z", + "content": { + "syntax": "liquid", + "body": { + "text": "{{ code | escape }} is your verification code for {{ friendly_name | escape }}. Please enter this code to verify your enrollment.", + "voice": "Hello. Your verification code for {{ friendly_name | escape }} is {{ pause }} {{ code | escape }}. I repeat, your verification code is {{ pause }} {{ code | escape }}" + } + } }, "rawHeaders": [], "responseIsBinary": false @@ -10845,36 +7921,61 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections?include_totals=true&take=50", + "path": "/api/v2/actions/actions?page=0&per_page=100", "body": "", "status": 200, "response": { - "connections": [ + "actions": [ { - "id": "con_K6JOwBbKFCexaEHM", - "options": { - "email": true, - "scope": [ - "email", - "profile" - ], - "profile": true - }, - "strategy": "google-oauth2", - "name": "google-oauth2", - "is_domain_connection": false, - "authentication": { - "active": true + "id": "ead7d2a3-5a93-43e2-9ec3-455f3c39daf9", + "name": "Custom Phone Provider", + "supported_triggers": [ + { + "id": "custom-phone-provider", + "version": "v1" + } + ], + "created_at": "2025-12-16T10:10:30.752146844Z", + "updated_at": "2025-12-16T10:11:36.910288525Z", + "code": "/**\n* Handler to be executed while sending a phone notification\n* @param {Event} event - Details about the user and the context in which they are logging in.\n* @param {CustomPhoneProviderAPI} api - Methods and utilities to help change the behavior of sending a phone notification.\n*/\nexports.onExecuteCustomPhoneProvider = async (event, api) => {\n // Code goes here\n return;\n};", + "dependencies": [], + "runtime": "node22", + "status": "built", + "secrets": [], + "current_version": { + "id": "83a87aec-f6f7-42bb-b6ad-6fa170f652d1", + "code": "/**\n* Handler to be executed while sending a phone notification\n* @param {Event} event - Details about the user and the context in which they are logging in.\n* @param {CustomPhoneProviderAPI} api - Methods and utilities to help change the behavior of sending a phone notification.\n*/\nexports.onExecuteCustomPhoneProvider = async (event, api) => {\n // Code goes here\n return;\n};", + "runtime": "node22", + "status": "BUILT", + "number": 2, + "build_time": "2025-12-16T10:11:37.710742601Z", + "created_at": "2025-12-16T10:11:37.627490560Z", + "updated_at": "2025-12-16T10:11:37.712144713Z" }, - "connected_accounts": { - "active": false + "deployed_version": { + "code": "/**\n* Handler to be executed while sending a phone notification\n* @param {Event} event - Details about the user and the context in which they are logging in.\n* @param {CustomPhoneProviderAPI} api - Methods and utilities to help change the behavior of sending a phone notification.\n*/\nexports.onExecuteCustomPhoneProvider = async (event, api) => {\n // Code goes here\n return;\n};", + "dependencies": [], + "id": "83a87aec-f6f7-42bb-b6ad-6fa170f652d1", + "deployed": true, + "number": 2, + "built_at": "2025-12-16T10:11:37.710742601Z", + "secrets": [], + "status": "built", + "created_at": "2025-12-16T10:11:37.627490560Z", + "updated_at": "2025-12-16T10:11:37.712144713Z", + "runtime": "node22", + "supported_triggers": [ + { + "id": "custom-phone-provider", + "version": "v1" + } + ] }, - "realms": [ - "google-oauth2" - ], - "enabled_clients": [] + "all_changes_deployed": true } - ] + ], + "total": 1, + "per_page": 100 }, "rawHeaders": [], "responseIsBinary": false @@ -10882,250 +7983,102 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/client-grants?per_page=100&page=0&include_totals=true", + "path": "/api/v2/token-exchange-profiles?take=50", "body": "", - "status": 200, + "status": 403, "response": { - "total": 1, - "start": 0, - "limit": 100, - "client_grants": [ - { - "id": "cgr_pbwejzhwoujrsNE8", - "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", - "audience": "https://auth0-deploy-cli-e2e.us.auth0.com/api/v2/", - "scope": [ - "read:client_grants", - "create:client_grants", - "delete:client_grants", - "update:client_grants", - "read:users", - "update:users", - "delete:users", - "create:users", - "read:users_app_metadata", - "update:users_app_metadata", - "delete:users_app_metadata", - "create:users_app_metadata", - "read:user_custom_blocks", - "create:user_custom_blocks", - "delete:user_custom_blocks", - "create:user_tickets", - "read:clients", - "update:clients", - "delete:clients", - "create:clients", - "read:client_keys", - "update:client_keys", - "delete:client_keys", - "create:client_keys", - "read:client_credentials", - "update:client_credentials", - "delete:client_credentials", - "create:client_credentials", - "read:connections", - "update:connections", - "delete:connections", - "create:connections", - "read:resource_servers", - "update:resource_servers", - "delete:resource_servers", - "create:resource_servers", - "read:device_credentials", - "update:device_credentials", - "delete:device_credentials", - "create:device_credentials", - "read:rules", - "update:rules", - "delete:rules", - "create:rules", - "read:rules_configs", - "update:rules_configs", - "delete:rules_configs", - "read:hooks", - "update:hooks", - "delete:hooks", - "create:hooks", - "read:actions", - "update:actions", - "delete:actions", - "create:actions", - "read:email_provider", - "update:email_provider", - "delete:email_provider", - "create:email_provider", - "blacklist:tokens", - "read:stats", - "read:insights", - "read:tenant_settings", - "update:tenant_settings", - "read:logs", - "read:logs_users", - "read:shields", - "create:shields", - "update:shields", - "delete:shields", - "read:anomaly_blocks", - "delete:anomaly_blocks", - "update:triggers", - "read:triggers", - "read:grants", - "delete:grants", - "read:guardian_factors", - "update:guardian_factors", - "read:guardian_enrollments", - "delete:guardian_enrollments", - "create:guardian_enrollment_tickets", - "read:user_idp_tokens", - "create:passwords_checking_job", - "delete:passwords_checking_job", - "read:custom_domains", - "delete:custom_domains", - "create:custom_domains", - "update:custom_domains", - "read:email_templates", - "create:email_templates", - "update:email_templates", - "read:mfa_policies", - "update:mfa_policies", - "read:roles", - "create:roles", - "delete:roles", - "update:roles", - "read:prompts", - "update:prompts", - "read:branding", - "update:branding", - "delete:branding", - "read:log_streams", - "create:log_streams", - "delete:log_streams", - "update:log_streams", - "create:signing_keys", - "read:signing_keys", - "update:signing_keys", - "read:limits", - "update:limits", - "create:role_members", - "read:role_members", - "delete:role_members", - "read:entitlements", - "read:attack_protection", - "update:attack_protection", - "read:organizations_summary", - "create:authentication_methods", - "read:authentication_methods", - "update:authentication_methods", - "delete:authentication_methods", - "read:organizations", - "update:organizations", - "create:organizations", - "delete:organizations", - "read:organization_discovery_domains", - "update:organization_discovery_domains", - "create:organization_discovery_domains", - "delete:organization_discovery_domains", - "create:organization_members", - "read:organization_members", - "delete:organization_members", - "create:organization_connections", - "read:organization_connections", - "update:organization_connections", - "delete:organization_connections", - "create:organization_member_roles", - "read:organization_member_roles", - "delete:organization_member_roles", - "create:organization_invitations", - "read:organization_invitations", - "delete:organization_invitations", - "read:scim_config", - "create:scim_config", - "update:scim_config", - "delete:scim_config", - "create:scim_token", - "read:scim_token", - "delete:scim_token", - "delete:phone_providers", - "create:phone_providers", - "read:phone_providers", - "update:phone_providers", - "delete:phone_templates", - "create:phone_templates", - "read:phone_templates", - "update:phone_templates", - "create:encryption_keys", - "read:encryption_keys", - "update:encryption_keys", - "delete:encryption_keys", - "read:sessions", - "update:sessions", - "delete:sessions", - "read:refresh_tokens", - "delete:refresh_tokens", - "create:self_service_profiles", - "read:self_service_profiles", - "update:self_service_profiles", - "delete:self_service_profiles", - "create:sso_access_tickets", - "delete:sso_access_tickets", - "read:forms", - "update:forms", - "delete:forms", - "create:forms", - "read:flows", - "update:flows", - "delete:flows", - "create:flows", - "read:flows_vault", - "read:flows_vault_connections", - "update:flows_vault_connections", - "delete:flows_vault_connections", - "create:flows_vault_connections", - "read:flows_executions", - "delete:flows_executions", - "read:connections_options", - "update:connections_options", - "read:self_service_profile_custom_texts", - "update:self_service_profile_custom_texts", - "create:network_acls", - "update:network_acls", - "read:network_acls", - "delete:network_acls", - "delete:vdcs_templates", - "read:vdcs_templates", - "create:vdcs_templates", - "update:vdcs_templates", - "create:custom_signing_keys", - "read:custom_signing_keys", - "update:custom_signing_keys", - "delete:custom_signing_keys", - "read:federated_connections_tokens", - "delete:federated_connections_tokens", - "create:user_attribute_profiles", - "read:user_attribute_profiles", - "update:user_attribute_profiles", - "delete:user_attribute_profiles", - "read:event_streams", - "create:event_streams", - "delete:event_streams", - "update:event_streams", - "read:event_deliveries", - "update:event_deliveries", - "create:connection_profiles", - "read:connection_profiles", - "update:connection_profiles", - "delete:connection_profiles", - "read:organization_client_grants", - "create:organization_client_grants", - "delete:organization_client_grants", - "read:security_metrics", - "read:connections_keys", - "update:connections_keys", - "create:connections_keys" - ], - "subject_type": "client" - } - ] + "statusCode": 403, + "error": "Forbidden", + "message": "Insufficient scope, expected any of: read:token_exchange_profiles", + "errorCode": "insufficient_scope" + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "PATCH", + "path": "/api/v2/email-templates/verify_email", + "body": { + "template": "verify_email", + "body": "\n \n \n \n \n
\n \n \n \n
\n \n \n

\n\n

Welcome to {{ application.name}}!

\n\n

\n Thank you for signing up. Please verify your email address by clicking the following\n link:\n

\n\n

Confirm my account

\n\n

\n If you are having any issues with your account, please don’t hesitate to contact us\n by replying to this mail.\n

\n\n
\n Haha!!!\n
\n\n {{ application.name }}\n\n

\n
\n \n If you did not make this request, please contact us by replying to this mail.\n

\n
\n \n \n \n
\n \n\n", + "enabled": true, + "from": "", + "subject": "", + "syntax": "liquid", + "urlLifetimeInSeconds": 432000 + }, + "status": 200, + "response": { + "template": "verify_email", + "body": "\n \n \n \n \n
\n \n \n \n
\n \n \n

\n\n

Welcome to {{ application.name}}!

\n\n

\n Thank you for signing up. Please verify your email address by clicking the following\n link:\n

\n\n

Confirm my account

\n\n

\n If you are having any issues with your account, please don’t hesitate to contact us\n by replying to this mail.\n

\n\n
\n Haha!!!\n
\n\n {{ application.name }}\n\n

\n
\n \n If you did not make this request, please contact us by replying to this mail.\n

\n
\n \n \n \n
\n \n\n", + "from": "", + "subject": "", + "syntax": "liquid", + "urlLifetimeInSeconds": 432000, + "enabled": true + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "PATCH", + "path": "/api/v2/email-templates/welcome_email", + "body": { + "template": "welcome_email", + "body": "\n \n

Welcome!

\n \n\n", + "enabled": false, + "from": "", + "resultUrl": "https://example.com/welcome", + "subject": "Welcome", + "syntax": "liquid", + "urlLifetimeInSeconds": 3600 + }, + "status": 200, + "response": { + "template": "welcome_email", + "body": "\n \n

Welcome!

\n \n\n", + "from": "", + "resultUrl": "https://example.com/welcome", + "subject": "Welcome", + "syntax": "liquid", + "urlLifetimeInSeconds": 3600, + "enabled": false + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "PATCH", + "path": "/api/v2/branding", + "body": { + "colors": { + "primary": "#F8F8F2", + "page_background": "#222221" + }, + "logo_url": "https://upload.wikimedia.org/wikipedia/commons/0/0d/Grandmas_marathon_finishers.png" + }, + "status": 200, + "response": { + "colors": { + "primary": "#F8F8F2", + "page_background": "#222221" + }, + "logo_url": "https://upload.wikimedia.org/wikipedia/commons/0/0d/Grandmas_marathon_finishers.png" + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/organizations?take=50", + "body": "", + "status": 200, + "response": { + "organizations": [] }, "rawHeaders": [], "responseIsBinary": false @@ -11137,7 +8090,7 @@ "body": "", "status": 200, "response": { - "total": 9, + "total": 3, "start": 0, "limit": 100, "clients": [ @@ -11200,125 +8153,17 @@ "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "API Explorer Application", - "allowed_clients": [], - "callbacks": [], - "client_metadata": {}, - "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "vVbUuOLzLQ9k7iwdZoLRtQuhG8XHUkSY", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", - "grant_types": [ - "client_credentials" - ], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Quickstarts API (Test Application)", - "client_metadata": { - "foo": "bar" - }, - "is_first_party": true, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "non-expiring", - "leeway": 0, - "infinite_token_lifetime": true, - "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, - "rotation_type": "non-rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "O0AMH5MORoUOkQ8g31aPVmBZ11jyApI5", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", - "grant_types": [ - "client_credentials" - ], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Node App", - "allowed_clients": [], - "allowed_logout_urls": [], + "name": "Default App", "callbacks": [], - "client_metadata": {}, "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, "oidc_conformant": true, "refresh_token": { "expiration_type": "non-expiring", "leeway": 0, "infinite_token_lifetime": true, "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, + "token_lifetime": 2592000, + "idle_token_lifetime": 1296000, "rotation_type": "non-rotating" }, "sso_disabled": false, @@ -11331,8 +8176,7 @@ "subject": "deprecated" } ], - "allowed_origins": [], - "client_id": "88gPebiknBTdBHOAYrSdF2WWRyuroAax", + "client_id": "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -11340,36 +8184,20 @@ "lifetime_in_seconds": 36000, "secret_encoded": false }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "regular_web", "grant_types": [ "authorization_code", "implicit", "refresh_token", "client_credentials" ], - "web_origins": [], "custom_login_page_on": true }, { "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "The Default App", - "allowed_clients": [], + "global": true, "callbacks": [], - "client_metadata": {}, "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, - "oidc_conformant": false, + "name": "All Applications", "refresh_token": { "expiration_type": "non-expiring", "leeway": 0, @@ -11379,10 +8207,17 @@ "idle_token_lifetime": 1296000, "rotation_type": "non-rotating" }, - "sso": false, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, + "owners": [ + "mr|samlp|okta|will.vedder@auth0.com", + "mr|google-oauth2|102002633619863830825", + "mr|samlp|okta|frederik.prijck@auth0.com", + "mr|google-oauth2|109614534713742077035", + "mr|google-oauth2|116771660953104383819", + "mr|google-oauth2|112839029247827700155", + "mr|samlp|okta|ewan.harris@auth0.com" + ], + "custom_login_page": "TEST123\n", + "cross_origin_authentication": true, "signing_keys": [ { "cert": "[REDACTED]", @@ -11390,31 +8225,117 @@ "subject": "deprecated" } ], - "client_id": "7vlUKQihTlaGoILrgQ51JW4xMbU1XhI0", - "callback_url_template": false, + "client_id": "Isi93ibGHIGwmdYjsLwTOn7Gu7nwxU3V", "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false + "custom_login_page_on": true + } + ] + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/connections?take=50", + "body": "", + "status": 200, + "response": { + "connections": [ + { + "id": "con_lfhXlIY73LFJlMks", + "options": { + "email": true, + "scope": [ + "email", + "profile" + ], + "profile": true }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "grant_types": [ - "authorization_code", - "implicit", - "refresh_token", - "client_credentials" + "strategy": "google-oauth2", + "name": "google-oauth2", + "is_domain_connection": false, + "authentication": { + "active": true + }, + "connected_accounts": { + "active": false + }, + "realms": [ + "google-oauth2" ], - "custom_login_page_on": true + "enabled_clients": [ + "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", + "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" + ] }, + { + "id": "con_3R2lX4rln4ArocW5", + "options": { + "mfa": { + "active": true, + "return_enroll_settings": true + }, + "passwordPolicy": "good", + "passkey_options": { + "challenge_ui": "both", + "local_enrollment_enabled": true, + "progressive_enrollment_enabled": true + }, + "strategy_version": 2, + "authentication_methods": { + "passkey": { + "enabled": false + }, + "password": { + "enabled": true, + "api_behavior": "required" + } + }, + "brute_force_protection": true + }, + "strategy": "auth0", + "name": "Username-Password-Authentication", + "is_domain_connection": false, + "authentication": { + "active": true + }, + "connected_accounts": { + "active": false + }, + "realms": [ + "Username-Password-Authentication" + ], + "enabled_clients": [ + "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", + "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" + ] + } + ] + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/clients?page=0&per_page=100&include_totals=true", + "body": "", + "status": 200, + "response": { + "total": 3, + "start": 0, + "limit": 100, + "clients": [ { "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "Terraform Provider", + "name": "Deploy CLI", "is_first_party": true, "oidc_conformant": true, + "sso_disabled": false, + "cross_origin_auth": false, "refresh_token": { "expiration_type": "non-expiring", "leeway": 0, @@ -11424,45 +8345,9 @@ "idle_token_lifetime": 2592000, "rotation_type": "non-rotating" }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, - "signing_keys": [ - { - "cert": "[REDACTED]", - "pkcs7": "[REDACTED]", - "subject": "deprecated" - } - ], - "client_id": "R9N1M3jJcxlEKpIcm4EX8glA7Krb9h1k", - "callback_url_template": false, - "client_secret": "[REDACTED]", - "jwt_configuration": { - "alg": "RS256", - "lifetime_in_seconds": 36000, - "secret_encoded": false - }, - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", - "grant_types": [ - "client_credentials" - ], - "custom_login_page_on": true - }, - { - "tenant": "auth0-deploy-cli-e2e", - "global": false, - "is_token_endpoint_ip_header_trusted": false, - "name": "Test SPA", + "cross_origin_authentication": true, "allowed_clients": [], - "allowed_logout_urls": [ - "http://localhost:3000" - ], - "callbacks": [ - "http://localhost:3000" - ], - "client_metadata": {}, - "is_first_party": true, + "callbacks": [], "native_social_login": { "apple": { "enabled": false @@ -11471,19 +8356,6 @@ "enabled": false } }, - "oidc_conformant": true, - "refresh_token": { - "expiration_type": "expiring", - "leeway": 0, - "token_lifetime": 2592000, - "idle_token_lifetime": 1296000, - "infinite_token_lifetime": false, - "infinite_idle_token_lifetime": false, - "rotation_type": "rotating" - }, - "sso_disabled": false, - "cross_origin_authentication": false, - "cross_origin_auth": false, "signing_keys": [ { "cert": "[REDACTED]", @@ -11491,7 +8363,7 @@ "subject": "deprecated" } ], - "client_id": "9ztJ1ZaM0iTa9eR2Ga08KOrwBNqNuRmr", + "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -11500,43 +8372,31 @@ "secret_encoded": false }, "client_aliases": [], - "token_endpoint_auth_method": "none", - "app_type": "spa", + "token_endpoint_auth_method": "client_secret_post", + "app_type": "non_interactive", "grant_types": [ - "authorization_code", + "client_credentials", "implicit", + "authorization_code", "refresh_token" ], - "web_origins": [ - "http://localhost:3000" - ], "custom_login_page_on": true }, { "tenant": "auth0-deploy-cli-e2e", "global": false, "is_token_endpoint_ip_header_trusted": false, - "name": "auth0-deploy-cli-extension", - "allowed_clients": [], + "name": "Default App", "callbacks": [], - "client_metadata": {}, "is_first_party": true, - "native_social_login": { - "apple": { - "enabled": false - }, - "facebook": { - "enabled": false - } - }, "oidc_conformant": true, "refresh_token": { "expiration_type": "non-expiring", "leeway": 0, "infinite_token_lifetime": true, "infinite_idle_token_lifetime": true, - "token_lifetime": 31557600, - "idle_token_lifetime": 2592000, + "token_lifetime": 2592000, + "idle_token_lifetime": 1296000, "rotation_type": "non-rotating" }, "sso_disabled": false, @@ -11549,7 +8409,7 @@ "subject": "deprecated" } ], - "client_id": "8DngHjTrjB57cRXo74zYn4qohnAxjFsG", + "client_id": "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -11557,10 +8417,10 @@ "lifetime_in_seconds": 36000, "secret_encoded": false }, - "client_aliases": [], - "token_endpoint_auth_method": "client_secret_post", - "app_type": "non_interactive", "grant_types": [ + "authorization_code", + "implicit", + "refresh_token", "client_credentials" ], "custom_login_page_on": true @@ -11598,9 +8458,257 @@ "subject": "deprecated" } ], - "client_id": "Isi93ibGHIGwmdYjsLwTOn7Gu7nwxU3V", - "client_secret": "[REDACTED]", - "custom_login_page_on": true + "client_id": "Isi93ibGHIGwmdYjsLwTOn7Gu7nwxU3V", + "client_secret": "[REDACTED]", + "custom_login_page_on": true + } + ] + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/client-grants?take=50", + "body": "", + "status": 200, + "response": { + "client_grants": [ + { + "id": "cgr_pbwejzhwoujrsNE8", + "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", + "audience": "https://auth0-deploy-cli-e2e.us.auth0.com/api/v2/", + "scope": [ + "read:client_grants", + "create:client_grants", + "delete:client_grants", + "update:client_grants", + "read:users", + "update:users", + "delete:users", + "create:users", + "read:users_app_metadata", + "update:users_app_metadata", + "delete:users_app_metadata", + "create:users_app_metadata", + "read:user_custom_blocks", + "create:user_custom_blocks", + "delete:user_custom_blocks", + "create:user_tickets", + "read:clients", + "update:clients", + "delete:clients", + "create:clients", + "read:client_keys", + "update:client_keys", + "delete:client_keys", + "create:client_keys", + "read:client_credentials", + "update:client_credentials", + "delete:client_credentials", + "create:client_credentials", + "read:connections", + "update:connections", + "delete:connections", + "create:connections", + "read:resource_servers", + "update:resource_servers", + "delete:resource_servers", + "create:resource_servers", + "read:device_credentials", + "update:device_credentials", + "delete:device_credentials", + "create:device_credentials", + "read:rules", + "update:rules", + "delete:rules", + "create:rules", + "read:rules_configs", + "update:rules_configs", + "delete:rules_configs", + "read:hooks", + "update:hooks", + "delete:hooks", + "create:hooks", + "read:actions", + "update:actions", + "delete:actions", + "create:actions", + "read:email_provider", + "update:email_provider", + "delete:email_provider", + "create:email_provider", + "blacklist:tokens", + "read:stats", + "read:insights", + "read:tenant_settings", + "update:tenant_settings", + "read:logs", + "read:logs_users", + "read:shields", + "create:shields", + "update:shields", + "delete:shields", + "read:anomaly_blocks", + "delete:anomaly_blocks", + "update:triggers", + "read:triggers", + "read:grants", + "delete:grants", + "read:guardian_factors", + "update:guardian_factors", + "read:guardian_enrollments", + "delete:guardian_enrollments", + "create:guardian_enrollment_tickets", + "read:user_idp_tokens", + "create:passwords_checking_job", + "delete:passwords_checking_job", + "read:custom_domains", + "delete:custom_domains", + "create:custom_domains", + "update:custom_domains", + "read:email_templates", + "create:email_templates", + "update:email_templates", + "read:mfa_policies", + "update:mfa_policies", + "read:roles", + "create:roles", + "delete:roles", + "update:roles", + "read:prompts", + "update:prompts", + "read:branding", + "update:branding", + "delete:branding", + "read:log_streams", + "create:log_streams", + "delete:log_streams", + "update:log_streams", + "create:signing_keys", + "read:signing_keys", + "update:signing_keys", + "read:limits", + "update:limits", + "create:role_members", + "read:role_members", + "delete:role_members", + "read:entitlements", + "read:attack_protection", + "update:attack_protection", + "read:organizations_summary", + "create:authentication_methods", + "read:authentication_methods", + "update:authentication_methods", + "delete:authentication_methods", + "read:organizations", + "update:organizations", + "create:organizations", + "delete:organizations", + "read:organization_discovery_domains", + "update:organization_discovery_domains", + "create:organization_discovery_domains", + "delete:organization_discovery_domains", + "create:organization_members", + "read:organization_members", + "delete:organization_members", + "create:organization_connections", + "read:organization_connections", + "update:organization_connections", + "delete:organization_connections", + "create:organization_member_roles", + "read:organization_member_roles", + "delete:organization_member_roles", + "create:organization_invitations", + "read:organization_invitations", + "delete:organization_invitations", + "read:scim_config", + "create:scim_config", + "update:scim_config", + "delete:scim_config", + "create:scim_token", + "read:scim_token", + "delete:scim_token", + "delete:phone_providers", + "create:phone_providers", + "read:phone_providers", + "update:phone_providers", + "delete:phone_templates", + "create:phone_templates", + "read:phone_templates", + "update:phone_templates", + "create:encryption_keys", + "read:encryption_keys", + "update:encryption_keys", + "delete:encryption_keys", + "read:sessions", + "update:sessions", + "delete:sessions", + "read:refresh_tokens", + "delete:refresh_tokens", + "create:self_service_profiles", + "read:self_service_profiles", + "update:self_service_profiles", + "delete:self_service_profiles", + "create:sso_access_tickets", + "delete:sso_access_tickets", + "read:forms", + "update:forms", + "delete:forms", + "create:forms", + "read:flows", + "update:flows", + "delete:flows", + "create:flows", + "read:flows_vault", + "read:flows_vault_connections", + "update:flows_vault_connections", + "delete:flows_vault_connections", + "create:flows_vault_connections", + "read:flows_executions", + "delete:flows_executions", + "read:connections_options", + "update:connections_options", + "read:self_service_profile_custom_texts", + "update:self_service_profile_custom_texts", + "create:network_acls", + "update:network_acls", + "read:network_acls", + "delete:network_acls", + "delete:vdcs_templates", + "read:vdcs_templates", + "create:vdcs_templates", + "update:vdcs_templates", + "create:custom_signing_keys", + "read:custom_signing_keys", + "update:custom_signing_keys", + "delete:custom_signing_keys", + "read:federated_connections_tokens", + "delete:federated_connections_tokens", + "create:user_attribute_profiles", + "read:user_attribute_profiles", + "update:user_attribute_profiles", + "delete:user_attribute_profiles", + "read:event_streams", + "create:event_streams", + "delete:event_streams", + "update:event_streams", + "read:event_deliveries", + "update:event_deliveries", + "create:connection_profiles", + "read:connection_profiles", + "update:connection_profiles", + "delete:connection_profiles", + "read:organization_client_grants", + "create:organization_client_grants", + "delete:organization_client_grants", + "read:security_metrics", + "read:connections_keys", + "update:connections_keys", + "create:connections_keys" + ], + "subject_type": "client" } ] }, @@ -11609,44 +8717,25 @@ }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "PATCH", - "path": "/api/v2/organizations/org_dg75TodzDZQ3yqAV", - "body": { - "display_name": "Organization2" - }, + "method": "GET", + "path": "/api/v2/log-streams", + "body": "", "status": 200, - "response": { - "id": "org_dg75TodzDZQ3yqAV", - "display_name": "Organization2", - "name": "org2" - }, + "response": [], "rawHeaders": [], "responseIsBinary": false }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "PATCH", - "path": "/api/v2/organizations/org_GDDGaXDUPC3vLmot", - "body": { - "branding": { - "colors": { - "page_background": "#fff5f5", - "primary": "#57ddff" - } - }, - "display_name": "Organization" - }, + "method": "GET", + "path": "/api/v2/flows/vault/connections?page=0&per_page=50&include_totals=true", + "body": "", "status": 200, "response": { - "branding": { - "colors": { - "page_background": "#fff5f5", - "primary": "#57ddff" - } - }, - "id": "org_GDDGaXDUPC3vLmot", - "display_name": "Organization", - "name": "org1" + "limit": 50, + "start": 0, + "total": 0, + "connections": [] }, "rawHeaders": [], "responseIsBinary": false @@ -11654,99 +8743,14 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/log-streams", + "path": "/api/v2/flows/vault/connections?page=1&per_page=50&include_totals=true", "body": "", "status": 200, - "response": [ - { - "id": "lst_0000000000025369", - "name": "Suspended DD Log Stream", - "type": "datadog", - "status": "active", - "sink": { - "datadogApiKey": "some-sensitive-api-key", - "datadogRegion": "us" - }, - "isPriority": false - }, - { - "id": "lst_0000000000025370", - "name": "Amazon EventBridge", - "type": "eventbridge", - "status": "active", - "sink": { - "awsAccountId": "123456789012", - "awsRegion": "us-east-2", - "awsPartnerEventSource": "aws.partner/auth0.com/auth0-deploy-cli-e2e-cfc5325e-4577-409f-8e7b-2e4a664cb6ff/auth0.logs" - }, - "filters": [ - { - "type": "category", - "name": "auth.login.success" - }, - { - "type": "category", - "name": "auth.login.notification" - }, - { - "type": "category", - "name": "auth.login.fail" - }, - { - "type": "category", - "name": "auth.signup.success" - }, - { - "type": "category", - "name": "auth.logout.success" - }, - { - "type": "category", - "name": "auth.logout.fail" - }, - { - "type": "category", - "name": "auth.silent_auth.fail" - }, - { - "type": "category", - "name": "auth.silent_auth.success" - }, - { - "type": "category", - "name": "auth.token_exchange.fail" - } - ], - "isPriority": false - } - ], - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "PATCH", - "path": "/api/v2/log-streams/lst_0000000000025369", - "body": { - "name": "Suspended DD Log Stream", - "isPriority": false, - "sink": { - "datadogApiKey": "##LOGSTREAMS_DATADOG_SECRET##", - "datadogRegion": "us" - }, - "status": "active" - }, - "status": 200, "response": { - "id": "lst_0000000000025369", - "name": "Suspended DD Log Stream", - "type": "datadog", - "status": "active", - "sink": { - "datadogApiKey": "##LOGSTREAMS_DATADOG_SECRET##", - "datadogRegion": "us" - }, - "isPriority": false + "limit": 50, + "start": 50, + "total": 0, + "connections": [] }, "rawHeaders": [], "responseIsBinary": false @@ -11754,100 +8758,71 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "PATCH", - "path": "/api/v2/log-streams/lst_0000000000025370", + "path": "/api/v2/actions/triggers/custom-phone-provider/bindings", "body": { - "name": "Amazon EventBridge", - "filters": [ - { - "type": "category", - "name": "auth.login.success" - }, - { - "type": "category", - "name": "auth.login.notification" - }, - { - "type": "category", - "name": "auth.login.fail" - }, - { - "type": "category", - "name": "auth.signup.success" - }, - { - "type": "category", - "name": "auth.logout.success" - }, - { - "type": "category", - "name": "auth.logout.fail" - }, - { - "type": "category", - "name": "auth.silent_auth.fail" - }, - { - "type": "category", - "name": "auth.silent_auth.success" - }, + "bindings": [ { - "type": "category", - "name": "auth.token_exchange.fail" + "ref": { + "type": "action_name", + "value": "Custom Phone Provider" + }, + "display_name": "Custom Phone Provider" } - ], - "isPriority": false, - "status": "active" + ] }, "status": 200, "response": { - "id": "lst_0000000000025370", - "name": "Amazon EventBridge", - "type": "eventbridge", - "status": "active", - "sink": { - "awsAccountId": "123456789012", - "awsRegion": "us-east-2", - "awsPartnerEventSource": "aws.partner/auth0.com/auth0-deploy-cli-e2e-cfc5325e-4577-409f-8e7b-2e4a664cb6ff/auth0.logs" - }, - "filters": [ - { - "type": "category", - "name": "auth.login.success" - }, - { - "type": "category", - "name": "auth.login.notification" - }, - { - "type": "category", - "name": "auth.login.fail" - }, - { - "type": "category", - "name": "auth.signup.success" - }, - { - "type": "category", - "name": "auth.logout.success" - }, - { - "type": "category", - "name": "auth.logout.fail" - }, + "bindings": [ { - "type": "category", - "name": "auth.silent_auth.fail" - }, - { - "type": "category", - "name": "auth.silent_auth.success" - }, - { - "type": "category", - "name": "auth.token_exchange.fail" + "id": "8685b798-7d18-47d3-9b3b-d1854a4525d0", + "trigger_id": "custom-phone-provider", + "action": { + "id": "ead7d2a3-5a93-43e2-9ec3-455f3c39daf9", + "name": "Custom Phone Provider", + "supported_triggers": [ + { + "id": "custom-phone-provider", + "version": "v1" + } + ], + "created_at": "2025-12-16T10:10:30.752146844Z", + "updated_at": "2025-12-16T10:11:36.902340019Z", + "current_version": { + "id": "83a87aec-f6f7-42bb-b6ad-6fa170f652d1", + "code": "/**\n* Handler to be executed while sending a phone notification\n* @param {Event} event - Details about the user and the context in which they are logging in.\n* @param {CustomPhoneProviderAPI} api - Methods and utilities to help change the behavior of sending a phone notification.\n*/\nexports.onExecuteCustomPhoneProvider = async (event, api) => {\n // Code goes here\n return;\n};", + "runtime": "node22", + "status": "BUILT", + "number": 2, + "build_time": "2025-12-16T10:11:37.710742601Z", + "created_at": "2025-12-16T10:11:37.627490560Z", + "updated_at": "2025-12-16T10:11:37.712144713Z" + }, + "deployed_version": { + "code": "/**\n* Handler to be executed while sending a phone notification\n* @param {Event} event - Details about the user and the context in which they are logging in.\n* @param {CustomPhoneProviderAPI} api - Methods and utilities to help change the behavior of sending a phone notification.\n*/\nexports.onExecuteCustomPhoneProvider = async (event, api) => {\n // Code goes here\n return;\n};", + "dependencies": [], + "id": "83a87aec-f6f7-42bb-b6ad-6fa170f652d1", + "deployed": true, + "number": 2, + "built_at": "2025-12-16T10:11:37.710742601Z", + "secrets": [], + "status": "built", + "created_at": "2025-12-16T10:11:37.627490560Z", + "updated_at": "2025-12-16T10:11:37.712144713Z", + "runtime": "node22", + "supported_triggers": [ + { + "id": "custom-phone-provider", + "version": "v1" + } + ] + }, + "all_changes_deployed": false + }, + "created_at": "2025-12-16T10:11:56.497757149Z", + "updated_at": "2025-12-16T10:11:56.497757149Z", + "display_name": "Custom Phone Provider" } - ], - "isPriority": false + ] }, "rawHeaders": [], "responseIsBinary": false @@ -11855,11 +8830,11 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/flows/vault/connections?page=0&per_page=100&include_totals=true", + "path": "/api/v2/flows/vault/connections?page=0&per_page=50&include_totals=true", "body": "", "status": 200, "response": { - "limit": 100, + "limit": 50, "start": 0, "total": 0, "connections": [] @@ -11870,12 +8845,12 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/flows/vault/connections?page=0&per_page=100&include_totals=true", + "path": "/api/v2/flows/vault/connections?page=1&per_page=50&include_totals=true", "body": "", "status": 200, "response": { - "limit": 100, - "start": 0, + "limit": 50, + "start": 50, "total": 0, "connections": [] }, @@ -11885,14 +8860,14 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/flows?page=0&per_page=100&include_totals=true", + "path": "/api/v2/flows/vault/connections?page=0&per_page=50&include_totals=true", "body": "", "status": 200, "response": { - "limit": 100, + "limit": 50, "start": 0, "total": 0, - "flows": [] + "connections": [] }, "rawHeaders": [], "responseIsBinary": false @@ -11900,14 +8875,14 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/flows/vault/connections?page=0&per_page=100&include_totals=true", + "path": "/api/v2/flows?page=0&per_page=100&include_totals=true", "body": "", "status": 200, "response": { "limit": 100, "start": 0, "total": 0, - "connections": [] + "flows": [] }, "rawHeaders": [], "responseIsBinary": false @@ -11915,14 +8890,14 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/flows?page=0&per_page=100&include_totals=true", + "path": "/api/v2/flows/vault/connections?page=1&per_page=50&include_totals=true", "body": "", "status": 200, "response": { - "limit": 100, - "start": 0, + "limit": 50, + "start": 50, "total": 0, - "flows": [] + "connections": [] }, "rawHeaders": [], "responseIsBinary": false @@ -11958,13 +8933,28 @@ "name": "Blank-form", "flow_count": 0, "created_at": "2024-11-26T11:58:18.187Z", - "updated_at": "2025-12-04T10:12:36.577Z" + "updated_at": "2025-12-16T09:02:21.881Z" } ] }, "rawHeaders": [], "responseIsBinary": false }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/flows?page=0&per_page=100&include_totals=true", + "body": "", + "status": 200, + "response": { + "limit": 100, + "start": 0, + "total": 0, + "flows": [] + }, + "rawHeaders": [], + "responseIsBinary": false + }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", @@ -12029,7 +9019,7 @@ } }, "created_at": "2024-11-26T11:58:18.187Z", - "updated_at": "2025-12-04T10:12:36.577Z" + "updated_at": "2025-12-16T09:02:21.881Z" }, "rawHeaders": [], "responseIsBinary": false @@ -12154,7 +9144,7 @@ } }, "created_at": "2024-11-26T11:58:18.187Z", - "updated_at": "2025-12-04T10:20:56.180Z" + "updated_at": "2025-12-16T10:11:59.715Z" }, "rawHeaders": [], "responseIsBinary": false diff --git a/test/e2e/recordings/should-dump-without-throwing-an-error.json b/test/e2e/recordings/should-dump-without-throwing-an-error.json index bb67c3228..de43f4e1d 100644 --- a/test/e2e/recordings/should-dump-without-throwing-an-error.json +++ b/test/e2e/recordings/should-dump-without-throwing-an-error.json @@ -1089,6 +1089,22 @@ "value": "delete:organization_client_grants", "description": "Delete Organization Client Grants" }, + { + "value": "create:token_exchange_profiles", + "description": "Create Token Exchange Profile" + }, + { + "value": "read:token_exchange_profiles", + "description": "Read Token Exchange Profiles" + }, + { + "value": "update:token_exchange_profiles", + "description": "Update Token Exchange Profile" + }, + { + "value": "delete:token_exchange_profiles", + "description": "Delete Token Exchange Profile" + }, { "value": "read:security_metrics", "description": "Read Security Metrics" @@ -1185,7 +1201,6 @@ "is_token_endpoint_ip_header_trusted": false, "name": "Default App", "callbacks": [], - "cross_origin_auth": false, "is_first_party": true, "oidc_conformant": true, "refresh_token": { @@ -1199,6 +1214,7 @@ }, "sso_disabled": false, "cross_origin_authentication": false, + "cross_origin_auth": false, "signing_keys": [ { "cert": "[REDACTED]", @@ -1206,7 +1222,7 @@ "subject": "deprecated" } ], - "client_id": "RKfFTGiVl5FTSXkp7hJfJfd16GLBCxgy", + "client_id": "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -1230,16 +1246,13 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections?include_totals=true&strategy=auth0", + "path": "/api/v2/connections?take=50&strategy=auth0", "body": "", "status": 200, "response": { - "total": 1, - "start": 0, - "limit": 50, "connections": [ { - "id": "con_3yHvIURwH6gXdMEE", + "id": "con_3R2lX4rln4ArocW5", "options": { "mfa": { "active": true, @@ -1257,7 +1270,8 @@ "enabled": false }, "password": { - "enabled": true + "enabled": true, + "api_behavior": "required" } }, "brute_force_protection": true @@ -1275,8 +1289,8 @@ "Username-Password-Authentication" ], "enabled_clients": [ - "RKfFTGiVl5FTSXkp7hJfJfd16GLBCxgy", - "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE" + "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", + "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" ] } ] @@ -1287,67 +1301,13 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections?include_totals=true&take=50&strategy=auth0", - "body": "", - "status": 200, - "response": { - "connections": [ - { - "id": "con_3yHvIURwH6gXdMEE", - "options": { - "mfa": { - "active": true, - "return_enroll_settings": true - }, - "passwordPolicy": "good", - "passkey_options": { - "challenge_ui": "both", - "local_enrollment_enabled": true, - "progressive_enrollment_enabled": true - }, - "strategy_version": 2, - "authentication_methods": { - "passkey": { - "enabled": false - }, - "password": { - "enabled": true - } - }, - "brute_force_protection": true - }, - "strategy": "auth0", - "name": "Username-Password-Authentication", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "Username-Password-Authentication" - ], - "enabled_clients": [ - "RKfFTGiVl5FTSXkp7hJfJfd16GLBCxgy", - "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE" - ] - } - ] - }, - "rawHeaders": [], - "responseIsBinary": false - }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/connections/con_3yHvIURwH6gXdMEE/clients?take=50", + "path": "/api/v2/connections/con_3R2lX4rln4ArocW5/clients?take=50", "body": "", "status": 200, "response": { "clients": [ { - "client_id": "RKfFTGiVl5FTSXkp7hJfJfd16GLBCxgy" + "client_id": "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" }, { "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE" @@ -1360,54 +1320,16 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections?include_totals=true", + "path": "/api/v2/connections/con_3R2lX4rln4ArocW5/clients?take=50", "body": "", "status": 200, "response": { - "total": 1, - "start": 0, - "limit": 50, - "connections": [ + "clients": [ { - "id": "con_3yHvIURwH6gXdMEE", - "options": { - "mfa": { - "active": true, - "return_enroll_settings": true - }, - "passwordPolicy": "good", - "passkey_options": { - "challenge_ui": "both", - "local_enrollment_enabled": true, - "progressive_enrollment_enabled": true - }, - "strategy_version": 2, - "authentication_methods": { - "passkey": { - "enabled": false - }, - "password": { - "enabled": true - } - }, - "brute_force_protection": true - }, - "strategy": "auth0", - "name": "Username-Password-Authentication", - "is_domain_connection": false, - "authentication": { - "active": true - }, - "connected_accounts": { - "active": false - }, - "realms": [ - "Username-Password-Authentication" - ], - "enabled_clients": [ - "RKfFTGiVl5FTSXkp7hJfJfd16GLBCxgy", - "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE" - ] + "client_id": "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" + }, + { + "client_id": "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE" } ] }, @@ -1417,13 +1339,13 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connections?include_totals=true&take=50", + "path": "/api/v2/connections?take=50", "body": "", "status": 200, "response": { "connections": [ { - "id": "con_3yHvIURwH6gXdMEE", + "id": "con_3R2lX4rln4ArocW5", "options": { "mfa": { "active": true, @@ -1441,7 +1363,8 @@ "enabled": false }, "password": { - "enabled": true + "enabled": true, + "api_behavior": "required" } }, "brute_force_protection": true @@ -1459,8 +1382,8 @@ "Username-Password-Authentication" ], "enabled_clients": [ - "RKfFTGiVl5FTSXkp7hJfJfd16GLBCxgy", - "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE" + "Vp0gMRF8PtMzekil38qWoj4Fjw2VjRZE", + "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V" ] } ] @@ -1558,17 +1481,18 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/email-templates/verify_email", + "path": "/api/v2/email-templates/welcome_email", "body": "", "status": 200, "response": { - "template": "verify_email", - "body": "\n \n \n \n \n
\n \n \n \n
\n \n \n

\n\n

Welcome to {{ application.name}}!

\n\n

\n Thank you for signing up. Please verify your email address by clicking the following\n link:\n

\n\n

Confirm my account

\n\n

\n If you are having any issues with your account, please don’t hesitate to contact us\n by replying to this mail.\n

\n\n
\n Haha!!!\n
\n\n {{ application.name }}\n\n

\n
\n \n If you did not make this request, please contact us by replying to this mail.\n

\n
\n \n \n \n
\n \n\n", + "template": "welcome_email", + "body": "\n \n

Welcome!

\n \n\n", "from": "", - "subject": "", + "resultUrl": "https://example.com/welcome", + "subject": "Welcome", "syntax": "liquid", - "urlLifetimeInSeconds": 432000, - "enabled": true + "urlLifetimeInSeconds": 3600, + "enabled": false }, "rawHeaders": [], "responseIsBinary": false @@ -1576,7 +1500,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/email-templates/enrollment_email", + "path": "/api/v2/email-templates/password_reset", "body": "", "status": 404, "response": { @@ -1606,7 +1530,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/email-templates/stolen_credentials", + "path": "/api/v2/email-templates/async_approval", "body": "", "status": 404, "response": { @@ -1621,7 +1545,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/email-templates/mfa_oob_code", + "path": "/api/v2/email-templates/reset_email_by_code", "body": "", "status": 404, "response": { @@ -1636,7 +1560,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/email-templates/async_approval", + "path": "/api/v2/email-templates/blocked_account", "body": "", "status": 404, "response": { @@ -1651,7 +1575,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/email-templates/password_reset", + "path": "/api/v2/email-templates/user_invitation", "body": "", "status": 404, "response": { @@ -1666,18 +1590,14 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/email-templates/welcome_email", + "path": "/api/v2/email-templates/stolen_credentials", "body": "", - "status": 200, + "status": 404, "response": { - "template": "welcome_email", - "body": "\n \n

Welcome!

\n \n\n", - "from": "", - "resultUrl": "https://example.com/welcome", - "subject": "Welcome", - "syntax": "liquid", - "urlLifetimeInSeconds": 3600, - "enabled": false + "statusCode": 404, + "error": "Not Found", + "message": "The template does not exist.", + "errorCode": "inexistent_email_template" }, "rawHeaders": [], "responseIsBinary": false @@ -1685,7 +1605,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/email-templates/blocked_account", + "path": "/api/v2/email-templates/change_password", "body": "", "status": 404, "response": { @@ -1700,7 +1620,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/email-templates/reset_email", + "path": "/api/v2/email-templates/mfa_oob_code", "body": "", "status": 404, "response": { @@ -1715,7 +1635,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/email-templates/user_invitation", + "path": "/api/v2/email-templates/enrollment_email", "body": "", "status": 404, "response": { @@ -1730,14 +1650,17 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/email-templates/change_password", + "path": "/api/v2/email-templates/verify_email", "body": "", - "status": 404, + "status": 200, "response": { - "statusCode": 404, - "error": "Not Found", - "message": "The template does not exist.", - "errorCode": "inexistent_email_template" + "template": "verify_email", + "body": "\n \n \n \n \n
\n \n \n \n
\n \n \n

\n\n

Welcome to {{ application.name}}!

\n\n

\n Thank you for signing up. Please verify your email address by clicking the following\n link:\n

\n\n

Confirm my account

\n\n

\n If you are having any issues with your account, please don’t hesitate to contact us\n by replying to this mail.\n

\n\n
\n Haha!!!\n
\n\n {{ application.name }}\n\n

\n
\n \n If you did not make this request, please contact us by replying to this mail.\n

\n
\n \n \n \n
\n \n\n", + "from": "", + "subject": "", + "syntax": "liquid", + "urlLifetimeInSeconds": 432000, + "enabled": true }, "rawHeaders": [], "responseIsBinary": false @@ -1745,7 +1668,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/email-templates/reset_email_by_code", + "path": "/api/v2/email-templates/reset_email", "body": "", "status": 404, "response": { @@ -1760,13 +1683,10 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/client-grants?per_page=100&page=0&include_totals=true", + "path": "/api/v2/client-grants?take=50", "body": "", "status": 200, "response": { - "total": 1, - "start": 0, - "limit": 100, "client_grants": [ { "id": "cgr_pbwejzhwoujrsNE8", @@ -2174,7 +2094,101 @@ "body": "", "status": 200, "response": { - "providers": [] + "providers": [ + { + "id": "pro_mY3L5BP6iVUUzpv22opofm", + "tenant": "auth0-deploy-cli-e2e", + "name": "custom", + "channel": "phone", + "disabled": false, + "configuration": { + "delivery_methods": [ + "text" + ] + }, + "credentials": null, + "created_at": "2025-12-09T12:24:00.604Z", + "updated_at": "2025-12-16T08:58:34.717Z" + } + ] + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/branding/phone/templates", + "body": "", + "status": 200, + "response": { + "templates": [ + { + "id": "tem_xqbUSF83fpnRv8r8rqXFDZ", + "tenant": "auth0-deploy-cli-e2e", + "channel": "phone", + "type": "change_password", + "disabled": false, + "created_at": "2025-12-09T12:26:20.243Z", + "updated_at": "2025-12-16T08:58:36.831Z", + "content": { + "syntax": "liquid", + "body": { + "text": "{{ code | escape }} is your password change code for {{ friendly_name | escape }}", + "voice": "Hello. Your password change code for {{ friendly_name | escape }} is {{ pause }} {{ code | escape }}. I repeat, your password change code is {{ pause }} {{ code | escape }}" + } + } + }, + { + "id": "tem_dL83uTmWn8moGzm8UgAk4Q", + "tenant": "auth0-deploy-cli-e2e", + "channel": "phone", + "type": "blocked_account", + "disabled": false, + "created_at": "2025-12-09T12:22:47.683Z", + "updated_at": "2025-12-16T08:58:36.736Z", + "content": { + "syntax": "liquid", + "body": { + "text": "We detected suspicious activity on your account from the ip {{user.source_ip}}{% if user.city %} from {{user.city}}, {{user.country}}{% elsif user.country %} from {{user.country}}{% endif %}. Logins from this IP have been blocked on your account. If this is your IP, please reset your password to unblock your account. Otherwise, disregard this message.", + "voice": "We detected suspicious activity on your account from the ip {{user.source_ip}}{% if user.city %} from {{user.city}}, {{user.country}}{% elsif user.country %} from {{user.country}}{% endif %}. Logins from this IP have been blocked on your account. If this is your IP, please reset your password to unblock your account. Otherwise, disregard this message." + }, + "from": "0032232323" + } + }, + { + "id": "tem_o4LBTt4NQyX8K4vC9dPafR", + "tenant": "auth0-deploy-cli-e2e", + "channel": "phone", + "type": "otp_verify", + "disabled": false, + "created_at": "2025-12-09T12:26:30.547Z", + "updated_at": "2025-12-16T08:58:37.073Z", + "content": { + "syntax": "liquid", + "body": { + "text": "{{ code | escape }} is your verification code for {{ friendly_name | escape }}", + "voice": "Hello. Your verification code for {{ friendly_name | escape }} is {{ pause }} {{ code | escape }}. I repeat, your verification code is {{ pause }} {{ code | escape }}" + } + } + }, + { + "id": "tem_qarYST5TTE5pbMNB5NHZAj", + "tenant": "auth0-deploy-cli-e2e", + "channel": "phone", + "type": "otp_enroll", + "disabled": false, + "created_at": "2025-12-09T12:26:25.327Z", + "updated_at": "2025-12-16T08:58:36.804Z", + "content": { + "syntax": "liquid", + "body": { + "text": "{{ code | escape }} is your verification code for {{ friendly_name | escape }}. Please enter this code to verify your enrollment.", + "voice": "Hello. Your verification code for {{ friendly_name | escape }} is {{ pause }} {{ code | escape }}. I repeat, your verification code is {{ pause }} {{ code | escape }}" + } + } + } + ] }, "rawHeaders": [], "responseIsBinary": false @@ -2267,7 +2281,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/prompts/login/custom-text/en", + "path": "/api/v2/prompts/login-id/custom-text/en", "body": "", "status": 200, "response": {}, @@ -2277,7 +2291,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/prompts/login-id/custom-text/en", + "path": "/api/v2/prompts/login/custom-text/en", "body": "", "status": 200, "response": {}, @@ -2457,7 +2471,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/prompts/mfa-webauthn/custom-text/en", + "path": "/api/v2/prompts/mfa-phone/custom-text/en", "body": "", "status": 200, "response": {}, @@ -2467,7 +2481,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/prompts/mfa-phone/custom-text/en", + "path": "/api/v2/prompts/mfa-webauthn/custom-text/en", "body": "", "status": 200, "response": {}, @@ -2604,6 +2618,16 @@ "rawHeaders": [], "responseIsBinary": false }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/prompts/brute-force-protection/custom-text/en", + "body": "", + "status": 200, + "response": {}, + "rawHeaders": [], + "responseIsBinary": false + }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", @@ -2637,7 +2661,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/prompts/login-passwordless/partials", + "path": "/api/v2/prompts/signup/partials", "body": "", "status": 200, "response": {}, @@ -2647,7 +2671,7 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/prompts/signup/partials", + "path": "/api/v2/prompts/login-passwordless/partials", "body": "", "status": 200, "response": {}, @@ -2674,6 +2698,21 @@ "rawHeaders": [], "responseIsBinary": false }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/prompts/rendering?page=0&per_page=100&include_totals=true", + "body": "", + "status": 200, + "response": { + "configs": [], + "start": 0, + "limit": 100, + "total": 0 + }, + "rawHeaders": [], + "responseIsBinary": false + }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", @@ -2695,23 +2734,12 @@ "status": 200, "response": { "triggers": [ - { - "id": "post-login", - "version": "v2", - "status": "DEPRECATED", - "runtimes": [ - "node12", - "node18" - ], - "default_runtime": "node16", - "binding_policy": "trigger-bound", - "compatible_triggers": [] - }, { "id": "post-login", "version": "v3", "status": "CURRENT", "runtimes": [ + "node12", "node18-actions", "node22" ], @@ -2724,6 +2752,17 @@ } ] }, + { + "id": "post-login", + "version": "v2", + "status": "DEPRECATED", + "runtimes": [ + "node18" + ], + "default_runtime": "node16", + "binding_policy": "trigger-bound", + "compatible_triggers": [] + }, { "id": "credentials-exchange", "version": "v2", @@ -2742,6 +2781,7 @@ "version": "v2", "status": "CURRENT", "runtimes": [ + "node12", "node18-actions", "node22" ], @@ -2749,22 +2789,12 @@ "binding_policy": "trigger-bound", "compatible_triggers": [] }, - { - "id": "post-user-registration", - "version": "v1", - "status": "DEPRECATED", - "runtimes": [ - "node12" - ], - "default_runtime": "node12", - "binding_policy": "trigger-bound", - "compatible_triggers": [] - }, { "id": "post-user-registration", "version": "v2", "status": "CURRENT", "runtimes": [ + "node12", "node18-actions", "node22" ], @@ -2790,6 +2820,7 @@ "version": "v2", "status": "CURRENT", "runtimes": [ + "node12", "node18-actions", "node22" ], @@ -2867,6 +2898,17 @@ "default_runtime": "node22", "binding_policy": "entity-bound", "compatible_triggers": [] + }, + { + "id": "password-hash-migration", + "version": "v1", + "status": "CURRENT", + "runtimes": [ + "node22" + ], + "default_runtime": "node22", + "binding_policy": "entity-bound", + "compatible_triggers": [] } ] }, @@ -2876,12 +2918,12 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/actions/triggers/post-login/bindings", + "path": "/api/v2/actions/triggers/post-login/bindings?page=0&per_page=50", "body": "", "status": 200, "response": { "bindings": [], - "per_page": 20 + "per_page": 50 }, "rawHeaders": [], "responseIsBinary": false @@ -2889,12 +2931,12 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/actions/triggers/credentials-exchange/bindings", + "path": "/api/v2/actions/triggers/credentials-exchange/bindings?page=0&per_page=50", "body": "", "status": 200, "response": { "bindings": [], - "per_page": 20 + "per_page": 50 }, "rawHeaders": [], "responseIsBinary": false @@ -2902,12 +2944,12 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/actions/triggers/pre-user-registration/bindings", + "path": "/api/v2/actions/triggers/pre-user-registration/bindings?page=0&per_page=50", "body": "", "status": 200, "response": { "bindings": [], - "per_page": 20 + "per_page": 50 }, "rawHeaders": [], "responseIsBinary": false @@ -2915,12 +2957,12 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/actions/triggers/post-user-registration/bindings", + "path": "/api/v2/actions/triggers/post-user-registration/bindings?page=0&per_page=50", "body": "", "status": 200, "response": { "bindings": [], - "per_page": 20 + "per_page": 50 }, "rawHeaders": [], "responseIsBinary": false @@ -2928,12 +2970,12 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/actions/triggers/post-change-password/bindings", + "path": "/api/v2/actions/triggers/post-change-password/bindings?page=0&per_page=50", "body": "", "status": 200, "response": { "bindings": [], - "per_page": 20 + "per_page": 50 }, "rawHeaders": [], "responseIsBinary": false @@ -2941,12 +2983,12 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/actions/triggers/send-phone-message/bindings", + "path": "/api/v2/actions/triggers/send-phone-message/bindings?page=0&per_page=50", "body": "", "status": 200, "response": { "bindings": [], - "per_page": 20 + "per_page": 50 }, "rawHeaders": [], "responseIsBinary": false @@ -2954,12 +2996,12 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/actions/triggers/password-reset-post-challenge/bindings", + "path": "/api/v2/actions/triggers/password-reset-post-challenge/bindings?page=0&per_page=50", "body": "", "status": 200, "response": { "bindings": [], - "per_page": 20 + "per_page": 50 }, "rawHeaders": [], "responseIsBinary": false @@ -2967,12 +3009,12 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/actions/triggers/login-post-identifier/bindings", + "path": "/api/v2/actions/triggers/login-post-identifier/bindings?page=0&per_page=50", "body": "", "status": 200, "response": { "bindings": [], - "per_page": 20 + "per_page": 50 }, "rawHeaders": [], "responseIsBinary": false @@ -2980,12 +3022,12 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/actions/triggers/custom-phone-provider/bindings", + "path": "/api/v2/actions/triggers/custom-phone-provider/bindings?page=0&per_page=50", "body": "", "status": 200, "response": { "bindings": [], - "per_page": 20 + "per_page": 50 }, "rawHeaders": [], "responseIsBinary": false @@ -2993,12 +3035,12 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/actions/triggers/custom-email-provider/bindings", + "path": "/api/v2/actions/triggers/custom-email-provider/bindings?page=0&per_page=50", "body": "", "status": 200, "response": { "bindings": [], - "per_page": 20 + "per_page": 50 }, "rawHeaders": [], "responseIsBinary": false @@ -3006,12 +3048,12 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/actions/triggers/custom-token-exchange/bindings", + "path": "/api/v2/actions/triggers/custom-token-exchange/bindings?page=0&per_page=50", "body": "", "status": 200, "response": { "bindings": [], - "per_page": 20 + "per_page": 50 }, "rawHeaders": [], "responseIsBinary": false @@ -3019,12 +3061,12 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/actions/triggers/event-stream/bindings", + "path": "/api/v2/actions/triggers/event-stream/bindings?page=0&per_page=50", "body": "", "status": 200, "response": { "bindings": [], - "per_page": 20 + "per_page": 50 }, "rawHeaders": [], "responseIsBinary": false @@ -3032,14 +3074,24 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/organizations?include_totals=true", + "path": "/api/v2/actions/triggers/password-hash-migration/bindings?page=0&per_page=50", "body": "", "status": 200, "response": { - "organizations": [], - "start": 0, - "limit": 50, - "total": 0 + "bindings": [], + "per_page": 50 + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/organizations?take=50", + "body": "", + "status": 200, + "response": { + "organizations": [] }, "rawHeaders": [], "responseIsBinary": false @@ -3116,7 +3168,6 @@ "is_token_endpoint_ip_header_trusted": false, "name": "Default App", "callbacks": [], - "cross_origin_auth": false, "is_first_party": true, "oidc_conformant": true, "refresh_token": { @@ -3130,6 +3181,7 @@ }, "sso_disabled": false, "cross_origin_authentication": false, + "cross_origin_auth": false, "signing_keys": [ { "cert": "[REDACTED]", @@ -3137,7 +3189,7 @@ "subject": "deprecated" } ], - "client_id": "RKfFTGiVl5FTSXkp7hJfJfd16GLBCxgy", + "client_id": "lWGQK4qxLvwQMGy4l9UWToxrd1cAp03V", "callback_url_template": false, "client_secret": "[REDACTED]", "jwt_configuration": { @@ -3198,11 +3250,18 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/organizations?include_totals=true&take=50", + "path": "/api/v2/attack-protection/brute-force-protection", "body": "", "status": 200, "response": { - "organizations": [] + "enabled": true, + "shields": [ + "block", + "user_notification" + ], + "mode": "count_per_identifier_and_ip", + "allowlist": [], + "max_attempts": 10 }, "rawHeaders": [], "responseIsBinary": false @@ -3230,25 +3289,6 @@ "rawHeaders": [], "responseIsBinary": false }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/attack-protection/brute-force-protection", - "body": "", - "status": 200, - "response": { - "enabled": true, - "shields": [ - "block", - "user_notification" - ], - "mode": "count_per_identifier_and_ip", - "allowlist": [], - "max_attempts": 10 - }, - "rawHeaders": [], - "responseIsBinary": false - }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", @@ -3270,6 +3310,10 @@ "pre-user-registration": { "max_attempts": 50, "rate": 1200 + }, + "pre-custom-token-exchange": { + "max_attempts": 10, + "rate": 600000 } } }, @@ -3348,18 +3392,6 @@ "rawHeaders": [], "responseIsBinary": false }, - { - "scope": "https://deploy-cli-dev.eu.auth0.com:443", - "method": "GET", - "path": "/api/v2/custom-domains?take=50", - "body": "", - "status": 200, - "response": { - "custom_domains": [] - }, - "rawHeaders": [], - "responseIsBinary": false - }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", @@ -3406,7 +3438,7 @@ "name": "Blank-form", "flow_count": 0, "created_at": "2024-11-26T11:58:18.187Z", - "updated_at": "2025-11-19T10:10:09.582Z" + "updated_at": "2025-12-16T09:02:21.881Z" } ] }, @@ -3477,7 +3509,7 @@ } }, "created_at": "2024-11-26T11:58:18.187Z", - "updated_at": "2025-11-19T10:10:09.582Z" + "updated_at": "2025-12-16T09:02:21.881Z" }, "rawHeaders": [], "responseIsBinary": false @@ -3485,14 +3517,14 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/flows/vault/connections?page=0&per_page=100&include_totals=true", + "path": "/api/v2/flows?page=0&per_page=100&include_totals=true", "body": "", "status": 200, "response": { "limit": 100, "start": 0, "total": 0, - "connections": [] + "flows": [] }, "rawHeaders": [], "responseIsBinary": false @@ -3500,14 +3532,14 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/flows?page=0&per_page=100&include_totals=true", + "path": "/api/v2/flows/vault/connections?page=0&per_page=50&include_totals=true", "body": "", "status": 200, "response": { - "limit": 100, + "limit": 50, "start": 0, "total": 0, - "flows": [] + "connections": [] }, "rawHeaders": [], "responseIsBinary": false @@ -3515,11 +3547,26 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/flows/vault/connections?page=0&per_page=100&include_totals=true", + "path": "/api/v2/flows/vault/connections?page=1&per_page=50&include_totals=true", "body": "", "status": 200, "response": { - "limit": 100, + "limit": 50, + "start": 50, + "total": 0, + "connections": [] + }, + "rawHeaders": [], + "responseIsBinary": false + }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/flows/vault/connections?page=0&per_page=50&include_totals=true", + "body": "", + "status": 200, + "response": { + "limit": 50, "start": 0, "total": 0, "connections": [] @@ -3527,6 +3574,21 @@ "rawHeaders": [], "responseIsBinary": false }, + { + "scope": "https://deploy-cli-dev.eu.auth0.com:443", + "method": "GET", + "path": "/api/v2/flows/vault/connections?page=1&per_page=50&include_totals=true", + "body": "", + "status": 200, + "response": { + "limit": 50, + "start": 50, + "total": 0, + "connections": [] + }, + "rawHeaders": [], + "responseIsBinary": false + }, { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", @@ -3556,7 +3618,7 @@ "okta" ], "created_at": "2024-11-26T11:58:18.962Z", - "updated_at": "2025-11-18T04:57:54.740Z", + "updated_at": "2025-12-16T09:02:11.327Z", "branding": { "colors": { "primary": "#19aecc" @@ -3608,7 +3670,7 @@ } }, "created_at": "2025-09-09T04:41:43.671Z", - "updated_at": "2025-11-18T04:57:40.114Z", + "updated_at": "2025-12-16T09:01:55.451Z", "id": "acl_wpZ6oScRU5L6QKAxMUMHmx" } ] @@ -3674,54 +3736,11 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/user-attribute-profiles?take=10", + "path": "/api/v2/connection-profiles?take=10", "body": "", "status": 200, "response": { - "user_attribute_profiles": [ - { - "id": "uap_1csDj3szFsgxGS1oTZTdFm", - "name": "test-user-attribute-profile-2", - "user_id": { - "oidc_mapping": "sub", - "saml_mapping": [ - "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier", - "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn", - "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name" - ], - "scim_mapping": "externalId" - }, - "user_attributes": { - "email": { - "label": "Email", - "description": "Email of the User", - "auth0_mapping": "email", - "profile_required": true - } - } - }, - { - "id": "uap_1csDj3sAVu6n5eTzLw6XZg", - "name": "test-user-attribute-profile", - "user_id": { - "oidc_mapping": "sub", - "saml_mapping": [ - "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier", - "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn", - "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name" - ], - "scim_mapping": "externalId" - }, - "user_attributes": { - "email": { - "label": "Email", - "description": "Email of the User", - "auth0_mapping": "email", - "profile_required": true - } - } - } - ] + "connection_profiles": [] }, "rawHeaders": [], "responseIsBinary": false @@ -3729,14 +3748,14 @@ { "scope": "https://deploy-cli-dev.eu.auth0.com:443", "method": "GET", - "path": "/api/v2/connection-profiles?take=10", + "path": "/api/v2/token-exchange-profiles?take=50", "body": "", "status": 403, "response": { "statusCode": 403, "error": "Forbidden", - "message": "This feature is not enabled for this tenant.", - "errorCode": "feature_not_enabled" + "message": "Insufficient scope, expected any of: read:token_exchange_profiles", + "errorCode": "insufficient_scope" }, "rawHeaders": [], "responseIsBinary": false diff --git a/test/tools/auth0/client.tests.js b/test/tools/auth0/client.tests.js index 5c3fa2a6a..d2b51d112 100644 --- a/test/tools/auth0/client.tests.js +++ b/test/tools/auth0/client.tests.js @@ -14,18 +14,19 @@ describe('#schema validation tests', async () => { const mock = { clients: { - getAll: async (args) => + list: async (args) => new Promise((resolve) => { const localArgs = { ...args }; setTimeout(() => { resolve({ - data: { - start: localArgs.page * localArgs.per_page, + data: clients.slice( + localArgs.page * localArgs.per_page, + (localArgs.page + 1) * localArgs.per_page + ), + response: { total: expectedNbClients, - clients: clients.slice( - localArgs.page * localArgs.per_page, - (localArgs.page + 1) * localArgs.per_page - ), + start: localArgs.page * localArgs.per_page, + limit: localArgs.per_page, }, }); }, 10); @@ -35,7 +36,7 @@ describe('#schema validation tests', async () => { const pagedManager = client(mock); - const allClients = await pagedManager.clients.getAll({ paginate: true }); + const allClients = await pagedManager.clients.list({ paginate: true }); expect(allClients.length).to.eq(expectedNbClients); }); @@ -53,15 +54,16 @@ describe('#schema validation tests', async () => { const mock = { roles: { permissions: { - getAll: async (localArgs) => + list: async (localArgs) => Promise.resolve({ - data: { - start: localArgs.page * localArgs.per_page, + data: permissions.slice( + localArgs.page * localArgs.per_page, + (localArgs.page + 1) * localArgs.per_page + ), + response: { total: expectedNbItems, - permissions: permissions.slice( - localArgs.page * localArgs.per_page, - (localArgs.page + 1) * localArgs.per_page - ), + start: localArgs.page * localArgs.per_page, + limit: localArgs.per_page, }, }), }, @@ -70,7 +72,7 @@ describe('#schema validation tests', async () => { const pagedManager = client(mock); - const rolesPermissions = await pagedManager.roles.permissions.getAll({ paginate: true }); + const rolesPermissions = await pagedManager.roles.permissions.list({ paginate: true }); expect(rolesPermissions.length).to.eq(expectedNbItems); }); }); diff --git a/test/tools/auth0/handlers/actions.tests.js b/test/tools/auth0/handlers/actions.tests.js index 17430ff7d..4b45af888 100644 --- a/test/tools/auth0/handlers/actions.tests.js +++ b/test/tools/auth0/handlers/actions.tests.js @@ -29,7 +29,7 @@ describe('#actions handler', () => { it('should not allow same names', (done) => { const auth0 = { actions: { - getAll: () => ({ data: [] }), + list: () => Promise.resolve({ data: [] }), }, }; @@ -69,7 +69,7 @@ describe('#actions handler', () => { it('should pass validation', async () => { const auth0 = { actions: { - getAll: () => ({ data: [] }), + list: () => Promise.resolve({ data: [] }), }, }; @@ -143,27 +143,25 @@ describe('#actions handler', () => { }, update: () => Promise.resolve({ data: [] }), delete: () => Promise.resolve({ data: [] }), - getAll: () => { - if (!auth0.getAllCalled) { - auth0.getAllCalled = true; + list: () => { + if (!auth0.listCalled) { + auth0.listCalled = true; return Promise.resolve({ data: [] }); } return Promise.resolve({ - data: { - actions: [ - { - name: action.name, - supported_triggers: action.supported_triggers, - id: actionId, - }, - ], - }, + data: [ + { + name: action.name, + supported_triggers: action.supported_triggers, + id: actionId, + }, + ], }); }, createVersion: () => Promise.resolve({ data: version }), }, pool, - getAllCalled: true, + listCalled: true, }; const handler = new actions.default({ client: pageClient(auth0), config }); @@ -204,9 +202,9 @@ describe('#actions handler', () => { create: (data) => Promise.resolve({ data: { ...data, id: actionId } }), update: () => Promise.resolve({ data: [] }), delete: () => Promise.resolve({ data: [] }), - getAll: () => { - if (!auth0.getAllCalled) { - auth0.getAllCalled = true; + list: () => { + if (!auth0.listCalled) { + auth0.listCalled = true; return Promise.resolve(mockPagedData({ include_totals: true }, 'actions', [])); } @@ -221,13 +219,13 @@ describe('#actions handler', () => { ); }, createVersion: () => Promise.resolve({ data: version }), - deploy: (data) => { - expect(data).to.deep.equal({ id: actionId }); + deploy: (id) => { + expect(id).to.equal(actionId); didDeployGetCalled = true; }, }, pool, - getAllCalled: false, + listCalled: false, }; const handler = new actions.default({ client: pageClient(auth0), config }); @@ -261,7 +259,7 @@ describe('#actions handler', () => { const auth0 = { actions: { - getAll: () => mockPagedData({ include_totals: true }, 'actions', actionsData), + list: () => mockPagedData({ include_totals: true }, 'actions', actionsData), }, }; @@ -273,7 +271,7 @@ describe('#actions handler', () => { it('should throw informative error when actions service returns "An internal server error occurred" 500 error', async () => { const auth0 = { actions: { - getAll: () => { + list: () => { const error = new Error(); error.statusCode = 500; error.message = 'An internal server error occurred'; @@ -292,7 +290,7 @@ describe('#actions handler', () => { it('should return an empty array for 501 status code', async () => { const auth0 = { actions: { - getAll: () => { + list: () => { const error = new Error('Feature is not yet implemented'); error.statusCode = 501; throw error; @@ -309,7 +307,7 @@ describe('#actions handler', () => { it('should return an empty array for 404 status code', async () => { const auth0 = { actions: { - getAll: () => { + list: () => { const error = new Error('Not found'); error.statusCode = 404; throw error; @@ -326,7 +324,7 @@ describe('#actions handler', () => { it('should return an empty array when the feature flag is disabled', async () => { const auth0 = { actions: { - getAll: () => { + list: () => { const error = new Error('Not enabled'); error.statusCode = 403; error.originalError = { @@ -350,7 +348,7 @@ describe('#actions handler', () => { it('should throw an error for all other failed requests', async () => { const auth0 = { actions: { - getAll: () => { + list: () => { const error = new Error('Bad request'); error.statusCode = 500; throw error; @@ -373,11 +371,11 @@ describe('#actions handler', () => { create: () => Promise.resolve({ data: [] }), update: () => Promise.resolve({ data: [] }), delete: (data) => { - expect(data).to.be.an('object'); - expect(data.id).to.equal('action-1'); + expect(data).to.be.a('string'); + expect(data).to.equal('action-1'); return Promise.resolve({ data }); }, - getAll: () => + list: () => mockPagedData({ include_totals: true }, 'actions', [ { id: 'action-1', @@ -451,7 +449,7 @@ describe('#actions handler', () => { const auth0 = { actions: { - getAll: () => Promise.resolve({ data: { actions: [marketplaceAction] } }), + list: () => Promise.resolve({ data: [marketplaceAction] }), delete: () => { wasDeleteCalled = true; }, diff --git a/test/tools/auth0/handlers/attackProtection.tests.js b/test/tools/auth0/handlers/attackProtection.tests.js index 91c14e356..259766353 100644 --- a/test/tools/auth0/handlers/attackProtection.tests.js +++ b/test/tools/auth0/handlers/attackProtection.tests.js @@ -6,38 +6,38 @@ describe('#attackProtection handler', () => { it('should fetch attack protection settings', async () => { const auth0 = { attackProtection: { - getBotDetectionConfig: () => ({ - data: { + botDetection: { + get: () => ({ bot_detection_level: 'medium', monitoring_mode_enabled: true, allowlist: ['10.0.0.0/24'], - }, - }), - getBreachedPasswordDetectionConfig: () => ({ - data: { + }), + }, + breachedPasswordDetection: { + get: () => ({ admin_notification_frequency: [], enabled: true, method: 'standard', shields: [], - }, - }), - getBruteForceConfig: () => ({ - data: { + }), + }, + bruteForceProtection: { + get: () => ({ allowlist: [], enabled: true, max_attempts: 10, mode: 'count_per_identifier_and_ip', shields: ['block', 'user_notification'], - }, - }), - getCaptchaConfig: () => ({ - data: { + }), + }, + captcha: { + get: () => ({ selected: 'friendly_captcha', policy: 'always', - }, - }), - getSuspiciousIpThrottlingConfig: () => ({ - data: { + }), + }, + suspiciousIpThrottling: { + get: () => ({ allowlist: ['127.0.0.1'], enabled: true, shields: ['block', 'admin_notification'], @@ -51,8 +51,8 @@ describe('#attackProtection handler', () => { rate: 1200, }, }, - }, - }), + }), + }, }, }; @@ -102,62 +102,72 @@ describe('#attackProtection handler', () => { it('should update attack protection settings', async () => { const auth0 = { attackProtection: { - updateBotDetectionConfig: (data) => { - expect(data).to.be.an('object'); - expect(data).to.deep.equal({ - bot_detection_level: 'medium', - monitoring_mode_enabled: false, - allowlist: ['10.0.0.0/24'], - }); - return Promise.resolve(data); + botDetection: { + update: (data) => { + expect(data).to.be.an('object'); + expect(data).to.deep.equal({ + bot_detection_level: 'medium', + monitoring_mode_enabled: false, + allowlist: ['10.0.0.0/24'], + }); + return Promise.resolve(data); + }, }, - updateBreachedPasswordDetectionConfig: (data) => { - expect(data).to.be.an('object'); - expect(data).to.deep.equal({ - admin_notification_frequency: [], - enabled: true, - method: 'standard', - shields: [], - }); - return Promise.resolve(data); + breachedPasswordDetection: { + update: (data) => { + expect(data).to.be.an('object'); + expect(data).to.deep.equal({ + admin_notification_frequency: [], + enabled: true, + method: 'standard', + shields: [], + }); + return Promise.resolve(data); + }, }, - updateCaptchaConfig: (data) => { - expect(data).to.be.an('object'); - expect(data).to.deep.equal({ - selected: 'friendly_captcha', - policy: 'always', - }); - return Promise.resolve(data); + captcha: { + update: (data) => { + expect(data).to.be.an('object'); + expect(data).to.deep.equal({ + selected: 'friendly_captcha', + policy: 'always', + }); + return Promise.resolve(data); + }, }, - updateSuspiciousIpThrottlingConfig: (data) => { - expect(data).to.be.an('object'); - expect(data).to.deep.equal({ - allowlist: ['127.0.0.1'], - enabled: true, - shields: ['block', 'admin_notification'], - stage: { - 'pre-login': { - max_attempts: 100, - rate: 864000, - }, - 'pre-user-registration': { - max_attempts: 50, - rate: 1200, + suspiciousIpThrottling: { + update: (data) => { + expect(data).to.be.an('object'); + expect(data).to.deep.equal({ + allowlist: ['127.0.0.1'], + enabled: true, + shields: ['block', 'admin_notification'], + stage: { + 'pre-login': { + max_attempts: 100, + rate: 864000, + }, + 'pre-user-registration': { + max_attempts: 50, + rate: 1200, + }, }, - }, - }); - return Promise.resolve(data); + }); + return Promise.resolve(data); + }, }, - updateBruteForceConfig: (data) => { - expect(data).to.be.an('object'); - expect(data).to.deep.equal({ - allowlist: [], - enabled: true, - max_attempts: 10, - mode: 'count_per_identifier_and_ip', - shields: ['block', 'user_notification'], - }); - return Promise.resolve(data); + bruteForceProtection: { + update: (data) => { + expect(data).to.be.an('object'); + expect(data).to.deep.equal({ + allowlist: [], + enabled: true, + max_attempts: 10, + mode: 'count_per_identifier_and_ip', + shields: ['block', 'user_notification'], + }); + return Promise.resolve(data); + }, }, }, }; @@ -213,35 +223,39 @@ describe('#attackProtection handler', () => { it('should handle 403 error when fetching bot detection and captcha configs', async () => { const auth0 = { attackProtection: { - getBotDetectionConfig: () => { - const err = new Error('Forbidden'); - err.statusCode = 403; - throw err; - }, - getCaptchaConfig: () => { - const err = new Error('Forbidden'); - err.statusCode = 403; - throw err; - }, - getBreachedPasswordDetectionConfig: () => ({ - data: { + botDetection: { + get: () => { + const err = new Error('Forbidden'); + err.statusCode = 403; + throw err; + }, + }, + captcha: { + get: () => { + const err = new Error('Forbidden'); + err.statusCode = 403; + throw err; + }, + }, + breachedPasswordDetection: { + get: () => ({ admin_notification_frequency: [], enabled: true, method: 'standard', shields: [], - }, - }), - getBruteForceConfig: () => ({ - data: { + }), + }, + bruteForceProtection: { + get: () => ({ allowlist: [], enabled: true, max_attempts: 10, mode: 'count_per_identifier_and_ip', shields: ['block', 'user_notification'], - }, - }), - getSuspiciousIpThrottlingConfig: () => ({ - data: { + }), + }, + suspiciousIpThrottling: { + get: () => ({ allowlist: ['127.0.0.1'], enabled: true, shields: ['block', 'admin_notification'], @@ -255,8 +269,8 @@ describe('#attackProtection handler', () => { rate: 1200, }, }, - }, - }), + }), + }, }, }; @@ -335,9 +349,15 @@ describe('#attackProtection handler', () => { it('should skip botDetection update when empty object', async () => { const auth0 = { attackProtection: { - updateBreachedPasswordDetectionConfig: (data) => Promise.resolve(data), - updateBruteForceConfig: (data) => Promise.resolve(data), - updateSuspiciousIpThrottlingConfig: (data) => Promise.resolve(data), + breachedPasswordDetection: { + update: (data) => Promise.resolve(data), + }, + bruteForceProtection: { + update: (data) => Promise.resolve(data), + }, + suspiciousIpThrottling: { + update: (data) => Promise.resolve(data), + }, }, }; @@ -377,9 +397,15 @@ describe('#attackProtection handler', () => { it('should skip captcha update when empty object', async () => { const auth0 = { attackProtection: { - updateBreachedPasswordDetectionConfig: (data) => Promise.resolve(data), - updateBruteForceConfig: (data) => Promise.resolve(data), - updateSuspiciousIpThrottlingConfig: (data) => Promise.resolve(data), + breachedPasswordDetection: { + update: (data) => Promise.resolve(data), + }, + bruteForceProtection: { + update: (data) => Promise.resolve(data), + }, + suspiciousIpThrottling: { + update: (data) => Promise.resolve(data), + }, }, }; @@ -420,13 +446,21 @@ describe('#attackProtection handler', () => { let capturedCaptcha; const auth0 = { attackProtection: { - updateCaptchaConfig: (data) => { - capturedCaptcha = data; - return Promise.resolve(data); + captcha: { + update: (data) => { + capturedCaptcha = data; + return Promise.resolve(data); + }, + }, + breachedPasswordDetection: { + update: (data) => Promise.resolve(data), + }, + bruteForceProtection: { + update: (data) => Promise.resolve(data), + }, + suspiciousIpThrottling: { + update: (data) => Promise.resolve(data), }, - updateBreachedPasswordDetectionConfig: (data) => Promise.resolve(data), - updateBruteForceConfig: (data) => Promise.resolve(data), - updateSuspiciousIpThrottlingConfig: (data) => Promise.resolve(data), }, }; @@ -475,25 +509,25 @@ describe('#attackProtection handler', () => { it('should return cached existing data on subsequent calls', async () => { const auth0 = { attackProtection: { - getBotDetectionConfig: () => ({ - data: { + botDetection: { + get: () => ({ bot_detection_level: 'medium', - }, - }), - getCaptchaConfig: () => ({ - data: { + }), + }, + captcha: { + get: () => ({ active_provider_id: 'friendly_captcha', - }, - }), - getBreachedPasswordDetectionConfig: () => ({ - data: { enabled: true }, - }), - getBruteForceConfig: () => ({ - data: { enabled: true }, - }), - getSuspiciousIpThrottlingConfig: () => ({ - data: { enabled: true }, - }), + }), + }, + breachedPasswordDetection: { + get: () => ({ enabled: true }), + }, + bruteForceProtection: { + get: () => ({ enabled: true }), + }, + suspiciousIpThrottling: { + get: () => ({ enabled: true }), + }, }, }; diff --git a/test/tools/auth0/handlers/branding.tests.js b/test/tools/auth0/handlers/branding.tests.js index d09efeb8b..1def32896 100644 --- a/test/tools/auth0/handlers/branding.tests.js +++ b/test/tools/auth0/handlers/branding.tests.js @@ -8,17 +8,17 @@ describe('#branding handler', () => { it('should get branding settings if no custom domain configured', async () => { const auth0 = { branding: { - getSettings: () => ({ - data: { - logo_url: 'https://example.com/logo.png', - }, - }), - getUniversalLoginTemplate: () => ({ - body: html, + get: () => ({ + logo_url: 'https://example.com/logo.png', }), + templates: { + getUniversalLogin: () => ({ + body: html, + }), + }, }, customDomains: { - getAll: () => [], // mock no custom domains + list: () => [], // mock no custom domains }, }; @@ -32,23 +32,19 @@ describe('#branding handler', () => { it('should get branding settings and templates if custom domain configured', async () => { const auth0 = { branding: { - getSettings: () => ({ - data: { - logo_url: 'https://example.com/logo.png', - }, + get: () => ({ + logo_url: 'https://example.com/logo.png', }), - getUniversalLoginTemplate: () => ({ - data: { + templates: { + getUniversalLogin: () => ({ body: html, - }, - }), + }), + }, }, customDomains: { - getAll: () => ({ - data: [ - {}, // mock one custom domain. - ], - }), + list: () => [ + {}, // mock one custom domain. + ], }, }; @@ -68,17 +64,17 @@ describe('#branding handler', () => { it('should return no templates if HTTP 403 error fetching custom domains', async () => { const auth0 = { branding: { - getSettings: () => ({ - data: { - logo_url: 'https://example.com/logo.png', - }, - }), - getUniversalLoginTemplate: () => ({ - body: html, + get: () => ({ + logo_url: 'https://example.com/logo.png', }), + templates: { + getUniversalLogin: () => ({ + body: html, + }), + }, }, customDomains: { - getAll: () => { + list: () => { const err = new Error('FakeHttpError'); err.statusCode = 403; return Promise.reject(err); @@ -96,17 +92,17 @@ describe('#branding handler', () => { it('should handle insufficient scope error and not export branding templates', async () => { const auth0 = { branding: { - getSettings: () => ({ - data: { - logo_url: 'https://example.com/logo.png', - }, - }), - getUniversalLoginTemplate: () => ({ - body: html, + get: () => ({ + logo_url: 'https://example.com/logo.png', }), + templates: { + getUniversalLogin: () => ({ + body: html, + }), + }, }, customDomains: { - getAll: () => { + list: () => { const err = new Error('Insufficient scope'); err.statusCode = 403; return Promise.reject(err); @@ -124,7 +120,7 @@ describe('#branding handler', () => { it('should update branding settings without templates if no templates set', (done) => { const auth0 = { branding: { - updateSettings: (data) => { + update: (data) => { try { expect(data).to.be.an('object'); expect(data.templates).to.equal(undefined); @@ -134,8 +130,10 @@ describe('#branding handler', () => { done(err); } }, - setUniversalLoginTemplate: () => { - done(new Error('setUniversalLoginTemplate should not have been called.')); + templates: { + updateUniversalLogin: () => { + done(new Error('updateUniversalLogin should not have been called.')); + }, }, }, }; @@ -155,7 +153,7 @@ describe('#branding handler', () => { it('should update branding settings and templates if templates set', (done) => { const auth0 = { branding: { - updateSettings: (data) => { + update: (data) => { try { expect(data).to.be.an('object'); expect(data.templates).to.equal(undefined); @@ -164,14 +162,16 @@ describe('#branding handler', () => { done(err); } }, - setUniversalLoginTemplate: (data) => { - try { - expect(data).to.be.an('object'); - expect(data.template).to.equal(html); - done(); - } catch (err) { - done(err); - } + templates: { + updateUniversalLogin: (data) => { + try { + expect(data).to.be.an('object'); + expect(data.template).to.equal(html); + done(); + } catch (err) { + done(err); + } + }, }, }, }; @@ -199,7 +199,7 @@ describe('#branding handler', () => { const auth0 = { branding: { - updateSettings: (data) => { + update: (data) => { expect(data).to.deep.equal({ colors: { primary: '#F8F8F2', @@ -241,10 +241,10 @@ describe('#branding handler', () => { const auth0 = { branding: { - updateSettings: () => { + update: () => { wasUpdateCalled = true; throw new Error( - 'updateSettings should not have been called because omitted `logo_url` means that no API request needs to be made.' + 'update should not have been called because omitted `logo_url` means that no API request needs to be made.' ); }, }, @@ -265,11 +265,13 @@ describe('#branding handler', () => { it('should not throw, and be no-op if branding not set in context', async () => { const auth0 = { branding: { - updateSettings: () => { - throw new Error('updateSettings should not have been called.'); + update: () => { + throw new Error('update should not have been called.'); }, - setUniversalLoginTemplate: () => { - throw new Error('setUniversalLoginTemplate should not have been called.'); + templates: { + updateUniversalLogin: () => { + throw new Error('updateUniversalLogin should not have been called.'); + }, }, }, }; diff --git a/test/tools/auth0/handlers/clientGrants.tests.js b/test/tools/auth0/handlers/clientGrants.tests.js index 8618e8c35..b799475d2 100644 --- a/test/tools/auth0/handlers/clientGrants.tests.js +++ b/test/tools/auth0/handlers/clientGrants.tests.js @@ -69,10 +69,10 @@ describe('#clientGrants handler', () => { }, update: () => Promise.resolve({ data: [] }), delete: () => Promise.resolve({ data: [] }), - getAll: (params) => mockPagedData(params, 'client_grants', []), + list: (params) => mockPagedData(params, 'client_grants', []), }, clients: { - getAll: (params) => mockPagedData(params, 'clients', []), + list: (params) => mockPagedData(params, 'clients', []), }, pool, }; @@ -104,10 +104,10 @@ describe('#clientGrants handler', () => { }, update: () => Promise.resolve({ data: [] }), delete: () => Promise.resolve({ data: [] }), - getAll: (params) => mockPagedData(params, 'client_grants', []), + list: (params) => mockPagedData(params, 'client_grants', []), }, clients: { - getAll: (params) => mockPagedData(params, 'clients', []), + list: (params) => mockPagedData(params, 'clients', []), }, pool, }; @@ -135,10 +135,10 @@ describe('#clientGrants handler', () => { }; const auth0 = { clientGrants: { - getAll: (params) => mockPagedData(params, 'client_grants', [clientGrant]), + list: (params) => mockPagedData(params, 'client_grants', [clientGrant]), }, clients: { - getAll: (params) => + list: (params) => mockPagedData(params, 'clients', [{ name: 'test client', client_id: clientId }]), }, pool, @@ -161,10 +161,10 @@ describe('#clientGrants handler', () => { }, update: () => Promise.resolve({ data: [] }), delete: () => Promise.resolve({ data: [] }), - getAll: (params) => mockPagedData(params, 'client_grants', []), + list: (params) => mockPagedData(params, 'client_grants', []), }, clients: { - getAll: (params) => + list: (params) => mockPagedData(params, 'clients', [{ client_id: 'client_id', name: 'client_name' }]), }, pool, @@ -191,10 +191,10 @@ describe('#clientGrants handler', () => { expect(data).to.equal({}); return Promise.resolve({ data }); }, - update: function (params, data) { + update: function (id, data) { (() => expect(this).to.not.be.undefined)(); - expect(params).to.be.an('object'); - expect(params.id).to.equal('cg1'); + expect(id).to.be.a('string'); + expect(id).to.equal('cg1'); expect(data).to.be.an('object'); expect(data.scope).to.be.an('array'); expect(data.scope[0]).to.equal('read:messages'); @@ -202,13 +202,13 @@ describe('#clientGrants handler', () => { return Promise.resolve({ data }); }, delete: () => Promise.resolve({ data: [] }), - getAll: (params) => + list: (params) => mockPagedData(params, 'client_grants', [ { id: 'cg1', client_id: 'client1', audience: 'audience' }, ]), }, clients: { - getAll: (params) => mockPagedData(params, 'clients', []), + list: (params) => mockPagedData(params, 'clients', []), }, pool, }; @@ -235,22 +235,22 @@ describe('#clientGrants handler', () => { expect(data).to.equal({}); return Promise.resolve({ data }); }, - update: function (params, data) { + update: function (id, data) { (() => expect(this).to.not.be.undefined)(); - expect(params).to.be.an('object'); - expect(params.id).to.equal('cg1'); + expect(id).to.be.a('string'); + expect(id).to.equal('cg1'); expect(data).to.be.an('object'); expect(data.authorization_details_types).to.be.an('array'); return Promise.resolve({ data }); }, delete: () => Promise.resolve({ data: [] }), - getAll: (params) => + list: (params) => mockPagedData(params, 'client_grants', [ { id: 'cg1', client_id: 'client1', audience: 'audience' }, ]), }, clients: { - getAll: (params) => mockPagedData(params, 'clients', []), + list: (params) => mockPagedData(params, 'clients', []), }, pool, }; @@ -281,18 +281,18 @@ describe('#clientGrants handler', () => { update: () => Promise.resolve({ data: [] }), delete: function (params) { (() => expect(this).to.not.be.undefined)(); - expect(params).to.be.an('object'); - expect(params.id).to.equal('cg1'); + expect(params).to.be.a('string'); + expect(params).to.equal('cg1'); return Promise.resolve({ data: [] }); }, - getAll: (params) => + list: (params) => mockPagedData(params, 'client_grants', [ { id: 'cg1', client_id: 'client1', audience: 'audience1' }, ]), }, clients: { - getAll: (params) => mockPagedData(params, 'clients', []), + list: (params) => mockPagedData(params, 'clients', []), }, pool, }; @@ -329,13 +329,13 @@ describe('#clientGrants handler', () => { return Promise.resolve({ data: [] }); }, - getAll: (params) => + list: (params) => mockPagedData(params, 'client_grants', [ { id: 'id', client_id: 'client_id', audience: 'audience' }, ]), }, clients: { - getAll: (params) => mockPagedData(params, 'clients', []), + list: (params) => mockPagedData(params, 'clients', []), }, pool, }; @@ -361,18 +361,18 @@ describe('#clientGrants handler', () => { update: () => Promise.resolve({ data: [] }), delete: function (params) { (() => expect(this).to.not.be.undefined)(); - expect(params).to.be.an('object'); - expect(params.id).to.equal('cg1'); + expect(params).to.be.a('string'); + expect(params).to.equal('cg1'); removed = true; return Promise.resolve({ data: [] }); }, - getAll: (params) => + list: (params) => mockPagedData(params, 'client_grants', [ { id: 'cg1', client_id: 'client1', audience: 'audience1' }, ]), }, clients: { - getAll: (params) => mockPagedData(params, 'clients', []), + list: (params) => mockPagedData(params, 'clients', []), }, pool, }; @@ -399,13 +399,13 @@ describe('#clientGrants handler', () => { return Promise.resolve({ data: [] }); }, - getAll: (params) => + list: (params) => mockPagedData(params, 'client_grants', [ { id: 'cg1', client_id: 'client1', audience: 'audience1' }, ]), }, clients: { - getAll: (params) => mockPagedData(params, 'clients', []), + list: (params) => mockPagedData(params, 'clients', []), }, pool, }; @@ -439,14 +439,14 @@ describe('#clientGrants handler', () => { return Promise.resolve({ data: [] }); }, - getAll: (params) => + list: (params) => mockPagedData(params, 'client_grants', [ { id: 'cg1', client_id: 'client1', audience: 'audience1' }, { id: 'cg2', client_id: 'client2', audience: 'audience2' }, ]), }, clients: { - getAll: (params) => + list: (params) => mockPagedData(params, 'clients', [ { name: 'client_delete', client_id: 'client1', audience: 'audience1' }, { name: 'client_update', client_id: 'client2', audience: 'audience2' }, @@ -497,7 +497,7 @@ describe('#clientGrants handler', () => { return Promise.resolve({ data: [] }); }, - getAll: (params) => + list: (params) => mockPagedData(params, 'client_grants', [ { client_id: '123', @@ -527,7 +527,7 @@ describe('#clientGrants handler', () => { ]), }, clients: { - getAll: (params) => + list: (params) => mockPagedData(params, 'clients', [ { name: 'abc', diff --git a/test/tools/auth0/handlers/clients.tests.js b/test/tools/auth0/handlers/clients.tests.js index e9671d801..044477df1 100644 --- a/test/tools/auth0/handlers/clients.tests.js +++ b/test/tools/auth0/handlers/clients.tests.js @@ -1,3 +1,4 @@ +/* eslint-disable camelcase */ import pageClient from '../../../../src/tools/auth0/client'; const { expect } = require('chai'); @@ -93,11 +94,11 @@ describe('#clients handler', () => { }, update: () => Promise.resolve({ data: [] }), delete: () => Promise.resolve({ data: [] }), - getAll: (params) => mockPagedData(params, 'clients', []), + list: (params) => mockPagedData(params, 'clients', []), }, - connectionProfiles: { getAll: (params) => mockPagedData(params, 'connectionProfiles', []) }, + connectionProfiles: { list: (params) => mockPagedData(params, 'connectionProfiles', []) }, userAttributeProfiles: { - getAll: (params) => mockPagedData(params, 'userAttributeProfiles', []), + list: (params) => mockPagedData(params, 'userAttributeProfiles', []), }, pool, }; @@ -143,11 +144,11 @@ describe('#clients handler', () => { }, update: () => Promise.resolve({ data: [] }), delete: () => Promise.resolve({ data: [] }), - getAll: (params) => mockPagedData(params, 'clients', []), + list: (params) => mockPagedData(params, 'clients', []), }, - connectionProfiles: { getAll: (params) => mockPagedData(params, 'connectionProfiles', []) }, + connectionProfiles: { list: (params) => mockPagedData(params, 'connectionProfiles', []) }, userAttributeProfiles: { - getAll: (params) => mockPagedData(params, 'userAttributeProfiles', []), + list: (params) => mockPagedData(params, 'userAttributeProfiles', []), }, pool, }; @@ -197,11 +198,11 @@ describe('#clients handler', () => { }, update: () => Promise.resolve({ data: [] }), delete: () => Promise.resolve({ data: [] }), - getAll: (params) => mockPagedData(params, 'clients', []), + list: (params) => mockPagedData(params, 'clients', []), }, - connectionProfiles: { getAll: (params) => mockPagedData(params, 'connectionProfiles', []) }, + connectionProfiles: { list: (params) => mockPagedData(params, 'connectionProfiles', []) }, userAttributeProfiles: { - getAll: (params) => mockPagedData(params, 'userAttributeProfiles', []), + list: (params) => mockPagedData(params, 'userAttributeProfiles', []), }, pool, }; @@ -241,11 +242,11 @@ describe('#clients handler', () => { }, update: () => Promise.resolve({ data: [] }), delete: () => Promise.resolve({ data: [] }), - getAll: (params) => mockPagedData(params, 'clients', []), + list: (params) => mockPagedData(params, 'clients', []), }, - connectionProfiles: { getAll: (params) => mockPagedData(params, 'connectionProfiles', []) }, + connectionProfiles: { list: (params) => mockPagedData(params, 'connectionProfiles', []) }, userAttributeProfiles: { - getAll: (params) => mockPagedData(params, 'userAttributeProfiles', []), + list: (params) => mockPagedData(params, 'userAttributeProfiles', []), }, pool, }; @@ -277,11 +278,11 @@ describe('#clients handler', () => { }, update: () => Promise.resolve({ data: [] }), delete: () => Promise.resolve({ data: [] }), - getAll: (params) => mockPagedData(params, 'clients', []), + list: (params) => mockPagedData(params, 'clients', []), }, - connectionProfiles: { getAll: (params) => mockPagedData(params, 'connectionProfiles', []) }, + connectionProfiles: { list: (params) => mockPagedData(params, 'connectionProfiles', []) }, userAttributeProfiles: { - getAll: (params) => mockPagedData(params, 'userAttributeProfiles', []), + list: (params) => mockPagedData(params, 'userAttributeProfiles', []), }, pool, }; @@ -318,17 +319,17 @@ describe('#clients handler', () => { }, update: () => Promise.resolve({ data: [] }), delete: () => Promise.resolve({ data: [] }), - getAll: (params) => + list: (params) => mockPagedData(params, 'clients', [{ client_id: 'client_123', name: 'My OIN Client' }]), }, connectionProfiles: { - getAll: (params) => + list: (params) => mockPagedData(params, 'connectionProfiles', [ { id: 'cp_123', name: 'My Connection Profile' }, ]), }, userAttributeProfiles: { - getAll: (params) => + list: (params) => mockPagedData(params, 'userAttributeProfiles', [ { id: 'uap_123', name: 'My User Attribute Profile' }, ]), @@ -361,11 +362,11 @@ describe('#clients handler', () => { }, update: () => Promise.resolve({ data: [] }), delete: () => Promise.resolve({ data: [] }), - getAll: (params) => mockPagedData(params, 'clients', []), + list: (params) => mockPagedData(params, 'clients', []), }, - connectionProfiles: { getAll: (params) => mockPagedData(params, 'connectionProfiles', []) }, + connectionProfiles: { list: (params) => mockPagedData(params, 'connectionProfiles', []) }, userAttributeProfiles: { - getAll: (params) => mockPagedData(params, 'userAttributeProfiles', []), + list: (params) => mockPagedData(params, 'userAttributeProfiles', []), }, pool, }; @@ -394,11 +395,11 @@ describe('#clients handler', () => { }, update: () => Promise.resolve({ data: [] }), delete: () => Promise.resolve({ data: [] }), - getAll: (params) => mockPagedData(params, 'clients', []), + list: (params) => mockPagedData(params, 'clients', []), }, - connectionProfiles: { getAll: (params) => mockPagedData(params, 'connectionProfiles', []) }, + connectionProfiles: { list: (params) => mockPagedData(params, 'connectionProfiles', []) }, userAttributeProfiles: { - getAll: (params) => mockPagedData(params, 'userAttributeProfiles', []), + list: (params) => mockPagedData(params, 'userAttributeProfiles', []), }, pool, }; @@ -437,7 +438,7 @@ describe('#clients handler', () => { }, update: () => Promise.resolve({ data: [] }), delete: () => Promise.resolve({ data: [] }), - getAll: (params) => mockPagedData(params, 'clients', []), + list: (params) => mockPagedData(params, 'clients', []), }, pool, }; @@ -461,11 +462,11 @@ describe('#clients handler', () => { }); it('should get clients with is_first_party when AUTH0_EXCLUDE_THIRD_PARTY_CLIENTS is enabled', async () => { - const getAllParams = []; + const listParams = []; const auth0 = { clients: { - getAll: (params) => { - getAllParams.push(params); + list: (params) => { + listParams.push(params); return mockPagedData(params, 'clients', [ { name: 'first party client', client_id: 'first-party-client-id' }, ]); @@ -486,18 +487,17 @@ describe('#clients handler', () => { const handler = new clients.default({ client: pageClient(auth0), config: testConfig }); await handler.getType(); - expect(getAllParams.length).to.be.greaterThan(0); - const firstCallParams = getAllParams[0]; + expect(listParams.length).to.be.greaterThan(0); + const firstCallParams = listParams[0]; expect(firstCallParams).to.be.an('object'); expect(firstCallParams.is_first_party).to.equal(true); - expect(firstCallParams.include_totals).to.equal(true); expect(firstCallParams.is_global).to.equal(false); }); it('should migrate deprecated cross_origin_auth to cross_origin_authentication on export', async () => { const auth0 = { clients: { - getAll: (params) => + list: (params) => mockPagedData(params, 'clients', [ { client_id: 'client1', @@ -520,9 +520,9 @@ describe('#clients handler', () => { }, ]), }, - connectionProfiles: { getAll: (params) => mockPagedData(params, 'connectionProfiles', []) }, + connectionProfiles: { list: (params) => mockPagedData(params, 'connectionProfiles', []) }, userAttributeProfiles: { - getAll: (params) => mockPagedData(params, 'userAttributeProfiles', []), + list: (params) => mockPagedData(params, 'userAttributeProfiles', []), }, pool, }; @@ -554,10 +554,10 @@ describe('#clients handler', () => { expect(data.length).to.equal(0); return Promise.resolve({ data }); }, - update: function (params, data) { + update: function (clientId, data) { (() => expect(this).to.not.be.undefined)(); - expect(params).to.be.an('object'); - expect(params.client_id).to.equal('client1'); + expect(clientId).to.be.a('string'); + expect(clientId).to.equal('client1'); expect(data).to.be.an('object'); expect(data.description).to.equal('new description'); expect(data.session_transfer).to.deep.equal({ @@ -572,7 +572,7 @@ describe('#clients handler', () => { return Promise.resolve({ data }); }, delete: () => Promise.resolve({ data: [] }), - getAll: (params) => + list: (params) => mockPagedData(params, 'clients', [ { client_id: 'client1', @@ -580,9 +580,9 @@ describe('#clients handler', () => { }, ]), }, - connectionProfiles: { getAll: (params) => mockPagedData(params, 'connectionProfiles', []) }, + connectionProfiles: { list: (params) => mockPagedData(params, 'connectionProfiles', []) }, userAttributeProfiles: { - getAll: (params) => mockPagedData(params, 'userAttributeProfiles', []), + list: (params) => mockPagedData(params, 'userAttributeProfiles', []), }, pool, }; @@ -619,17 +619,17 @@ describe('#clients handler', () => { expect(data.length).to.equal(0); return Promise.resolve({ data }); }, - update: function (params, data) { + update: function (client_id, data) { (() => expect(this).to.not.be.undefined)(); - expect(params).to.be.an('object'); - expect(params.client_id).to.equal('client1'); + expect(client_id).to.be.a('string'); + expect(client_id).to.equal('client1'); expect(data).to.be.an('object'); expect(data.skip_non_verifiable_callback_uri_confirmation_prompt).to.equal(false); return Promise.resolve({ data }); }, delete: () => Promise.resolve({ data: [] }), - getAll: (params) => + list: (params) => mockPagedData(params, 'clients', [ { client_id: 'client1', @@ -637,9 +637,9 @@ describe('#clients handler', () => { }, ]), }, - connectionProfiles: { getAll: (params) => mockPagedData(params, 'connectionProfiles', []) }, + connectionProfiles: { list: (params) => mockPagedData(params, 'connectionProfiles', []) }, userAttributeProfiles: { - getAll: (params) => mockPagedData(params, 'userAttributeProfiles', []), + list: (params) => mockPagedData(params, 'userAttributeProfiles', []), }, pool, }; @@ -671,19 +671,19 @@ describe('#clients handler', () => { update: () => Promise.resolve({ data: [] }), delete: function (params) { (() => expect(this).to.not.be.undefined)(); - expect(params).to.be.an('object'); - expect(params.client_id).to.equal('client1'); + expect(params).to.be.a('string'); + expect(params).to.equal('client1'); return Promise.resolve({ data: [] }); }, - getAll: (params) => + list: (params) => mockPagedData(params, 'clients', [ { client_id: 'client1', name: 'existingClient' }, { client_id: 'client_id', name: 'deploy client' }, ]), }, - connectionProfiles: { getAll: (params) => mockPagedData(params, 'connectionProfiles', []) }, + connectionProfiles: { list: (params) => mockPagedData(params, 'connectionProfiles', []) }, userAttributeProfiles: { - getAll: (params) => mockPagedData(params, 'userAttributeProfiles', []), + list: (params) => mockPagedData(params, 'userAttributeProfiles', []), }, pool, }; @@ -702,20 +702,20 @@ describe('#clients handler', () => { update: () => Promise.resolve({ data: [] }), delete: function (params) { (() => expect(this).to.not.be.undefined)(); - expect(params).to.be.an('object'); - expect(params.client_id).to.equal('client1'); + expect(params).to.be.a('string'); + expect(params).to.equal('client1'); removed = true; return Promise.resolve({ data: [] }); }, - getAll: (params) => + list: (params) => mockPagedData(params, 'clients', [ { client_id: 'client1', name: 'existingClient' }, { client_id: 'client_id', name: 'deploy client' }, ]), }, - connectionProfiles: { getAll: (params) => mockPagedData(params, 'connectionProfiles', []) }, + connectionProfiles: { list: (params) => mockPagedData(params, 'connectionProfiles', []) }, userAttributeProfiles: { - getAll: (params) => mockPagedData(params, 'userAttributeProfiles', []), + list: (params) => mockPagedData(params, 'userAttributeProfiles', []), }, pool, }; @@ -738,12 +738,12 @@ describe('#clients handler', () => { expect(params).to.be.an('undefined'); return Promise.resolve({ data: [] }); }, - getAll: (params) => + list: (params) => mockPagedData(params, 'clients', [{ client_id: 'client1', name: 'existingClient' }]), }, - connectionProfiles: { getAll: (params) => mockPagedData(params, 'connectionProfiles', []) }, + connectionProfiles: { list: (params) => mockPagedData(params, 'connectionProfiles', []) }, userAttributeProfiles: { - getAll: (params) => mockPagedData(params, 'userAttributeProfiles', []), + list: (params) => mockPagedData(params, 'userAttributeProfiles', []), }, pool, }; @@ -771,11 +771,11 @@ describe('#clients handler', () => { expect(params).to.be.an('undefined'); return Promise.resolve({ data: [] }); }, - getAll: (params) => Promise.resolve(mockPagedData(params, 'clients', [])), + list: (params) => Promise.resolve(mockPagedData(params, 'clients', [])), }, - connectionProfiles: { getAll: (params) => mockPagedData(params, 'connectionProfiles', []) }, + connectionProfiles: { list: (params) => mockPagedData(params, 'connectionProfiles', []) }, userAttributeProfiles: { - getAll: (params) => mockPagedData(params, 'userAttributeProfiles', []), + list: (params) => mockPagedData(params, 'userAttributeProfiles', []), }, pool, }; @@ -807,15 +807,15 @@ describe('#clients handler', () => { expect(params).to.be.an('undefined'); return Promise.resolve({ data: [] }); }, - getAll: (params) => + list: (params) => mockPagedData(params, 'clients', [ { client_id: 'client1', name: 'existingClient' }, { client_id: 'client2', name: 'existingClient2' }, ]), }, - connectionProfiles: { getAll: (params) => mockPagedData(params, 'connectionProfiles', []) }, + connectionProfiles: { list: (params) => mockPagedData(params, 'connectionProfiles', []) }, userAttributeProfiles: { - getAll: (params) => mockPagedData(params, 'userAttributeProfiles', []), + list: (params) => mockPagedData(params, 'userAttributeProfiles', []), }, pool, }; @@ -839,21 +839,22 @@ describe('#clients handler', () => { expect(data.name).to.equal('Client 3'); return Promise.resolve({ data }); }, - update: function (data) { + update: function (clientId, data) { wasUpdateCalled = true; (() => expect(this).to.not.be.undefined)(); + expect(clientId).to.be.a('string'); + expect(clientId).to.equal('client-1'); expect(data).to.be.an('object'); - expect(data.client_id).to.equal('client-1'); return Promise.resolve({ data }); }, delete: function (data) { wasDeleteCalled = true; (() => expect(this).to.not.be.undefined)(); - expect(data).to.be.an('object'); - expect(data.client_id).to.equal('client-2'); + expect(data).to.be.a('string'); + expect(data).to.equal('client-2'); return Promise.resolve({ data }); }, - getAll: (params) => + list: (params) => mockPagedData(params, 'clients', [ { client_id: 'client-1', @@ -865,9 +866,9 @@ describe('#clients handler', () => { }, ]), }, - connectionProfiles: { getAll: (params) => mockPagedData(params, 'connectionProfiles', []) }, + connectionProfiles: { list: (params) => mockPagedData(params, 'connectionProfiles', []) }, userAttributeProfiles: { - getAll: (params) => mockPagedData(params, 'userAttributeProfiles', []), + list: (params) => mockPagedData(params, 'userAttributeProfiles', []), }, pool, }; @@ -922,11 +923,11 @@ describe('#clients handler', () => { }, update: () => Promise.resolve({ data: [] }), delete: () => Promise.resolve({ data: [] }), - getAll: (params) => mockPagedData(params, 'clients', []), + list: (params) => mockPagedData(params, 'clients', []), }, - connectionProfiles: { getAll: (params) => mockPagedData(params, 'connectionProfiles', []) }, + connectionProfiles: { list: (params) => mockPagedData(params, 'connectionProfiles', []) }, userAttributeProfiles: { - getAll: (params) => mockPagedData(params, 'userAttributeProfiles', []), + list: (params) => mockPagedData(params, 'userAttributeProfiles', []), }, pool, }; @@ -962,11 +963,11 @@ describe('#clients handler', () => { }, update: () => Promise.resolve({ data: [] }), delete: () => Promise.resolve({ data: [] }), - getAll: (params) => mockPagedData(params, 'clients', []), + list: (params) => mockPagedData(params, 'clients', []), }, - connectionProfiles: { getAll: (params) => mockPagedData(params, 'connectionProfiles', []) }, + connectionProfiles: { list: (params) => mockPagedData(params, 'connectionProfiles', []) }, userAttributeProfiles: { - getAll: (params) => mockPagedData(params, 'userAttributeProfiles', []), + list: (params) => mockPagedData(params, 'userAttributeProfiles', []), }, pool, }; @@ -981,16 +982,16 @@ describe('#clients handler', () => { const auth0 = { clients: { create: () => Promise.resolve({ data: [] }), - update: function (params, data) { + update: function (client_id, data) { (() => expect(this).to.not.be.undefined)(); - expect(params.client_id).to.equal('client1'); + expect(client_id).to.equal('client1'); expect(data.organization_usage).to.equal('allow'); // organization_require_behavior should be preserved if not updated expect(data).to.not.have.property('organization_require_behavior'); return Promise.resolve({ data }); }, delete: () => Promise.resolve({ data: [] }), - getAll: (params) => + list: (params) => mockPagedData(params, 'clients', [ { client_id: 'client1', @@ -1001,9 +1002,9 @@ describe('#clients handler', () => { }, ]), }, - connectionProfiles: { getAll: (params) => mockPagedData(params, 'connectionProfiles', []) }, + connectionProfiles: { list: (params) => mockPagedData(params, 'connectionProfiles', []) }, userAttributeProfiles: { - getAll: (params) => mockPagedData(params, 'userAttributeProfiles', []), + list: (params) => mockPagedData(params, 'userAttributeProfiles', []), }, pool, }; @@ -1027,9 +1028,9 @@ describe('#clients handler', () => { const auth0 = { clients: { create: () => Promise.resolve({ data: [] }), - update: function (params, data) { + update: function (client_id, data) { (() => expect(this).to.not.be.undefined)(); - expect(params.client_id).to.equal('client1'); + expect(client_id).to.equal('client1'); expect(data.organization_require_behavior).to.equal('post_login_prompt'); // eslint-disable-next-line no-unused-expressions expect(data.organization_discovery_methods).to.be.null; @@ -1038,7 +1039,7 @@ describe('#clients handler', () => { return Promise.resolve({ data }); }, delete: () => Promise.resolve({ data: [] }), - getAll: (params) => + list: (params) => mockPagedData(params, 'clients', [ { client_id: 'client1', @@ -1050,9 +1051,9 @@ describe('#clients handler', () => { }, ]), }, - connectionProfiles: { getAll: (params) => mockPagedData(params, 'connectionProfiles', []) }, + connectionProfiles: { list: (params) => mockPagedData(params, 'connectionProfiles', []) }, userAttributeProfiles: { - getAll: (params) => mockPagedData(params, 'userAttributeProfiles', []), + list: (params) => mockPagedData(params, 'userAttributeProfiles', []), }, pool, }; @@ -1084,11 +1085,11 @@ describe('#clients handler', () => { }, update: () => Promise.resolve({ data: [] }), delete: () => Promise.resolve({ data: [] }), - getAll: (params) => mockPagedData(params, 'clients', []), + list: (params) => mockPagedData(params, 'clients', []), }, - connectionProfiles: { getAll: (params) => mockPagedData(params, 'connectionProfiles', []) }, + connectionProfiles: { list: (params) => mockPagedData(params, 'connectionProfiles', []) }, userAttributeProfiles: { - getAll: (params) => mockPagedData(params, 'userAttributeProfiles', []), + list: (params) => mockPagedData(params, 'userAttributeProfiles', []), }, pool, }; @@ -1139,21 +1140,21 @@ describe('#clients handler', () => { const auth0 = { clients: { create: () => Promise.resolve({ data: [] }), - update: function (params, data) { - updatedClients.push({ ...data, client_id: params.client_id }); + update: function (clientId, data) { + updatedClients.push({ ...data, client_id: clientId }); return Promise.resolve({ data }); }, delete: () => Promise.resolve({ data: [] }), - getAll: (params) => + list: (params) => mockPagedData(params, 'clients', [ { client_id: 'client1', name: 'deprecatedOnlyClient' }, { client_id: 'client2', name: 'bothFieldsClient' }, { client_id: 'client3', name: 'newOnlyClient' }, ]), }, - connectionProfiles: { getAll: (params) => mockPagedData(params, 'connectionProfiles', []) }, + connectionProfiles: { list: (params) => mockPagedData(params, 'connectionProfiles', []) }, userAttributeProfiles: { - getAll: (params) => mockPagedData(params, 'userAttributeProfiles', []), + list: (params) => mockPagedData(params, 'userAttributeProfiles', []), }, pool, }; diff --git a/test/tools/auth0/handlers/connectionProfiles.tests.js b/test/tools/auth0/handlers/connectionProfiles.tests.js index 940898119..96ea52908 100644 --- a/test/tools/auth0/handlers/connectionProfiles.tests.js +++ b/test/tools/auth0/handlers/connectionProfiles.tests.js @@ -67,7 +67,7 @@ describe('#connectionProfiles handler', () => { }, update: () => Promise.resolve({ data: [] }), delete: () => Promise.resolve({ data: [] }), - getAll: (params) => mockPagedData(params, 'connectionProfiles', []), + list: (params) => mockPagedData(params, 'connectionProfiles', []), }, pool, }; @@ -82,16 +82,16 @@ describe('#connectionProfiles handler', () => { const auth0 = { connectionProfiles: { create: () => Promise.resolve({ data: [] }), - update: function (params, data) { + update: function (id, data) { (() => expect(this).to.not.be.undefined)(); - expect(params).to.be.an('object'); - expect(params.id).to.equal('cp_123'); + expect(id).to.be.a('string'); + expect(id).to.equal('cp_123'); expect(data).to.be.an('object'); expect(data.enabled_features).to.deep.equal(['scim']); return Promise.resolve({ data }); }, delete: () => Promise.resolve({ data: [] }), - getAll: (params) => + list: (params) => mockPagedData(params, 'connectionProfiles', [ { id: 'cp_123', name: 'someProfile', enabled_features: [] }, ]), @@ -112,13 +112,13 @@ describe('#connectionProfiles handler', () => { connectionProfiles: { create: () => Promise.resolve({ data: [] }), update: () => Promise.resolve({ data: [] }), - delete: function (params) { + delete: function (id) { (() => expect(this).to.not.be.undefined)(); - expect(params).to.be.an('object'); - expect(params.id).to.equal('cp_123'); + expect(id).to.be.a('string'); + expect(id).to.equal('cp_123'); return Promise.resolve({ data: [] }); }, - getAll: (params) => + list: (params) => mockPagedData(params, 'connectionProfiles', [{ id: 'cp_123', name: 'someProfile' }]), }, pool, diff --git a/test/tools/auth0/handlers/connections.tests.js b/test/tools/auth0/handlers/connections.tests.js index e30a4f610..b010be25c 100644 --- a/test/tools/auth0/handlers/connections.tests.js +++ b/test/tools/auth0/handlers/connections.tests.js @@ -14,6 +14,10 @@ const pool = { } return { promise: () => null }; }, + addSingleTask: (task) => { + const result = task.generator(task.data); + return { promise: () => Promise.resolve(result) }; + }, }; describe('#connections handler', () => { @@ -100,11 +104,15 @@ describe('#connections handler', () => { }, update: () => Promise.resolve({ data: [] }), delete: () => Promise.resolve({ data: [] }), - getAll: (params) => mockPagedData(params, 'connections', []), + list: (params) => mockPagedData(params, 'connections', []), _getRestClient: () => ({}), + clients: { + get: () => Promise.resolve(mockPagedData({}, 'clients', [])), + update: () => Promise.resolve({}), + }, }, clients: { - getAll: (params) => mockPagedData(params, 'clients', []), + list: (params) => mockPagedData(params, 'clients', []), }, pool, }; @@ -120,23 +128,20 @@ describe('#connections handler', () => { let getEnabledClientsCalledOnce = false; const auth0 = { connections: { - getAll: (params) => + list: (params) => mockPagedData(params, 'connections', [ { id: 'con1', strategy: 'github', name: 'github', enabled_clients: [clientId] }, { id: 'con2', strategy: 'auth0', name: 'db-should-be-ignored', enabled_clients: [] }, ]), - getEnabledClients: () => { - getEnabledClientsCalledOnce = true; - return Promise.resolve({ - data: { - clients: [{ client_id: clientId }], - next: null, - }, - }); + clients: { + get: () => { + getEnabledClientsCalledOnce = true; + return Promise.resolve(mockPagedData({}, 'clients', [{ client_id: clientId }])); + }, }, }, clients: { - getAll: (params) => + list: (params) => mockPagedData(params, 'clients', [{ name: 'test client', client_id: clientId }]), }, pool, @@ -158,10 +163,10 @@ describe('#connections handler', () => { expect(data).to.be.an('undefined'); return Promise.resolve({ data }); }, - update: function (params, data) { + update: function (id, data) { (() => expect(this).to.not.be.undefined)(); - expect(params).to.be.an('object'); - expect(params.id).to.equal('con1'); + expect(id).to.be.a('string'); + expect(id).to.equal('con1'); expect(data).to.deep.equal({ enabled_clients: ['YwqVtt8W3pw5AuEz3B2Kse9l2Ruy7Tec'], options: { passwordPolicy: 'testPolicy' }, @@ -169,21 +174,23 @@ describe('#connections handler', () => { connected_accounts: { active: false }, }); - return Promise.resolve({ data: { ...params, ...data } }); + return Promise.resolve({ ...data, id }); }, delete: () => Promise.resolve({ data: [] }), - getAll: (params) => + list: (params) => mockPagedData(params, 'connections', [ { name: 'someConnection', id: 'con1', strategy: 'custom' }, ]), _getRestClient: () => ({}), - updateEnabledClients: (params) => { - expect(params.id).to.equal('con1'); - return Promise.resolve({ data: [] }); + clients: { + update: (connectionId) => { + expect(connectionId).to.equal('con1'); + return Promise.resolve({}); + }, }, }, clients: { - getAll: (params) => + list: (params) => mockPagedData(params, 'clients', [ { name: 'client1', client_id: 'YwqVtt8W3pw5AuEz3B2Kse9l2Ruy7Tec' }, ]), @@ -252,18 +259,20 @@ describe('#connections handler', () => { return Promise.resolve({ data: { ...params, ...data } }); }, delete: () => Promise.resolve({ data: [] }), - getAll: (params) => + list: (params) => mockPagedData(params, 'connections', [ { name: 'someSamlConnection', id: 'con1', strategy: 'samlp' }, ]), - getEnabledClients: () => Promise.resolve({ data: [] }), - updateEnabledClients: (params) => { - expect(params.id).to.equal('con1'); - return Promise.resolve({ data: [] }); + clients: { + get: () => Promise.resolve({ data: [] }), + update: (connectionId, _payload) => { + expect(connectionId).to.equal('con1'); + return Promise.resolve([]); + }, }, }, clients: { - getAll: (params) => + list: (params) => mockPagedData(params, 'clients', [ { name: 'client1', client_id: 'YwqVtt8W3pw5AuEz3B2Kse9l2Ruy7Tec' }, { name: 'idp-one', client_id: 'YwqVtt8W3pw5AuEz3B2Kse9l2Ruy7Teb' }, @@ -346,19 +355,21 @@ describe('#connections handler', () => { return Promise.resolve({ data: { ...params, ...data } }); }, delete: () => Promise.resolve({ data: [] }), - getAll: (params) => + list: (params) => mockPagedData(params, 'connections', [ { name: 'someSamlConnection', id: 'con1', strategy: 'samlp' }, ]), _getRestClient: () => ({}), - getEnabledClients: () => Promise.resolve({ data: [] }), - updateEnabledClients: (params) => { - expect(params.id).to.equal('con1'); - return Promise.resolve({ data: [] }); + clients: { + get: () => Promise.resolve({ data: [] }), + update: (connectionId) => { + expect(connectionId).to.equal('con1'); + return Promise.resolve([]); + }, }, }, clients: { - getAll: (params) => + list: (params) => mockPagedData(params, 'clients', [ { name: 'client1', client_id: 'YwqVtt8W3pw5AuEz3B2Kse9l2Ruy7Tec' }, { name: 'idp-one', client_id: 'YwqVtt8W3pw5AuEz3B2Kse9l2Ruy7Teb' }, @@ -412,19 +423,19 @@ describe('#connections handler', () => { expect(data).to.be.an('undefined'); return Promise.resolve({ data }); }, - update: function (params, data) { + update: function (id, data) { (() => expect(this).to.not.be.undefined)(); - expect(params).to.be.an('object'); - expect(params.id).to.equal('con1'); + expect(id).to.be.a('string'); + expect(id).to.equal('con1'); expect(data).to.deep.equal({ enabled_clients: ['client1-id', 'excluded-one-id'], options: { passwordPolicy: 'testPolicy' }, }); - return Promise.resolve({ data: { ...params, ...data } }); + return Promise.resolve({ ...data, id }); }, delete: () => Promise.resolve({ data: [] }), - getAll: (params) => + list: (params) => mockPagedData(params, 'connections', [ { name: 'someConnection', @@ -434,14 +445,16 @@ describe('#connections handler', () => { }, ]), _getRestClient: () => ({}), - getEnabledClients: () => Promise.resolve({ data: [] }), - updateEnabledClients: (params) => { - expect(params.id).to.equal('con1'); - return Promise.resolve({ data: [] }); + clients: { + get: () => Promise.resolve(mockPagedData({}, 'clients', [])), + update: (connectionId) => { + expect(connectionId).to.equal('con1'); + return Promise.resolve({}); + }, }, }, clients: { - getAll: (params) => + list: (params) => mockPagedData(params, 'clients', [ { name: 'client1', client_id: 'client1-id' }, { name: 'excluded-one', client_id: 'excluded-one-id' }, @@ -481,19 +494,19 @@ describe('#connections handler', () => { update: () => Promise.resolve({ data: [] }), delete: function (params) { (() => expect(this).to.not.be.undefined)(); - expect(params).to.be.an('object'); - expect(params.id).to.equal('con1'); + expect(params).to.be.a('string'); + expect(params).to.equal('con1'); return Promise.resolve({ data: [] }); }, - getAll: (params) => + list: (params) => mockPagedData(params, 'connections', [ { id: 'con1', name: 'existingConnection', strategy: 'custom' }, ]), _getRestClient: () => ({}), }, clients: { - getAll: (params) => mockPagedData(params, 'clients', []), + list: (params) => mockPagedData(params, 'clients', []), }, pool, }; @@ -518,19 +531,19 @@ describe('#connections handler', () => { update: () => Promise.resolve({ data: [] }), delete: function (params) { (() => expect(this).to.not.be.undefined)(); - expect(params).to.be.an('object'); - expect(params.id).to.equal('con1'); + expect(params).to.be.a('string'); + expect(params).to.equal('con1'); removed = true; return Promise.resolve({ data: [] }); }, - getAll: (params) => + list: (params) => mockPagedData(params, 'connections', [ { id: 'con1', name: 'existingConnection', strategy: 'custom' }, ]), _getRestClient: () => ({}), }, clients: { - getAll: (params) => mockPagedData(params, 'clients', []), + list: (params) => mockPagedData(params, 'clients', []), }, pool, }; @@ -556,14 +569,14 @@ describe('#connections handler', () => { expect(params).to.be.an('undefined'); return Promise.resolve({ data: [] }); }, - getAll: (params) => + list: (params) => mockPagedData(params, 'connections', [ { id: 'con1', name: 'existingConnection', strategy: 'custom' }, ]), _getRestClient: () => ({}), }, clients: { - getAll: (params) => mockPagedData(params, 'clients', []), + list: (params) => mockPagedData(params, 'clients', []), }, pool, }; @@ -593,14 +606,14 @@ describe('#connections handler', () => { expect(params).to.be.an('undefined'); return Promise.resolve({ data: [] }); }, - getAll: (params) => + list: (params) => mockPagedData(params, 'connections', [ { id: 'con1', name: 'existingConnection', strategy: 'custom' }, ]), _getRestClient: () => ({}), }, clients: { - getAll: (params) => mockPagedData(params, 'clients', []), + list: (params) => mockPagedData(params, 'clients', []), }, pool, }; @@ -631,7 +644,7 @@ describe('#connections handler', () => { expect(params).to.be.an('undefined'); return Promise.resolve({ data: [] }); }, - getAll: (params) => + list: (params) => mockPagedData(params, 'connections', [ { id: 'con1', name: 'existing1', strategy: 'custom' }, { id: 'con2', name: 'existing2', strategy: 'custom' }, @@ -639,7 +652,7 @@ describe('#connections handler', () => { _getRestClient: () => ({}), }, clients: { - getAll: (params) => mockPagedData(params, 'clients', []), + list: (params) => mockPagedData(params, 'clients', []), }, pool, }; @@ -671,9 +684,11 @@ describe('#connections enabled clients functionality', () => { // Mock Auth0 client mockAuth0Client = { connections: { - getEnabledClients: sinon.stub(), - updateEnabledClients: sinon.stub(), - getAll: sinon.stub(), + clients: { + get: sinon.stub(), + update: sinon.stub(), + }, + list: sinon.stub(), }, }; }); @@ -686,37 +701,28 @@ describe('#connections enabled clients functionality', () => { it('should return array of client IDs with single page', async () => { const connectionId = 'con_123'; const mockResponse = { - data: { - clients: [ - { client_id: 'client_1' }, - { client_id: 'client_2' }, - { client_id: 'client_3' }, - ], - next: null, - }, + data: [{ client_id: 'client_1' }, { client_id: 'client_2' }, { client_id: 'client_3' }], + hasNextPage: () => false, + getNextPage: async () => ({ data: [], hasNextPage: () => false }), }; - mockAuth0Client.connections.getEnabledClients.resolves(mockResponse); + mockAuth0Client.connections.clients.get.resolves(mockResponse); const result = await getConnectionEnabledClients(mockAuth0Client, connectionId); expect(result).to.deep.equal(['client_1', 'client_2', 'client_3']); - sinon.assert.calledOnceWithExactly(mockAuth0Client.connections.getEnabledClients, { - id: connectionId, - take: 50, - }); + sinon.assert.calledOnceWithExactly(mockAuth0Client.connections.clients.get, connectionId); }); it('should return empty array when no enabled clients', async () => { const connectionId = 'con_123'; const mockResponse = { - data: { - clients: [], - next: null, - }, + data: [], + hasNextPage: () => false, + getNextPage: async () => ({ data: [], hasNextPage: () => false }), }; - mockAuth0Client.connections.getEnabledClients.resolves(mockResponse); + mockAuth0Client.connections.clients.get.resolves(mockResponse); const result = await getConnectionEnabledClients(mockAuth0Client, connectionId); @@ -730,7 +736,7 @@ describe('#connections enabled clients functionality', () => { const enabledClientIds = ['client_1', 'client_2', 'client_3']; const typeName = 'connection'; - mockAuth0Client.connections.updateEnabledClients.resolves(); + mockAuth0Client.connections.clients.update.resolves(); const result = await updateConnectionEnabledClients( mockAuth0Client, @@ -740,15 +746,11 @@ describe('#connections enabled clients functionality', () => { ); expect(result).to.equal(true); - sinon.assert.calledOnceWithExactly( - mockAuth0Client.connections.updateEnabledClients, - { id: connectionId }, - [ - { client_id: 'client_1', status: true }, - { client_id: 'client_2', status: true }, - { client_id: 'client_3', status: true }, - ] - ); + sinon.assert.calledOnceWithExactly(mockAuth0Client.connections.clients.update, connectionId, [ + { client_id: 'client_1', status: true }, + { client_id: 'client_2', status: true }, + { client_id: 'client_3', status: true }, + ]); }); it('should update enabled clients with more than 50 clients', async () => { @@ -756,7 +758,7 @@ describe('#connections enabled clients functionality', () => { const enabledClientIds = Array.from({ length: 60 }, (_, i) => `client_${i + 1}`); const typeName = 'connection'; - mockAuth0Client.connections.updateEnabledClients.resolves(); + mockAuth0Client.connections.clients.update.resolves(); const result = await updateConnectionEnabledClients( mockAuth0Client, @@ -766,16 +768,16 @@ describe('#connections enabled clients functionality', () => { ); expect(result).to.equal(true); - sinon.assert.calledTwice(mockAuth0Client.connections.updateEnabledClients); + sinon.assert.calledTwice(mockAuth0Client.connections.clients.update); - const firstCall = mockAuth0Client.connections.updateEnabledClients.getCall(0); - expect(firstCall.args[0]).to.deep.equal({ id: connectionId }); + const firstCall = mockAuth0Client.connections.clients.update.getCall(0); + expect(firstCall.args[0]).to.equal(connectionId); expect(firstCall.args[1]).to.have.length(50); expect(firstCall.args[1][0]).to.deep.equal({ client_id: 'client_1', status: true }); expect(firstCall.args[1][49]).to.deep.equal({ client_id: 'client_50', status: true }); - const secondCall = mockAuth0Client.connections.updateEnabledClients.getCall(1); - expect(secondCall.args[0]).to.deep.equal({ id: connectionId }); + const secondCall = mockAuth0Client.connections.clients.update.getCall(1); + expect(secondCall.args[0]).to.equal(connectionId); expect(secondCall.args[1]).to.have.length(10); expect(secondCall.args[1][0]).to.deep.equal({ client_id: 'client_51', status: true }); expect(secondCall.args[1][9]).to.deep.equal({ client_id: 'client_60', status: true }); @@ -801,29 +803,25 @@ describe('#connections enabled clients functionality', () => { conflicts: [], }; - // Mock getAll to return newly created connections - mockAuth0Client.connections.getAll + // Mock list to return newly created connections + mockAuth0Client.connections.list .onFirstCall() .resolves({ - data: { - connections: [{ id: 'con_new_1', name: 'new-connection-1' }], - }, + data: [{ id: 'con_new_1', name: 'new-connection-1' }], }) .onSecondCall() .resolves({ - data: { - connections: [{ id: 'con_new_2', name: 'new-connection-2' }], - }, + data: [{ id: 'con_new_2', name: 'new-connection-2' }], }); // Mock updateEnabledClients - mockAuth0Client.connections.updateEnabledClients.resolves(); + mockAuth0Client.connections.clients.update.resolves(); await processConnectionEnabledClients(mockAuth0Client, typeName, changes); sinon.assert.calledOnceWithExactly(sleepStub, 2500); - sinon.assert.calledTwice(mockAuth0Client.connections.getAll); - sinon.assert.calledTwice(mockAuth0Client.connections.updateEnabledClients); + sinon.assert.calledTwice(mockAuth0Client.connections.list); + sinon.assert.calledTwice(mockAuth0Client.connections.clients.update); }); it('should process update operations', async () => { @@ -837,12 +835,12 @@ describe('#connections enabled clients functionality', () => { conflicts: [], }; - mockAuth0Client.connections.updateEnabledClients.resolves(); + mockAuth0Client.connections.clients.update.resolves(); await processConnectionEnabledClients(mockAuth0Client, typeName, changes); sinon.assert.notCalled(sleepStub); - sinon.assert.calledTwice(mockAuth0Client.connections.updateEnabledClients); + sinon.assert.calledTwice(mockAuth0Client.connections.clients.update); }); it('should process conflict operations', async () => { @@ -853,11 +851,11 @@ describe('#connections enabled clients functionality', () => { conflicts: [{ id: 'con_1', name: 'conflict-connection-1', enabled_clients: ['client_1'] }], }; - mockAuth0Client.connections.updateEnabledClients.resolves(); + mockAuth0Client.connections.clients.update.resolves(); await processConnectionEnabledClients(mockAuth0Client, typeName, changes); - sinon.assert.calledOnce(mockAuth0Client.connections.updateEnabledClients); + sinon.assert.calledOnce(mockAuth0Client.connections.clients.update); }); it('should handle database type connections differently', async () => { @@ -868,20 +866,18 @@ describe('#connections enabled clients functionality', () => { conflicts: [], }; - mockAuth0Client.connections.getAll.resolves({ - data: { - connections: [{ id: 'con_db_1', name: 'new-db-connection' }], - }, + mockAuth0Client.connections.list.resolves({ + data: [{ id: 'con_db_1', name: 'new-db-connection' }], }); - mockAuth0Client.connections.updateEnabledClients.resolves(); + mockAuth0Client.connections.clients.update.resolves(); await processConnectionEnabledClients(mockAuth0Client, typeName, changes); - sinon.assert.calledWith(mockAuth0Client.connections.getAll, { + sinon.assert.calledWith(mockAuth0Client.connections.list, { name: 'new-db-connection', take: 1, strategy: ['auth0'], - include_totals: true, + include_fields: true, }); }); }); @@ -914,39 +910,34 @@ describe('#connections enabled clients functionality', () => { describe('#getType with enabled clients', () => { it('should fetch and include enabled clients in connection data', async () => { + const getEnabledClientsStub = sinon.stub(); const auth0 = { connections: { - getAll: (params) => + list: (params) => mockPagedData(params, 'connections', [ { id: 'con_1', strategy: 'github', name: 'github-connection' }, { id: 'con_2', strategy: 'google', name: 'google-connection' }, { strategy: 'auth0', name: 'db-should-be-ignored' }, // Should be filtered out ]), - getEnabledClients: sinon.stub(), + clients: { + get: getEnabledClientsStub, + }, _getRestClient: () => ({}), }, clients: { - getAll: (params) => mockPagedData(params, 'clients', []), + list: (params) => mockPagedData(params, 'clients', []), }, pool, }; // Mock enabled clients responses - auth0.connections.getEnabledClients - .withArgs({ id: 'con_1', take: 50 }) - .resolves({ - data: { - clients: [{ client_id: 'client_1' }, { client_id: 'client_2' }], - next: null, - }, - }) - .withArgs({ id: 'con_2', take: 50 }) - .resolves({ - data: { - clients: [{ client_id: 'client_3' }], - next: null, - }, - }); + getEnabledClientsStub + .withArgs('con_1') + .resolves( + mockPagedData({}, 'clients', [{ client_id: 'client_1' }, { client_id: 'client_2' }]) + ) + .withArgs('con_2') + .resolves(mockPagedData({}, 'clients', [{ client_id: 'client_3' }])); const handler = new connections.default({ client: pageClient(auth0), config }); handler.scimHandler = scimHandlerMock; @@ -971,7 +962,7 @@ describe('#connections enabled clients functionality', () => { it('should handle connections without enabled clients', async () => { const auth0 = { connections: { - getAll: (params) => + list: (params) => mockPagedData(params, 'connections', [ { id: 'con_1', strategy: 'github', name: 'github-connection' }, ]), @@ -979,7 +970,7 @@ describe('#connections enabled clients functionality', () => { _getRestClient: () => ({}), }, clients: { - getAll: (params) => mockPagedData(params, 'clients', []), + list: (params) => mockPagedData(params, 'clients', []), }, pool, }; @@ -1013,11 +1004,11 @@ describe('#connections enabled clients functionality', () => { create: sinon.stub().resolves({ data: {} }), update: sinon.stub().resolves({ data: {} }), delete: sinon.stub().resolves({ data: {} }), - getAll: (params) => mockPagedData(params, 'connections', []), + list: (params) => mockPagedData(params, 'connections', []), _getRestClient: () => ({}), }, clients: { - getAll: (params) => mockPagedData(params, 'clients', []), + list: (params) => mockPagedData(params, 'clients', []), }, pool, }; @@ -1050,11 +1041,11 @@ describe('#connections enabled clients functionality', () => { create: sinon.stub().resolves({ data: {} }), update: sinon.stub().resolves({ data: {} }), delete: sinon.stub().resolves({ data: {} }), - getAll: (params) => mockPagedData(params, 'connections', []), + list: (params) => mockPagedData(params, 'connections', []), _getRestClient: () => ({}), }, clients: { - getAll: (params) => mockPagedData(params, 'clients', []), + list: (params) => mockPagedData(params, 'clients', []), }, pool, }; diff --git a/test/tools/auth0/handlers/customDomains.test.ts b/test/tools/auth0/handlers/customDomains.test.ts index 6db7d10f4..49fe6340a 100644 --- a/test/tools/auth0/handlers/customDomains.test.ts +++ b/test/tools/auth0/handlers/customDomains.test.ts @@ -25,7 +25,7 @@ describe('#customDomains handler', () => { it('should get custom domains', async () => { const auth0ApiClientMock = { customDomains: { - getAll: async () => customDomains, + list: async () => customDomains, create: async () => ({ data: customDomains[0] }), update: async () => ({ data: {} }), delete: async () => ({ data: {} }), @@ -47,7 +47,7 @@ describe('#customDomains handler', () => { it('should return null when retrieving domains on unsupported tenant', async () => { const auth0ApiClientMock = { customDomains: { - getAll: async () => { + list: async () => { throw { statusCode: 403, message: @@ -81,7 +81,7 @@ describe('#customDomains handler', () => { it('should handle error gracefully if custom domains not supported by tenant', async () => { const auth0ApiClientMock = { customDomains: { - getAll: async () => { + list: async () => { throw unsupportedTenantError; }, create: async () => {}, @@ -109,10 +109,10 @@ describe('#customDomains handler', () => { const auth0ApiClientMock = { customDomains: { - getAll: async () => [], - create: async (args) => { + list: async () => [], + create: async (_args) => { didCreateFunctionGetCalled = true; - expect(args).to.deep.equal({ + expect(_args).to.deep.equal({ domain: customDomains[0].domain, type: customDomains[0].type, tls_policy: customDomains[0].tls_policy, @@ -152,10 +152,10 @@ describe('#customDomains handler', () => { const auth0ApiClientMock = { customDomains: { - getAll: async () => { + list: async () => { throw unsupportedTenantError; }, - create: async (args) => { + create: async (_args: unknown) => { didCreateFunctionGetCalled = true; return customDomains[0]; }, @@ -192,7 +192,7 @@ describe('#customDomains handler', () => { const auth0ApiClientMock = { customDomains: { - getAll: async () => customDomains, + list: async () => customDomains, create: async () => { didCreateFunctionGetCalled = true; }, @@ -231,7 +231,7 @@ describe('#customDomains handler', () => { const auth0ApiClientMock = { customDomains: { - getAll: async () => customDomains, + list: async () => customDomains, create: async () => { didCreateFunctionGetCalled = true; }, @@ -270,7 +270,7 @@ describe('#customDomains handler', () => { const auth0ApiClientMock = { customDomains: { - getAll: async () => [], + list: async () => [], create: async () => { didCreateFunctionGetCalled = true; }, @@ -322,16 +322,16 @@ describe('#customDomains handler', () => { const auth0ApiClientMock = { customDomains: { - getAll: async () => [existingCustomDomain], + list: async () => [existingCustomDomain], create: async () => {}, update: async (args, data) => { didUpdateFunctionGetCalled = true; - expect(args).to.deep.equal({ id: 'cd_123' }); + expect(args).to.equal('cd_123'); expect(data).to.deep.equal({ tls_policy: 'recommended', domain_metadata: { environment: 'production' }, }); - return { data: updatedCustomDomain }; + return updatedCustomDomain; }, delete: async () => {}, }, @@ -375,11 +375,11 @@ describe('#customDomains handler', () => { const auth0ApiClientMock = { customDomains: { - getAll: async () => [existingCustomDomain], + list: async () => [existingCustomDomain], create: async () => {}, update: async (args, data) => { updateCallData = data; - return { data: {} }; + return {}; }, delete: async () => {}, }, @@ -429,11 +429,11 @@ describe('#customDomains handler', () => { const auth0ApiClientMock = { customDomains: { - getAll: async () => [], + list: async () => [], create: async (args) => { didCreateFunctionGetCalled = true; createCallArgs = args; - return { data: customDomainWithMetadata }; + return customDomainWithMetadata; }, update: async () => {}, delete: async () => {}, @@ -474,11 +474,11 @@ describe('#customDomains handler', () => { const auth0ApiClientMock = { customDomains: { - getAll: async () => [], + list: async () => [], create: async (args) => { didCreateFunctionGetCalled = true; createCallArgs = args; - return { data: customDomainWithTlsPolicy }; + return customDomainWithTlsPolicy; }, update: async () => {}, delete: async () => {}, @@ -518,11 +518,11 @@ describe('#customDomains handler', () => { const auth0ApiClientMock = { customDomains: { - getAll: async () => [], + list: async () => [], create: async (args) => { didCreateFunctionGetCalled = true; createCallArgs = args; - return { data: customDomainWithBothFields }; + return customDomainWithBothFields; }, update: async () => {}, delete: async () => {}, diff --git a/test/tools/auth0/handlers/databases.tests.js b/test/tools/auth0/handlers/databases.tests.js index 836099024..cc0e5bffb 100644 --- a/test/tools/auth0/handlers/databases.tests.js +++ b/test/tools/auth0/handlers/databases.tests.js @@ -13,6 +13,10 @@ const pool = { } return { promise: () => null }; }, + addSingleTask: (task) => { + const result = task.generator(task.data); + return { promise: () => Promise.resolve(result) }; + }, }; describe('#databases handler', () => { @@ -87,10 +91,10 @@ describe('#databases handler', () => { }, update: () => Promise.resolve({ data: [] }), delete: () => Promise.resolve({ data: [] }), - getAll: (params) => mockPagedData(params, 'connections', []), + list: (params) => mockPagedData(params, 'connections', []), }, clients: { - getAll: (params) => mockPagedData(params, 'clients', []), + list: (params) => mockPagedData(params, 'clients', []), }, pool, }; @@ -140,10 +144,10 @@ describe('#databases handler', () => { expect(data.options.attributes.username.identifier.active).to.equal(true); return Promise.resolve({ data }); }, - getAll: (params) => mockPagedData(params, 'connections', []), + list: (params) => mockPagedData(params, 'connections', []), }, clients: { - getAll: (params) => mockPagedData(params, 'clients', []), + list: (params) => mockPagedData(params, 'clients', []), }, pool, }; @@ -182,10 +186,10 @@ describe('#databases handler', () => { expect(data.options.attributes.username.identifier.active).to.equal(true); return Promise.resolve({ data }); }, - getAll: (params) => mockPagedData(params, 'connections', []), + list: (params) => mockPagedData(params, 'connections', []), }, clients: { - getAll: (params) => mockPagedData(params, 'clients', []), + list: (params) => mockPagedData(params, 'clients', []), }, pool, }; @@ -217,22 +221,22 @@ describe('#databases handler', () => { it('should successfully update database when email.unique is not mentioned and email.identifier.active is true', async () => { const auth0 = { connections: { - get: function (params) { - expect(params.id).to.equal('con1'); - return Promise.resolve({ data: { options: { someOldOption: true } } }); + get: function (id) { + expect(id).to.equal('con1'); + return Promise.resolve({ options: { someOldOption: true } }); }, - update: function (params, data) { - expect(params.id).to.equal('con1'); + update: function (id, data) { + expect(id).to.equal('con1'); expect(data.options.attributes.email.identifier.active).to.equal(true); - return Promise.resolve({ data: { ...params, ...data } }); + return Promise.resolve({ data: { id, ...data } }); }, - getAll: (params) => + list: (params) => mockPagedData(params, 'connections', [ { name: 'testDatabase', id: 'con1', strategy: 'auth0' }, ]), }, clients: { - getAll: (params) => mockPagedData(params, 'clients', []), + list: (params) => mockPagedData(params, 'clients', []), }, pool, }; @@ -297,24 +301,21 @@ describe('#databases handler', () => { let getEnabledClientsCalledOnce = false; const auth0 = { connections: { - getAll: function (params) { + list: function (params) { (() => expect(this).to.not.be.undefined)(); return mockPagedData(params, 'connections', [ { id: 'con1', strategy: 'auth0', name: 'db', enabled_clients: [clientId] }, ]); }, - getEnabledClients: () => { - getEnabledClientsCalledOnce = true; - return Promise.resolve({ - data: { - clients: [{ client_id: clientId }], - next: null, - }, - }); + clients: { + get: () => { + getEnabledClientsCalledOnce = true; + return Promise.resolve(mockPagedData({}, 'clients', [{ client_id: clientId }])); + }, }, }, clients: { - getAll: function (params) { + list: function (params) { (() => expect(this).to.not.be.undefined)(); return mockPagedData(params, 'clients', [{ name: 'test client', client_id: clientId }]); }, @@ -333,40 +334,43 @@ describe('#databases handler', () => { it('should update database', async () => { const auth0 = { connections: { - get: function (params) { + get: function (id) { (() => expect(this).to.not.be.undefined)(); - expect(params).to.be.an('object'); - expect(params.id).to.equal('con1'); - return Promise.resolve({ data: { options: { someOldOption: true } } }); + expect(id).to.be.a('string'); + expect(id).to.equal('con1'); + return Promise.resolve({ options: { someOldOption: true } }); }, create: function (data) { (() => expect(this).to.not.be.undefined)(); expect(data).to.be.an('undefined'); return Promise.resolve({ data }); }, - update: function (params, data) { + update: function (id, data) { (() => expect(this).to.not.be.undefined)(); - expect(params).to.be.an('object'); - expect(params.id).to.equal('con1'); + expect(id).to.be.a('string'); + expect(id).to.equal('con1'); expect(data).to.deep.equal({ enabled_clients: ['YwqVtt8W3pw5AuEz3B2Kse9l2Ruy7Tec'], options: { passwordPolicy: 'testPolicy', someOldOption: true }, }); - return Promise.resolve({ data: { ...params, ...data } }); + return Promise.resolve({ ...data, id }); }, delete: () => Promise.resolve({ data: [] }), - getAll: (params) => + list: (params) => mockPagedData(params, 'connections', [ { name: 'someDatabase', id: 'con1', strategy: 'auth0' }, ]), - updateEnabledClients: (params) => { - expect(params.id).to.equal('con1'); - return Promise.resolve({ data: [] }); + clients: { + get: () => Promise.resolve(mockPagedData({}, 'clients', [])), + update: (connectionId) => { + expect(connectionId).to.equal('con1'); + return Promise.resolve({}); + }, }, }, clients: { - getAll: (params) => + list: (params) => mockPagedData(params, 'clients', [ { name: 'client1', client_id: 'YwqVtt8W3pw5AuEz3B2Kse9l2Ruy7Tec' }, ]), @@ -393,29 +397,29 @@ describe('#databases handler', () => { it('should handle excluded clients properly', async () => { const auth0 = { connections: { - get: (params) => { - expect(params).to.be.an('object'); - expect(params.id).to.equal('con1'); - return Promise.resolve({ data: { options: { someOldOption: true } } }); + get: (id) => { + expect(id).to.be.a('string'); + expect(id).to.equal('con1'); + return Promise.resolve({ options: { someOldOption: true } }); }, create: function (data) { (() => expect(this).to.not.be.undefined)(); expect(data).to.be.an('undefined'); return Promise.resolve({ data }); }, - update: function (params, data) { + update: function (id, data) { (() => expect(this).to.not.be.undefined)(); - expect(params).to.be.an('object'); - expect(params.id).to.equal('con1'); + expect(id).to.be.a('string'); + expect(id).to.equal('con1'); expect(data).to.deep.equal({ enabled_clients: ['client1-id', 'excluded-one-id'], options: { passwordPolicy: 'testPolicy', someOldOption: true }, }); - return Promise.resolve({ data: { ...params, ...data } }); + return Promise.resolve({ ...data, id }); }, delete: () => Promise.resolve({ data: [] }), - getAll: (params) => + list: (params) => mockPagedData(params, 'connections', [ { name: 'someDatabase', @@ -424,14 +428,16 @@ describe('#databases handler', () => { enabled_clients: ['excluded-one-id'], }, ]), - getEnabledClients: () => Promise.resolve({ data: [] }), - updateEnabledClients: (params) => { - expect(params.id).to.equal('con1'); - return Promise.resolve({ data: [] }); + clients: { + get: () => Promise.resolve(mockPagedData({}, 'clients', [])), + update: (connectionId) => { + expect(connectionId).to.equal('con1'); + return Promise.resolve({}); + }, }, }, clients: { - getAll: (params) => + list: (params) => mockPagedData(params, 'clients', [ { name: 'client1', client_id: 'client1-id' }, { name: 'excluded-one', client_id: 'excluded-one-id' }, @@ -460,9 +466,9 @@ describe('#databases handler', () => { it('should update database without "enabled_clients" setting', async () => { const auth0 = { connections: { - get: (params) => { - expect(params).to.be.an('object'); - expect(params.id).to.equal('con1'); + get: (id) => { + expect(id).to.be.a('string'); + expect(id).to.equal('con1'); return Promise.resolve({ data: {} }); }, create: function (data) { @@ -470,28 +476,31 @@ describe('#databases handler', () => { expect(data).to.be.an('undefined'); return Promise.resolve({ data }); }, - update: function (params, data) { + update: function (id, data) { (() => expect(this).to.not.be.undefined)(); - expect(params).to.be.an('object'); - expect(params.id).to.equal('con1'); + expect(id).to.be.a('string'); + expect(id).to.equal('con1'); expect(data).to.deep.equal({ options: { passwordPolicy: 'testPolicy' }, }); - return Promise.resolve({ data: { ...params, ...data } }); + return Promise.resolve({ ...data, id }); }, delete: () => Promise.resolve([]), - getAll: (params) => + list: (params) => mockPagedData(params, 'connections', [ { name: 'someDatabase', id: 'con1', strategy: 'auth0' }, ]), - updateEnabledClients: (params) => { - expect(params.id).to.be.undefined(); - return false; + clients: { + get: () => Promise.resolve(mockPagedData({}, 'clients', [])), + update: (connectionId) => { + expect(connectionId).to.be.undefined(); + return false; + }, }, }, clients: { - getAll: (params) => + list: (params) => mockPagedData(params, 'clients', [ { name: 'client1', client_id: 'YwqVtt8W3pw5AuEz3B2Kse9l2Ruy7Tec' }, ]), @@ -524,18 +533,18 @@ describe('#databases handler', () => { update: () => Promise.resolve([]), delete: function (params) { (() => expect(this).to.not.be.undefined)(); - expect(params).to.be.an('object'); - expect(params.id).to.equal('con1'); + expect(params).to.be.a('string'); + expect(params).to.equal('con1'); return Promise.resolve({ data: [] }); }, - getAll: (params) => + list: (params) => mockPagedData(params, 'connections', [ { id: 'con1', name: 'existingConnection', strategy: 'auth0' }, ]), }, clients: { - getAll: (params) => mockPagedData(params, 'clients', []), + list: (params) => mockPagedData(params, 'clients', []), }, pool, }; @@ -560,18 +569,18 @@ describe('#databases handler', () => { update: () => Promise.resolve({ data: [] }), delete: function (params) { (() => expect(this).to.not.be.undefined)(); - expect(params).to.be.an('object'); - expect(params.id).to.equal('con1'); + expect(params).to.be.a('string'); + expect(params).to.equal('con1'); removed = true; return Promise.resolve({ data: [] }); }, - getAll: (params) => + list: (params) => mockPagedData(params, 'connections', [ { id: 'con1', name: 'existingConnection', strategy: 'auth0' }, ]), }, clients: { - getAll: (params) => mockPagedData(params, 'clients', []), + list: (params) => mockPagedData(params, 'clients', []), }, pool, }; @@ -589,18 +598,18 @@ describe('#databases handler', () => { connections: { create: (data) => Promise.resolve(data), update: () => Promise.resolve([]), - delete: function (params) { + delete: function (id) { (() => expect(this).to.not.be.undefined)(); - expect(params).to.be.an('undefined'); + expect(id).to.be.an('undefined'); return Promise.resolve({ data: [] }); }, - getAll: (params) => + list: (params) => mockPagedData(params, 'connections', [ { id: 'con1', name: 'existingConnection', strategy: 'auth0' }, ]), }, clients: { - getAll: (params) => mockPagedData(params, 'clients', []), + list: (params) => mockPagedData(params, 'clients', []), }, pool, }; @@ -625,18 +634,18 @@ describe('#databases handler', () => { connections: { create: () => Promise.resolve({ data: undefined }), update: () => Promise.resolve({ data: [] }), - delete: function (params) { + delete: function (id) { (() => expect(this).to.not.be.undefined)(); - expect(params).to.be.an('undefined'); + expect(id).to.be.an('undefined'); return Promise.resolve({ data: [] }); }, - getAll: (params) => + list: (params) => mockPagedData(params, 'connections', [ { id: 'con1', name: 'existingConnection', strategy: 'auth0' }, ]), }, clients: { - getAll: (params) => mockPagedData(params, 'clients', []), + list: (params) => mockPagedData(params, 'clients', []), }, pool, }; @@ -654,27 +663,25 @@ describe('#databases handler', () => { }; const auth0 = { connections: { - create: (params) => { - expect(params).to.be.an('undefined'); + create: () => { return Promise.resolve({ data: [] }); }, - update: (params) => { - expect(params).to.be.an('undefined'); + update: () => { return Promise.resolve({ data: [] }); }, - delete: function (params) { + delete: function (id) { (() => expect(this).to.not.be.undefined)(); - expect(params).to.be.an('undefined'); + expect(id).to.be.an('undefined'); return Promise.resolve({ data: [] }); }, - getAll: (params) => + list: (params) => mockPagedData(params, 'connections', [ { id: 'con1', name: 'existing1', strategy: 'auth0' }, { id: 'con2', name: 'existing2', strategy: 'auth0' }, ]), }, clients: { - getAll: (params) => mockPagedData(params, 'clients', []), + list: (params) => mockPagedData(params, 'clients', []), }, pool, }; @@ -694,10 +701,10 @@ describe('#databases handler', () => { it('should update database when attributes are passed', async () => { const auth0 = { connections: { - get: function (params) { + get: function (id) { (() => expect(this).to.not.be.undefined)(); - expect(params).to.be.an('object'); - expect(params.id).to.equal('con1'); + expect(id).to.be.a('string'); + expect(id).to.equal('con1'); return Promise.resolve({ options: { someOldOption: true } }); }, create: function (data) { @@ -705,10 +712,10 @@ describe('#databases handler', () => { expect(data).to.be.an('undefined'); return Promise.resolve(data); }, - update: function (params, data) { + update: function (id, data) { (() => expect(this).to.not.be.undefined)(); - expect(params).to.be.an('object'); - expect(params.id).to.equal('con1'); + expect(id).to.be.a('string'); + expect(id).to.equal('con1'); expect(data).to.deep.equal({ attributes: { email: { @@ -745,13 +752,13 @@ describe('#databases handler', () => { options: { passwordPolicy: 'testPolicy', someOldOption: true }, }); - return Promise.resolve({ ...params, ...data }); + return Promise.resolve({ ...data, id }); }, delete: () => Promise.resolve([]), - getAll: () => [{ name: 'someDatabase', id: 'con1', strategy: 'auth0' }], + list: () => [{ name: 'someDatabase', id: 'con1', strategy: 'auth0' }], }, clients: { - getAll: () => [{ name: 'client1', client_id: 'YwqVtt8W3pw5AuEz3B2Kse9l2Ruy7Tec' }], + list: () => [{ name: 'client1', client_id: 'YwqVtt8W3pw5AuEz3B2Kse9l2Ruy7Tec' }], }, pool, }; @@ -804,10 +811,10 @@ describe('#databases handler', () => { it('should update database when require username and validation are passed', async () => { const auth0 = { connections: { - get: function (params) { + get: function (id) { (() => expect(this).to.not.be.undefined)(); - expect(params).to.be.an('object'); - expect(params.id).to.equal('con1'); + expect(id).to.be.a('string'); + expect(id).to.equal('con1'); return Promise.resolve({ options: { someOldOption: true } }); }, create: function (data) { @@ -815,10 +822,10 @@ describe('#databases handler', () => { expect(data).to.be.an('undefined'); return Promise.resolve(data); }, - update: function (params, data) { + update: function (id, data) { (() => expect(this).to.not.be.undefined)(); - expect(params).to.be.an('object'); - expect(params.id).to.equal('con1'); + expect(id).to.be.a('string'); + expect(id).to.equal('con1'); expect(data).to.deep.equal({ validation: { username: { @@ -830,13 +837,13 @@ describe('#databases handler', () => { options: { passwordPolicy: 'testPolicy', someOldOption: true }, }); - return Promise.resolve({ ...params, ...data }); + return Promise.resolve({ ...data, id }); }, delete: () => Promise.resolve([]), - getAll: () => [{ name: 'someDatabase', id: 'con1', strategy: 'auth0' }], + list: () => [{ name: 'someDatabase', id: 'con1', strategy: 'auth0' }], }, clients: { - getAll: () => [{ name: 'client1', client_id: 'YwqVtt8W3pw5AuEz3B2Kse9l2Ruy7Tec' }], + list: () => [{ name: 'client1', client_id: 'YwqVtt8W3pw5AuEz3B2Kse9l2Ruy7Tec' }], }, pool, }; @@ -866,7 +873,6 @@ describe('#databases handler', () => { const updateStub = sinon.stub().resolves({ id: 'con1', }); - const logWarnSpy = sinon.spy(console, 'warn'); const deleteStub = sinon.stub().resolves([]); const getAllStub = sinon.stub().resolves([ { @@ -887,10 +893,10 @@ describe('#databases handler', () => { get: getStub, update: updateStub, delete: deleteStub, - getAll: getAllStub, + list: getAllStub, }, clients: { - getAll: sinon + list: sinon .stub() .resolves([{ name: 'client1', client_id: 'YwqVtt8W3pw5AuEz3B2Kse9l2Ruy7Tec' }]), }, @@ -907,9 +913,6 @@ describe('#databases handler', () => { const validation = payload?.options?.validation; if (attributes && (requiresUsername || validation)) { - console.warn( - 'Warning: "attributes" cannot be used with "requires_username" or "validation". Please remove one of the conflicting options.' - ); throw new Error('Cannot set both attributes and requires_username or validation'); } @@ -989,19 +992,8 @@ describe('#databases handler', () => { ); } - // eslint-disable-next-line no-unused-expressions - expect(logWarnSpy.calledOnce).to.be.true; - // eslint-disable-next-line no-unused-expressions - expect( - logWarnSpy.calledWith( - 'Warning: "attributes" cannot be used with "requires_username" or "validation". Please remove one of the conflicting options.' - ) - ).to.be.true; - sinon.assert.calledOnce(getStub); sinon.assert.notCalled(updateStub); - - logWarnSpy.restore(); }); it('should update database with attributes and remove validation from the update request if validation is in the get response but attributes are in the update request', async () => { @@ -1040,10 +1032,10 @@ describe('#databases handler', () => { get: getStub, update: updateStub, delete: deleteStub, - getAll: getAllStub, + list: getAllStub, }, clients: { - getAll: sinon + list: sinon .stub() .resolves([{ name: 'client1', client_id: 'YwqVtt8W3pw5AuEz3B2Kse9l2Ruy7Tec' }]), }, @@ -1059,20 +1051,15 @@ describe('#databases handler', () => { const requiresUsername = payload?.options?.requires_username; const validation = payload?.options?.validation; if (attributes && (requiresUsername || validation)) { - console.warn( - 'Warning: "attributes" cannot be used with "requires_username" or "validation". Please remove one of the conflicting options.' - ); throw new Error('Cannot set both attributes and requires_username or validation'); } if (attributes) { - console.info('Info: "Removed Validation from Connection Payload"'); delete connection.options.validation; delete connection.options.requires_username; } if (requiresUsername || validation) { - console.info('Info: "Removed Attributes from Connection Payload"'); delete connection.options.attributes; } @@ -1226,10 +1213,10 @@ describe('#databases handler', () => { get: getStub, update: updateStub, delete: deleteStub, - getAll: getAllStub, + list: getAllStub, }, clients: { - getAll: sinon + list: sinon .stub() .resolves([{ name: 'client1', client_id: 'YwqVtt8W3pw5AuEz3B2Kse9l2Ruy7Tec' }]), }, @@ -1246,20 +1233,15 @@ describe('#databases handler', () => { const validation = payload?.options?.validation; if (attributes && (requiresUsername || validation)) { - console.warn( - 'Warning: "attributes" cannot be used with "requires_username" or "validation". Please remove one of the conflicting options.' - ); throw new Error('Cannot set both attributes and requires_username or validation'); } if (attributes) { - console.info('Info: "Removed Validation from Connection Payload"'); delete connection.options.validation; delete connection.options.requires_username; } if (requiresUsername || validation) { - console.info('Info: "Removed Attributes from Connection Payload"'); delete connection.options.attributes; } @@ -1309,10 +1291,10 @@ describe('#databases handler', () => { it('should update database when attributes are passed', async () => { const auth0 = { connections: { - get: function (params) { + get: function (id) { (() => expect(this).to.not.be.undefined)(); - expect(params).to.be.an('object'); - expect(params.id).to.equal('con1'); + expect(id).to.be.a('string'); + expect(id).to.equal('con1'); return Promise.resolve({ options: { someOldOption: true } }); }, create: function (data) { @@ -1320,10 +1302,10 @@ describe('#databases handler', () => { expect(data).to.be.an('undefined'); return Promise.resolve(data); }, - update: function (params, data) { + update: function (id, data) { (() => expect(this).to.not.be.undefined)(); - expect(params).to.be.an('object'); - expect(params.id).to.equal('con1'); + expect(id).to.be.a('string'); + expect(id).to.equal('con1'); expect(data).to.deep.equal({ attributes: { email: { @@ -1360,13 +1342,13 @@ describe('#databases handler', () => { options: { passwordPolicy: 'testPolicy', someOldOption: true }, }); - return Promise.resolve({ ...params, ...data }); + return Promise.resolve({ ...data, id }); }, delete: () => Promise.resolve([]), - getAll: () => [{ name: 'someDatabase', id: 'con1', strategy: 'auth0' }], + list: () => [{ name: 'someDatabase', id: 'con1', strategy: 'auth0' }], }, clients: { - getAll: () => [{ name: 'client1', client_id: 'YwqVtt8W3pw5AuEz3B2Kse9l2Ruy7Tec' }], + list: () => [{ name: 'client1', client_id: 'YwqVtt8W3pw5AuEz3B2Kse9l2Ruy7Tec' }], }, pool, }; @@ -1419,10 +1401,10 @@ describe('#databases handler', () => { it('should update database when require username and validation are passed', async () => { const auth0 = { connections: { - get: function (params) { + get: function (id) { (() => expect(this).to.not.be.undefined)(); - expect(params).to.be.an('object'); - expect(params.id).to.equal('con1'); + expect(id).to.be.a('string'); + expect(id).to.equal('con1'); return Promise.resolve({ options: { someOldOption: true } }); }, create: function (data) { @@ -1430,10 +1412,10 @@ describe('#databases handler', () => { expect(data).to.be.an('undefined'); return Promise.resolve(data); }, - update: function (params, data) { + update: function (id, data) { (() => expect(this).to.not.be.undefined)(); - expect(params).to.be.an('object'); - expect(params.id).to.equal('con1'); + expect(id).to.be.a('string'); + expect(id).to.equal('con1'); expect(data).to.deep.equal({ validation: { username: { @@ -1445,13 +1427,13 @@ describe('#databases handler', () => { options: { passwordPolicy: 'testPolicy', someOldOption: true }, }); - return Promise.resolve({ ...params, ...data }); + return Promise.resolve({ ...data, id }); }, delete: () => Promise.resolve([]), - getAll: () => [{ name: 'someDatabase', id: 'con1', strategy: 'auth0' }], + list: () => [{ name: 'someDatabase', id: 'con1', strategy: 'auth0' }], }, clients: { - getAll: () => [{ name: 'client1', client_id: 'YwqVtt8W3pw5AuEz3B2Kse9l2Ruy7Tec' }], + list: () => [{ name: 'client1', client_id: 'YwqVtt8W3pw5AuEz3B2Kse9l2Ruy7Tec' }], }, pool, }; @@ -1481,7 +1463,6 @@ describe('#databases handler', () => { const updateStub = sinon.stub().resolves({ id: 'con1', }); - const logWarnSpy = sinon.spy(console, 'warn'); const deleteStub = sinon.stub().resolves([]); const getAllStub = sinon.stub().resolves([ { @@ -1502,10 +1483,10 @@ describe('#databases handler', () => { get: getStub, update: updateStub, delete: deleteStub, - getAll: getAllStub, + list: getAllStub, }, clients: { - getAll: sinon + list: sinon .stub() .resolves([{ name: 'client1', client_id: 'YwqVtt8W3pw5AuEz3B2Kse9l2Ruy7Tec' }]), }, @@ -1522,9 +1503,6 @@ describe('#databases handler', () => { const validation = payload?.options?.validation; if (attributes && (requiresUsername || validation)) { - console.warn( - 'Warning: "attributes" cannot be used with "requires_username" or "validation". Please remove one of the conflicting options.' - ); throw new Error('Cannot set both attributes and requires_username or validation'); } @@ -1605,19 +1583,8 @@ describe('#databases handler', () => { ); } - // eslint-disable-next-line no-unused-expressions - expect(logWarnSpy.calledOnce).to.be.true; - // eslint-disable-next-line no-unused-expressions - expect( - logWarnSpy.calledWith( - 'Warning: "attributes" cannot be used with "requires_username" or "validation". Please remove one of the conflicting options.' - ) - ).to.be.true; - sinon.assert.calledOnce(getStub); sinon.assert.notCalled(updateStub); - - logWarnSpy.restore(); }); it('should update database with attributes and remove validation from the update request if validation is in the get response but attributes are in the update request', async () => { @@ -1656,10 +1623,10 @@ describe('#databases handler', () => { get: getStub, update: updateStub, delete: deleteStub, - getAll: getAllStub, + list: getAllStub, }, clients: { - getAll: sinon + list: sinon .stub() .resolves([{ name: 'client1', client_id: 'YwqVtt8W3pw5AuEz3B2Kse9l2Ruy7Tec' }]), }, @@ -1675,20 +1642,15 @@ describe('#databases handler', () => { const requiresUsername = payload?.options?.requires_username; const validation = payload?.options?.validation; if (attributes && (requiresUsername || validation)) { - console.warn( - 'Warning: "attributes" cannot be used with "requires_username" or "validation". Please remove one of the conflicting options.' - ); throw new Error('Cannot set both attributes and requires_username or validation'); } if (attributes) { - console.info('Info: "Removed Validation from Connection Payload"'); delete connection.options.validation; delete connection.options.requires_username; } if (requiresUsername || validation) { - console.info('Info: "Removed Attributes from Connection Payload"'); delete connection.options.attributes; } @@ -1842,10 +1804,10 @@ describe('#databases handler', () => { get: getStub, update: updateStub, delete: deleteStub, - getAll: getAllStub, + list: getAllStub, }, clients: { - getAll: sinon + list: sinon .stub() .resolves([{ name: 'client1', client_id: 'YwqVtt8W3pw5AuEz3B2Kse9l2Ruy7Tec' }]), }, @@ -1862,20 +1824,15 @@ describe('#databases handler', () => { const validation = payload?.options?.validation; if (attributes && (requiresUsername || validation)) { - console.warn( - 'Warning: "attributes" cannot be used with "requires_username" or "validation". Please remove one of the conflicting options.' - ); throw new Error('Cannot set both attributes and requires_username or validation'); } if (attributes) { - console.info('Info: "Removed Validation from Connection Payload"'); delete connection.options.validation; delete connection.options.requires_username; } if (requiresUsername || validation) { - console.info('Info: "Removed Attributes from Connection Payload"'); delete connection.options.attributes; } @@ -1940,37 +1897,32 @@ describe('#databases handler with enabled clients integration', () => { describe('#getType with enabled clients', () => { it('should fetch and include enabled clients in database connection data', async () => { + const getEnabledClientsStub = sinon.stub(); const auth0 = { connections: { - getAll: (params) => + list: (params) => mockPagedData(params, 'connections', [ { id: 'con_1', strategy: 'auth0', name: 'database-connection-1' }, { id: 'con_2', strategy: 'auth0', name: 'database-connection-2' }, ]), - getEnabledClients: sinon.stub(), + clients: { + get: getEnabledClientsStub, + }, }, clients: { - getAll: (params) => mockPagedData(params, 'clients', []), + list: (params) => mockPagedData(params, 'clients', []), }, pool, }; // Mock enabled clients responses - auth0.connections.getEnabledClients - .withArgs({ id: 'con_1', take: 50 }) - .resolves({ - data: { - clients: [{ client_id: 'client_1' }, { client_id: 'client_2' }], - next: null, - }, - }) - .withArgs({ id: 'con_2', take: 50 }) - .resolves({ - data: { - clients: [{ client_id: 'client_3' }], - next: null, - }, - }); + getEnabledClientsStub + .withArgs('con_1') + .resolves( + mockPagedData({}, 'clients', [{ client_id: 'client_1' }, { client_id: 'client_2' }]) + ) + .withArgs('con_2') + .resolves(mockPagedData({}, 'clients', [{ client_id: 'client_3' }])); const handler = new databases.default({ client: pageClient(auth0), config }); @@ -1994,26 +1946,20 @@ describe('#databases handler with enabled clients integration', () => { it('should handle database connections without enabled clients', async () => { const auth0 = { connections: { - getAll: (params) => + list: (params) => mockPagedData(params, 'connections', [ { id: 'con_1', strategy: 'auth0', name: 'database-connection-1' }, ]), - getEnabledClients: sinon.stub(), + clients: { + get: sinon.stub().resolves(mockPagedData({}, 'clients', [])), + }, }, clients: { - getAll: (params) => mockPagedData(params, 'clients', []), + list: (params) => mockPagedData(params, 'clients', []), }, pool, }; - // Mock empty enabled clients response - auth0.connections.getEnabledClients.resolves({ - data: { - clients: [], - next: null, - }, - }); - const handler = new databases.default({ client: pageClient(auth0), config }); const result = await handler.getType(); @@ -2035,10 +1981,10 @@ describe('#databases handler with enabled clients integration', () => { update: sinon.stub().resolves({ data: {} }), delete: sinon.stub().resolves({ data: {} }), get: sinon.stub().resolves({ data: { options: {} } }), - getAll: (params) => mockPagedData(params, 'connections', []), + list: (params) => mockPagedData(params, 'connections', []), }, clients: { - getAll: (params) => mockPagedData(params, 'clients', []), + list: (params) => mockPagedData(params, 'clients', []), }, pool, }; @@ -2069,10 +2015,10 @@ describe('#databases handler with enabled clients integration', () => { update: sinon.stub().resolves({ data: {} }), delete: sinon.stub().resolves({ data: {} }), get: sinon.stub().resolves({ data: { options: {} } }), - getAll: (params) => mockPagedData(params, 'connections', []), + list: (params) => mockPagedData(params, 'connections', []), }, clients: { - getAll: (params) => mockPagedData(params, 'clients', []), + list: (params) => mockPagedData(params, 'clients', []), }, pool, }; @@ -2113,10 +2059,10 @@ describe('#databases handler with enabled clients integration', () => { update: sinon.stub().resolves({ data: {} }), delete: sinon.stub().resolves({ data: {} }), get: sinon.stub().resolves({ data: { options: {} } }), - getAll: (params) => mockPagedData(params, 'connections', []), + list: (params) => mockPagedData(params, 'connections', []), }, clients: { - getAll: (params) => mockPagedData(params, 'clients', []), + list: (params) => mockPagedData(params, 'clients', []), }, pool, }; @@ -2146,10 +2092,10 @@ describe('#databases handler with enabled clients integration', () => { update: sinon.stub().resolves({ data: {} }), delete: sinon.stub().resolves({ data: {} }), get: sinon.stub().resolves({ data: { options: {} } }), - getAll: (params) => mockPagedData(params, 'connections', []), + list: (params) => mockPagedData(params, 'connections', []), }, clients: { - getAll: (params) => mockPagedData(params, 'clients', []), + list: (params) => mockPagedData(params, 'clients', []), }, pool, }; diff --git a/test/tools/auth0/handlers/default.tests.ts b/test/tools/auth0/handlers/default.tests.ts index de6a8bc75..fefff4938 100644 --- a/test/tools/auth0/handlers/default.tests.ts +++ b/test/tools/auth0/handlers/default.tests.ts @@ -30,11 +30,14 @@ const mockApiClient = { } as Auth0APIClient; describe('#default handler', () => { + const config = () => undefined; + it('should strip designated fields from payload when creating', async () => { let didCreateFunctionGetCalled = false; const handler = new mockHandler({ client: mockApiClient, + config, stripCreateFields: ['stripThisFromCreate', 'stripObjectFromCreate.nestedProperty'], type: mockAssetType, functions: { @@ -98,6 +101,7 @@ describe('#default handler', () => { const handler = new mockHandler({ client: mockApiClient, + config, sensitiveFieldsToObfuscate: ['secret', 'auth_key'], type: mockAssetType, functions: { @@ -136,6 +140,7 @@ describe('#default handler', () => { const handler = new mockHandler({ client: mockApiClient, + config, sensitiveFieldsToObfuscate: ['secret', 'auth_key'], type: mockAssetType, functions: { diff --git a/test/tools/auth0/handlers/emailProvider.tests.js b/test/tools/auth0/handlers/emailProvider.tests.js index 472e22b8e..656296f90 100644 --- a/test/tools/auth0/handlers/emailProvider.tests.js +++ b/test/tools/auth0/handlers/emailProvider.tests.js @@ -6,14 +6,15 @@ describe('#emailProvider handler', () => { it('should configure email provider', async () => { const auth0 = { emails: { - configure: (data) => { - expect(data).to.be.an('object'); - expect(data.name).to.equal('someProvider'); - return Promise.resolve({ data }); + provider: { + create: (data) => { + expect(data).to.be.an('object'); + expect(data.name).to.equal('someProvider'); + return Promise.resolve(data); + }, + update: (data) => Promise.resolve(data), + get: () => Promise.resolve({}), }, - update: (data) => Promise.resolve({ data }), - delete: () => Promise.resolve({ data: null }), - get: () => ({ data: [] }), }, }; @@ -26,15 +27,16 @@ describe('#emailProvider handler', () => { it('should update email provider', async () => { const auth0 = { emails: { - configure: (data) => Promise.resolve({ data }), - update: (data) => { - expect(data).to.be.an('object'); - expect(data.name).to.equal('someProvider'); - expect(data.credentials).to.equal('password'); - return Promise.resolve({ data }); + provider: { + create: (data) => Promise.resolve(data), + update: (data) => { + expect(data).to.be.an('object'); + expect(data.name).to.equal('someProvider'); + expect(data.credentials).to.equal('password'); + return Promise.resolve(data); + }, + get: () => Promise.resolve({ name: 'someProvider', enabled: false }), }, - delete: () => Promise.resolve({ data: null }), - get: () => ({ data: { name: 'someProvider', enabled: false } }), }, }; @@ -56,15 +58,17 @@ describe('#emailProvider handler', () => { let wasUpdateCalled = false; const auth0 = { emails: { - delete: () => { - wasDeleteCalled = true; - return Promise.resolve({ data: {} }); + provider: { + delete: () => { + wasDeleteCalled = true; + return Promise.resolve({}); + }, + update: () => { + wasUpdateCalled = true; + return Promise.resolve({}); + }, + get: () => Promise.resolve({ name: 'someProvider', enabled: true }), }, - update: () => { - wasUpdateCalled = true; - return Promise.resolve({ data: {} }); - }, - get: () => ({ data: { name: 'someProvider', enabled: true } }), }, }; @@ -85,10 +89,12 @@ describe('#emailProvider handler', () => { const auth0 = { emails: { - delete: () => { - throw new Error('was not expecting delete to be called'); + provider: { + delete: () => { + throw new Error('was not expecting delete to be called'); + }, + get: () => Promise.resolve({ name: 'someProvider', enabled: true }), }, - get: () => ({ data: { name: 'someProvider', enabled: true } }), }, }; @@ -104,7 +110,9 @@ describe('#emailProvider handler', () => { it('should get email provider', async () => { const auth0 = { emails: { - get: () => ({ data: { name: 'smtp', enabled: true } }), + provider: { + get: () => Promise.resolve({ name: 'smtp', enabled: true }), + }, }, }; @@ -113,18 +121,24 @@ describe('#emailProvider handler', () => { expect(data).to.deep.equal({ name: 'smtp', enabled: true }); }); - it('should delete email provider and create another one instead', async () => { + // DELETE on emails/provider is not supported on SDK, so changing provider should call update instead + it('should update email provider when changing to a different provider (delete not supported)', async () => { + let wasUpdateCalled = false; const auth0 = { emails: { - configure: (data) => { - expect(data).to.be.an('object'); - expect(data.name).to.equal('someProvider'); - expect(data.credentials).to.equal('password'); - return Promise.resolve({ data }); + provider: { + create: () => { + throw new Error('was not expecting create to be called'); + }, + update: (data) => { + expect(data).to.be.an('object'); + expect(data.name).to.equal('someProvider'); + expect(data.credentials).to.equal('password'); + wasUpdateCalled = true; + return Promise.resolve(data); + }, + get: () => Promise.resolve({ name: 'oldProvider', enabled: true }), }, - update: (data) => Promise.resolve({ data }), - delete: () => Promise.resolve({ data: null }), - get: () => ({ data: { name: 'oldProvider', enabled: true } }), }, }; @@ -137,6 +151,7 @@ describe('#emailProvider handler', () => { }; await stageFn.apply(handler, [{ emailProvider: data }]); + expect(wasUpdateCalled).to.equal(true); }); }); }); diff --git a/test/tools/auth0/handlers/emailTemplates.tests.js b/test/tools/auth0/handlers/emailTemplates.tests.js index bc9b8bfd5..0831088ef 100644 --- a/test/tools/auth0/handlers/emailTemplates.tests.js +++ b/test/tools/auth0/handlers/emailTemplates.tests.js @@ -12,16 +12,16 @@ describe('#emailTemplates handler', () => { emailTemplates: { create: function (data) { (() => expect(this).to.not.be.undefined)(); - return Promise.resolve({ data }); + return Promise.resolve(data); }, - update: function (params, data) { + update: function (templateName, data) { (() => expect(this).to.not.be.undefined)(); - expect(params).to.be.an('object'); + expect(templateName).to.be.a('string'); expect(data).to.be.an('object'); - expect(params.templateName).to.equal('verify_email'); + expect(templateName).to.equal('verify_email'); expect(data.template).to.equal('verify_email'); expect(data.body).to.equal('body'); - return Promise.resolve({ data: { params, data } }); + return Promise.resolve(data); }, }, }; @@ -37,13 +37,12 @@ describe('#emailTemplates handler', () => { it('should get email templates', async () => { const auth0 = { emailTemplates: { - get: (template) => ({ - data: { - template: template.templateName, + get: (templateName) => + Promise.resolve({ + template: templateName, enabled: true, body: 'some email', - }, - }), + }), }, }; @@ -66,7 +65,7 @@ describe('#emailTemplates handler', () => { expect(data).to.be.an('object'); expect(data.template).to.equal('verify_email'); expect(data.body).to.equal('body'); - return Promise.resolve({ data }); + return Promise.resolve(data); }, update: () => { const error = new Error('test'); @@ -93,16 +92,16 @@ describe('#emailTemplates handler', () => { expect(data.template).to.equal('async_approval'); expect(data.body).to.equal('async approval'); expect(data.subject).to.equal('Async Approval Required'); - return Promise.resolve({ data }); + return Promise.resolve(data); }, - update: function (params, data) { + update: function (templateName, data) { (() => expect(this).to.not.be.undefined)(); - expect(params).to.be.an('object'); + expect(templateName).to.be.a('string'); expect(data).to.be.an('object'); - expect(params.templateName).to.equal('async_approval'); + expect(templateName).to.equal('async_approval'); expect(data.template).to.equal('async_approval'); expect(data.body).to.equal('async approval'); - return Promise.resolve({ data: { params, data } }); + return Promise.resolve(data); }, }, }; @@ -127,17 +126,14 @@ describe('#emailTemplates handler', () => { it('should get async_approval in response', async () => { const auth0 = { emailTemplates: { - get: (template) => ({ - data: { - template: template.templateName, + get: (templateName) => + Promise.resolve({ + template: templateName, enabled: true, body: 'some email', subject: - template.templateName === 'async_approval' - ? 'Async Approval Required' - : 'Test Subject', - }, - }), + templateName === 'async_approval' ? 'Async Approval Required' : 'Test Subject', + }), }, }; diff --git a/test/tools/auth0/handlers/flowVaultConnections.tests.js b/test/tools/auth0/handlers/flowVaultConnections.tests.js index 62be37021..600c38c76 100644 --- a/test/tools/auth0/handlers/flowVaultConnections.tests.js +++ b/test/tools/auth0/handlers/flowVaultConnections.tests.js @@ -65,7 +65,13 @@ describe('#flowVaultConnections handler', () => { describe('#flowVaultConnections process', () => { it('should return empty if no flowVaultConnections asset', async () => { const auth0 = { - flowVaultConnections: {}, + flows: { + vault: { + connections: { + list: (params) => mockPagedData(params, 'connections', []), + }, + }, + }, pool, }; @@ -78,13 +84,17 @@ describe('#flowVaultConnections handler', () => { it('should create flowVaultConnections', async () => { const auth0 = { flows: { - createConnection: function (data) { - (() => expect(this).to.not.be.undefined)(); - expect(data).to.be.an('object'); - expect(data.name).to.equal(sampleFlowVaultConnections.name); - return Promise.resolve({ data }); + vault: { + connections: { + create: function (data) { + (() => expect(this).to.not.be.undefined)(); + expect(data).to.be.an('object'); + expect(data.name).to.equal(sampleFlowVaultConnections.name); + return Promise.resolve(data); + }, + list: (params) => mockPagedData(params, 'connections', []), + }, }, - getAllConnections: (params) => mockPagedData(params, 'connections', []), }, pool, }; @@ -102,8 +112,11 @@ describe('#flowVaultConnections handler', () => { it('should get flowVaultConnections', async () => { const auth0 = { flows: { - getAllConnections: (params) => - mockPagedData(params, 'connections', [sampleFlowVaultConnections]), + vault: { + connections: { + list: (params) => mockPagedData(params, 'connections', [sampleFlowVaultConnections]), + }, + }, }, pool, }; @@ -116,16 +129,19 @@ describe('#flowVaultConnections handler', () => { it('should update flowVaultConnections', async () => { const auth0 = { flows: { - updateConnection: function (params, data) { - (() => expect(this).to.not.be.undefined)(); - expect(params).to.be.an('object'); - expect(params.id).to.equal(sampleFlowVaultConnections.id); - expect(data).to.be.an('object'); - expect(data.name).to.equal(sampleFlowVaultConnections.name); - return Promise.resolve({ data }); + vault: { + connections: { + update: function (id, data) { + (() => expect(this).to.not.be.undefined)(); + expect(id).to.be.a('string'); + expect(id).to.equal(sampleFlowVaultConnections.id); + expect(data).to.be.an('object'); + expect(data.name).to.equal(sampleFlowVaultConnections.name); + return Promise.resolve(data); + }, + list: (params) => mockPagedData(params, 'connections', [sampleFlowVaultConnections]), + }, }, - getAllConnections: (params) => - mockPagedData(params, 'connections', [sampleFlowVaultConnections]), }, pool, }; @@ -148,20 +164,23 @@ describe('#flowVaultConnections handler', () => { }; const auth0 = { flows: { - createConnection: function (data) { - (() => expect(this).to.not.be.undefined)(); - expect(data).to.be.an('object'); - expect(data.name).to.equal(newFlowConnection.name); - return Promise.resolve({ data }); - }, - deleteConnection: function (params) { - (() => expect(this).to.not.be.undefined)(); - expect(params).to.be.an('object'); - expect(params.id).to.equal(sampleFlowVaultConnections.id); - return Promise.resolve({ data: [] }); + vault: { + connections: { + create: function (data) { + (() => expect(this).to.not.be.undefined)(); + expect(data).to.be.an('object'); + expect(data.name).to.equal(newFlowConnection.name); + return Promise.resolve(data); + }, + delete: function (id) { + (() => expect(this).to.not.be.undefined)(); + expect(id).to.be.a('string'); + expect(id).to.equal(sampleFlowVaultConnections.id); + return Promise.resolve([]); + }, + list: (params) => mockPagedData(params, 'connections', [sampleFlowVaultConnections]), + }, }, - getAllConnections: (params) => - mockPagedData(params, 'connections', [sampleFlowVaultConnections]), }, pool, }; @@ -176,15 +195,18 @@ describe('#flowVaultConnections handler', () => { let removed = false; const auth0 = { flows: { - deleteConnection: function (params) { - removed = true; - (() => expect(this).to.not.be.undefined)(); - expect(params).to.be.an('object'); - expect(params.id).to.equal(sampleFlowVaultConnections.id); - return Promise.resolve({ data: [] }); + vault: { + connections: { + delete: function (id) { + removed = true; + (() => expect(this).to.not.be.undefined)(); + expect(id).to.be.a('string'); + expect(id).to.equal(sampleFlowVaultConnections.id); + return Promise.resolve([]); + }, + list: (params) => mockPagedData(params, 'connections', [sampleFlowVaultConnections]), + }, }, - getAllConnections: (params) => - mockPagedData(params, 'connections', [sampleFlowVaultConnections]), }, pool, }; @@ -200,12 +222,15 @@ describe('#flowVaultConnections handler', () => { config.data.AUTH0_ALLOW_DELETE = false; const auth0 = { flows: { - deleteConnection: (params) => { - expect(params).to.be.an('undefined'); - return Promise.resolve({ data: [] }); + vault: { + connections: { + delete: (id) => { + expect(id).to.be.an('undefined'); + return Promise.resolve([]); + }, + list: (params) => mockPagedData(params, 'connections', [sampleFlowVaultConnections]), + }, }, - getAllConnections: (params) => - mockPagedData(params, 'connections', [sampleFlowVaultConnections]), }, pool, }; diff --git a/test/tools/auth0/handlers/flows.tests.js b/test/tools/auth0/handlers/flows.tests.js index 9f435b3ce..b45679082 100644 --- a/test/tools/auth0/handlers/flows.tests.js +++ b/test/tools/auth0/handlers/flows.tests.js @@ -67,7 +67,13 @@ describe('#flows handler', () => { describe('#flows process', () => { it('should return empty if no flows asset', async () => { const auth0 = { - flows: {}, + flows: { + vault: { + connections: { + list: (params) => mockPagedData(params, 'connections', []), + }, + }, + }, pool, }; @@ -84,12 +90,16 @@ describe('#flows handler', () => { (() => expect(this).to.not.be.undefined)(); expect(data).to.be.an('object'); expect(data.name).to.equal(sampleFlowWthID.name); - return Promise.resolve({ data }); + return Promise.resolve(data); + }, + update: () => Promise.resolve([]), + delete: () => Promise.resolve([]), + list: (params) => mockPagedData(params, 'flows', []), + vault: { + connections: { + list: (params) => mockPagedData(params, 'connections', []), + }, }, - update: () => Promise.resolve({ data: [] }), - delete: () => Promise.resolve({ data: [] }), - getAll: (params) => mockPagedData(params, 'flows', []), - getAllConnections: (params) => mockPagedData(params, 'connections', []), }, pool, }; @@ -133,11 +143,14 @@ describe('#flows handler', () => { create: function (data) { (() => expect(this).to.not.be.undefined)(); expect(data).to.be.an('object'); - return Promise.resolve({ data }); + return Promise.resolve(data); + }, + list: (params) => mockPagedData(params, 'flows', []), + vault: { + connections: { + list: (params) => mockPagedData(params, 'connections', [sampleConnectionWithID]), + }, }, - getAll: (params) => mockPagedData(params, 'flows', []), - getAllConnections: (params) => - mockPagedData(params, 'connections', [sampleConnectionWithID]), }, pool, }; @@ -155,15 +168,16 @@ describe('#flows handler', () => { it('should get flows', async () => { const auth0 = { flows: { - getAll: (params) => mockPagedData(params, 'flows', [sampleFlowWthID]), - get: (params) => { - expect(params).to.be.an('object'); - expect(params.id).to.be.a('string'); - return Promise.resolve({ - data: sampleFlowWthID, - }); + list: (params) => mockPagedData(params, 'flows', [sampleFlowWthID]), + get: (id) => { + expect(id).to.be.a('string'); + return Promise.resolve(sampleFlowWthID); + }, + vault: { + connections: { + list: (params) => mockPagedData(params, 'connections', []), + }, }, - getAllConnections: (params) => mockPagedData(params, 'connections', []), }, pool, }; @@ -223,16 +237,16 @@ describe('#flows handler', () => { }; const auth0 = { flows: { - getAll: (params) => mockPagedData(params, 'flows', [sampleFlowWthConnectionWithIdNew]), - get: (params) => { - expect(params).to.be.an('object'); - expect(params.id).to.be.a('string'); - return Promise.resolve({ - data: sampleFlowWthConnectionWithIdNew, - }); + list: (params) => mockPagedData(params, 'flows', [sampleFlowWthConnectionWithIdNew]), + get: (id) => { + expect(id).to.be.a('string'); + return Promise.resolve(sampleFlowWthConnectionWithIdNew); + }, + vault: { + connections: { + list: (params) => mockPagedData(params, 'connections', [sampleConnectionWithID]), + }, }, - getAllConnections: (params) => - mockPagedData(params, 'connections', [sampleConnectionWithID]), }, pool, }; @@ -246,23 +260,24 @@ describe('#flows handler', () => { it('should update flows', async () => { const auth0 = { flows: { - update: function (params, data) { + update: function (id, data) { (() => expect(this).to.not.be.undefined)(); - expect(params).to.be.an('object'); - expect(params.id).to.equal(sampleFlowWthID.id); + expect(id).to.be.a('string'); + expect(id).to.equal(sampleFlowWthID.id); expect(data).to.be.an('object'); expect(data.name).to.equal(sampleFlowWthID.name); - return Promise.resolve({ data }); + return Promise.resolve(data); }, - getAll: (params) => mockPagedData(params, 'flows', [sampleFlowWthID]), - get: (params) => { - expect(params).to.be.an('object'); - expect(params.id).to.be.a('string'); - return Promise.resolve({ - data: sampleFlowWthID, - }); + list: (params) => mockPagedData(params, 'flows', [sampleFlowWthID]), + get: (id) => { + expect(id).to.be.a('string'); + return Promise.resolve(sampleFlowWthID); + }, + vault: { + connections: { + list: (params) => mockPagedData(params, 'connections', []), + }, }, - getAllConnections: (params) => mockPagedData(params, 'connections', []), }, pool, }; @@ -289,23 +304,24 @@ describe('#flows handler', () => { (() => expect(this).to.not.be.undefined)(); expect(data).to.be.an('object'); expect(data.name).to.equal(newFlow.name); - return Promise.resolve({ data }); + return Promise.resolve(data); }, delete: function (params) { (() => expect(this).to.not.be.undefined)(); - expect(params).to.be.an('object'); - expect(params.id).to.equal(sampleFlowWthID.id); - return Promise.resolve({ data: [] }); + expect(params).to.be.a('string'); + expect(params).to.equal(sampleFlowWthID.id); + return Promise.resolve([]); + }, + list: (params) => mockPagedData(params, 'flows', [sampleFlowWthID]), + get: (id) => { + expect(id).to.be.a('string'); + return Promise.resolve(sampleFlowWthID); }, - getAll: (params) => mockPagedData(params, 'flows', [sampleFlowWthID]), - get: (params) => { - expect(params).to.be.an('object'); - expect(params.id).to.be.a('string'); - return Promise.resolve({ - data: sampleFlowWthID, - }); + vault: { + connections: { + list: (params) => mockPagedData(params, 'connections', []), + }, }, - getAllConnections: (params) => mockPagedData(params, 'connections', []), }, pool, }; @@ -322,18 +338,19 @@ describe('#flows handler', () => { flows: { delete: (params) => { removed = true; - expect(params).to.be.an('object'); - return Promise.resolve({ data: [] }); + expect(params).to.be.a('string'); + return Promise.resolve([]); + }, + list: (params) => mockPagedData(params, 'flows', [sampleFlowWthID]), + get: (id) => { + expect(id).to.be.a('string'); + return Promise.resolve(sampleFlowWthID); }, - getAll: (params) => mockPagedData(params, 'flows', [sampleFlowWthID]), - get: (params) => { - expect(params).to.be.an('object'); - expect(params.id).to.be.a('string'); - return Promise.resolve({ - data: sampleFlowWthID, - }); + vault: { + connections: { + list: (params) => mockPagedData(params, 'connections', []), + }, }, - getAllConnections: (params) => mockPagedData(params, 'connections', []), }, pool, }; @@ -351,17 +368,18 @@ describe('#flows handler', () => { flows: { delete: (params) => { expect(params).to.be.an('undefined'); - return Promise.resolve({ data: [] }); + return Promise.resolve([]); }, - getAll: (params) => mockPagedData(params, 'flows', [sampleFlowWthID]), - get: (params) => { - expect(params).to.be.an('object'); - expect(params.id).to.be.a('string'); - return Promise.resolve({ - data: sampleFlowWthID, - }); + list: (params) => mockPagedData(params, 'flows', [sampleFlowWthID]), + get: (id) => { + expect(id).to.be.a('string'); + return Promise.resolve(sampleFlowWthID); + }, + vault: { + connections: { + list: (params) => mockPagedData(params, 'connections', []), + }, }, - getAllConnections: (params) => mockPagedData(params, 'connections', []), }, pool, }; diff --git a/test/tools/auth0/handlers/forms.tests.js b/test/tools/auth0/handlers/forms.tests.js index d33972c42..a279ab386 100644 --- a/test/tools/auth0/handlers/forms.tests.js +++ b/test/tools/auth0/handlers/forms.tests.js @@ -137,14 +137,14 @@ describe('#forms handler', () => { expect(data.name).to.equal(sampleFormWithOutId.name); expect(data.languages).to.be.an('object'); expect(data.languages.primary).to.equal(sampleFormWithOutId.languages.primary); - return Promise.resolve({ data }); + return Promise.resolve(data); }, - update: () => Promise.resolve({ data: [] }), - delete: () => Promise.resolve({ data: [] }), - getAll: (params) => mockPagedData(params, 'forms', []), + update: () => Promise.resolve([]), + delete: () => Promise.resolve([]), + list: (params) => mockPagedData(params, 'forms', []), }, flows: { - getAll: (params) => mockPagedData(params, 'flows', []), + list: (params) => mockPagedData(params, 'flows', []), }, pool, }; @@ -165,12 +165,12 @@ describe('#forms handler', () => { create: function (data) { (() => expect(this).to.not.be.undefined)(); expect(data).to.be.an('object'); - return Promise.resolve({ data }); + return Promise.resolve(data); }, - getAll: (params) => mockPagedData(params, 'forms', []), + list: (params) => mockPagedData(params, 'forms', []), }, flows: { - getAll: (params) => mockPagedData(params, 'flows', [sampleFlowWithID]), + list: (params) => mockPagedData(params, 'flows', [sampleFlowWithID]), }, pool, }; @@ -188,17 +188,14 @@ describe('#forms handler', () => { it('should get forms', async () => { const auth0 = { forms: { - getAll: (params) => mockPagedData(params, 'forms', [sampleFormWthID]), - get: (params) => { - expect(params).to.be.an('object'); - expect(params.id).to.be.a('string'); - return Promise.resolve({ - data: sampleFormWthID, - }); + list: (params) => mockPagedData(params, 'forms', [sampleFormWthID]), + get: (id) => { + expect(id).to.be.a('string'); + return Promise.resolve(sampleFormWthID); }, }, flows: { - getAll: (params) => mockPagedData(params, 'flows', []), + list: (params) => mockPagedData(params, 'flows', []), }, pool, }; @@ -230,17 +227,14 @@ describe('#forms handler', () => { }; const auth0 = { forms: { - getAll: (params) => mockPagedData(params, 'forms', [sampleFormWthFlowWithId]), - get: (params) => { - expect(params).to.be.an('object'); - expect(params.id).to.be.a('string'); - return Promise.resolve({ - data: sampleFormWthFlowWithId, - }); + list: (params) => mockPagedData(params, 'forms', [sampleFormWthFlowWithId]), + get: (id) => { + expect(id).to.be.a('string'); + return Promise.resolve(sampleFormWthFlowWithId); }, }, flows: { - getAll: (params) => mockPagedData(params, 'flows', [sampleFlowWithID]), + list: (params) => mockPagedData(params, 'flows', [sampleFlowWithID]), }, pool, }; @@ -254,27 +248,24 @@ describe('#forms handler', () => { it('should update forms', async () => { const auth0 = { forms: { - update: function (params, data) { + update: function (id, data) { (() => expect(this).to.not.be.undefined)(); - expect(params).to.be.an('object'); - expect(params.id).to.equal(sampleFormWthID.id); + expect(id).to.be.a('string'); + expect(id).to.equal(sampleFormWthID.id); expect(data).to.be.an('object'); expect(data.languages).to.be.an('object'); expect(data.languages.primary).to.equal('en'); - return Promise.resolve({ data }); + return Promise.resolve(data); }, - getAll: (params) => mockPagedData(params, 'forms', [sampleFormWthID]), - get: (params) => { - expect(params).to.be.an('object'); - expect(params.id).to.be.a('string'); - return Promise.resolve({ - data: sampleFormWthID, - }); + list: (params) => mockPagedData(params, 'forms', [sampleFormWthID]), + get: (id) => { + expect(id).to.be.a('string'); + return Promise.resolve(sampleFormWthID); }, }, flows: { - getAll: (params) => mockPagedData(params, 'flows', []), + list: (params) => mockPagedData(params, 'flows', []), }, pool, }; @@ -306,25 +297,22 @@ describe('#forms handler', () => { (() => expect(this).to.not.be.undefined)(); expect(data).to.be.an('object'); expect(data.name).to.equal(sampleFormTwoWthID.name); - return Promise.resolve({ data }); + return Promise.resolve(data); }, delete: function (params) { (() => expect(this).to.not.be.undefined)(); - expect(params).to.be.an('object'); - expect(params.id).to.equal(sampleFormWthID.id); - return Promise.resolve({ data: [] }); + expect(params).to.be.a('string'); + expect(params).to.equal(sampleFormWthID.id); + return Promise.resolve([]); }, - getAll: (params) => mockPagedData(params, 'forms', [sampleFormWthID]), - get: (params) => { - expect(params).to.be.an('object'); - expect(params.id).to.be.a('string'); - return Promise.resolve({ - data: sampleFormWthID, - }); + list: (params) => mockPagedData(params, 'forms', [sampleFormWthID]), + get: (id) => { + expect(id).to.be.a('string'); + return Promise.resolve(sampleFormWthID); }, }, flows: { - getAll: (params) => mockPagedData(params, 'flows', []), + list: (params) => mockPagedData(params, 'flows', []), }, pool, }; @@ -341,20 +329,17 @@ describe('#forms handler', () => { forms: { delete: (params) => { removed = true; - expect(params).to.be.an('object'); - return Promise.resolve({ data: [] }); + expect(params).to.be.a('string'); + return Promise.resolve([]); }, - getAll: (params) => mockPagedData(params, 'forms', [sampleFormWthID, sampleFormTwoWthID]), - get: (params) => { - expect(params).to.be.an('object'); - expect(params.id).to.be.a('string'); - return Promise.resolve({ - data: sampleFormWthID, - }); + list: (params) => mockPagedData(params, 'forms', [sampleFormWthID, sampleFormTwoWthID]), + get: (id) => { + expect(id).to.be.a('string'); + return Promise.resolve(sampleFormWthID); }, }, flows: { - getAll: (params) => mockPagedData(params, 'flows', []), + list: (params) => mockPagedData(params, 'flows', []), }, pool, }; @@ -372,19 +357,16 @@ describe('#forms handler', () => { forms: { delete: (params) => { expect(params).to.be.an('undefined'); - return Promise.resolve({ data: [] }); + return Promise.resolve([]); }, - getAll: (params) => mockPagedData(params, 'forms', [sampleFormWthID, sampleFormTwoWthID]), - get: (params) => { - expect(params).to.be.an('object'); - expect(params.id).to.be.a('string'); - return Promise.resolve({ - data: sampleFormWthID, - }); + list: (params) => mockPagedData(params, 'forms', [sampleFormWthID, sampleFormTwoWthID]), + get: (id) => { + expect(id).to.be.a('string'); + return Promise.resolve(sampleFormWthID); }, }, flows: { - getAll: (params) => mockPagedData(params, 'flows', []), + list: (params) => mockPagedData(params, 'flows', []), }, pool, }; diff --git a/test/tools/auth0/handlers/guardianFactorProviders.tests.js b/test/tools/auth0/handlers/guardianFactorProviders.tests.js index c607f3c85..6944ed2fe 100644 --- a/test/tools/auth0/handlers/guardianFactorProviders.tests.js +++ b/test/tools/auth0/handlers/guardianFactorProviders.tests.js @@ -68,10 +68,18 @@ describe('#guardianFactorProviders handler', () => { const auth0 = { guardian: { - getPhoneFactorProviderTwilio: throwForbidden, - getSmsFactorProviderTwilio: throwForbidden, - getPushNotificationProviderAPNS: throwForbidden, - getPushNotificationProviderSNS: throwForbidden, + factors: { + phone: { + getTwilioProvider: throwForbidden, + }, + sms: { + getTwilioProvider: throwForbidden, + }, + pushNotification: { + getApnsProvider: throwForbidden, + getSnsProvider: throwForbidden, + }, + }, }, pool, }; @@ -84,10 +92,18 @@ describe('#guardianFactorProviders handler', () => { it('should get guardianFactorProviders', async () => { const auth0 = { guardian: { - getPhoneFactorProviderTwilio: (params) => ({ data: { ...params, test: 'data' } }), - getPushNotificationProviderAPNS: (params) => ({ data: { ...params, test: 'data' } }), - getPushNotificationProviderSNS: (params) => ({ data: { ...params, test: 'data' } }), - getSmsFactorProviderTwilio: (params) => ({ data: { ...params, test: 'data' } }), + factors: { + phone: { + getTwilioProvider: (params) => ({ data: { ...params, test: 'data' } }), + }, + sms: { + getTwilioProvider: (params) => ({ data: { ...params, test: 'data' } }), + }, + pushNotification: { + getApnsProvider: (params) => ({ data: { ...params, test: 'data' } }), + getSnsProvider: (params) => ({ data: { ...params, test: 'data' } }), + }, + }, }, pool, }; @@ -112,7 +128,19 @@ describe('#guardianFactorProviders handler', () => { const auth0 = { guardian: { - updateFactorProvider: () => ({ ...provider }), + factors: { + phone: { + setTwilioProvider: () => ({ ...provider }), + }, + sms: { + setTwilioProvider: () => ({ ...provider }), + }, + pushNotification: { + setApnsProvider: () => ({ ...provider }), + setFcmProvider: () => ({ ...provider }), + setSnsProvider: () => ({ ...provider }), + }, + }, }, pool, }; diff --git a/test/tools/auth0/handlers/guardianFactorTemplates.tests.js b/test/tools/auth0/handlers/guardianFactorTemplates.tests.js index fc2a9bc7f..2134390bb 100644 --- a/test/tools/auth0/handlers/guardianFactorTemplates.tests.js +++ b/test/tools/auth0/handlers/guardianFactorTemplates.tests.js @@ -59,10 +59,14 @@ describe('#guardianFactorTemplates handler', () => { it('should handle forbidden error', async () => { const auth0 = { guardian: { - getSmsFactorTemplates: () => { - const error = new Error('Forbidden resource access'); - error.statusCode = 403; - throw error; + factors: { + sms: { + getTemplates: () => { + const error = new Error('Forbidden resource access'); + error.statusCode = 403; + throw error; + }, + }, }, }, pool, @@ -76,7 +80,11 @@ describe('#guardianFactorTemplates handler', () => { it('should get guardianFactorTemplates', async () => { const auth0 = { guardian: { - getSmsFactorTemplates: (params) => ({ data: { ...params, enrollment_message: 'test' } }), + factors: { + sms: { + getTemplates: () => Promise.resolve({ enrollment_message: 'test' }), + }, + }, }, pool, }; @@ -94,7 +102,11 @@ describe('#guardianFactorTemplates handler', () => { it('should update guardianFactorTemplates', async () => { const auth0 = { guardian: { - setSmsFactorTemplates: (params, data) => ({ data }), + factors: { + sms: { + setTemplates: (data) => Promise.resolve(data), + }, + }, }, pool, }; diff --git a/test/tools/auth0/handlers/guardianFactors.tests.js b/test/tools/auth0/handlers/guardianFactors.tests.js index a9f097932..ed8a2356f 100644 --- a/test/tools/auth0/handlers/guardianFactors.tests.js +++ b/test/tools/auth0/handlers/guardianFactors.tests.js @@ -58,10 +58,12 @@ describe('#guardianFactors handler', () => { it('should handle forbidden error', async () => { const auth0 = { guardian: { - getFactors: () => { - const error = new Error('Forbidden resource access'); - error.statusCode = 403; - throw error; + factors: { + list: () => { + const error = new Error('Forbidden resource access'); + error.statusCode = 403; + throw error; + }, }, }, pool, @@ -86,7 +88,9 @@ describe('#guardianFactors handler', () => { const auth0 = { guardian: { - getFactors: () => ({ data: [...factors] }), + factors: { + list: () => Promise.resolve([...factors]), + }, }, pool, }; @@ -110,8 +114,10 @@ describe('#guardianFactors handler', () => { const auth0 = { guardian: { - getFactors: () => [...factors], - updateFactor: () => ({ enabled: true }), + factors: { + list: () => Promise.resolve([...factors]), + set: () => Promise.resolve({ enabled: true }), + }, }, pool, }; diff --git a/test/tools/auth0/handlers/guardianPhoneFactorMessageTypes.tests.js b/test/tools/auth0/handlers/guardianPhoneFactorMessageTypes.tests.js index 861547260..b6272db73 100644 --- a/test/tools/auth0/handlers/guardianPhoneFactorMessageTypes.tests.js +++ b/test/tools/auth0/handlers/guardianPhoneFactorMessageTypes.tests.js @@ -6,7 +6,15 @@ describe('#guardianPhoneFactorMessageTypes handler', () => { it('should support older version of auth0 client', async () => { const auth0 = { guardian: { - // omitting getPhoneFactorMessageTypes() + factors: { + phone: { + getMessageTypes: () => { + const err = new Error('Not Found'); + err.statusCode = 404; + return Promise.reject(err); + }, + }, + }, }, }; @@ -18,24 +26,28 @@ describe('#guardianPhoneFactorMessageTypes handler', () => { it('should support when endpoint does not exist (older installations)', async () => { const auth0 = { guardian: { - getPhoneFactorMessageTypes: () => { - const err = new Error('Not Found'); - err.name = 'Not Found'; - err.statusCode = 404; - err.requestInfo = { - method: 'get', - url: 'https://example.auth0.com/api/v2/guardian/factors/phone/message-types', - }; - err.originalError = new Error('Not Found'); - err.originalError.status = 404; - err.originalError.response = { - body: { - statusCode: 404, - error: 'Not Found', - message: 'Not Found', + factors: { + phone: { + getMessageTypes: () => { + const err = new Error('Not Found'); + err.name = 'Not Found'; + err.statusCode = 404; + err.requestInfo = { + method: 'get', + url: 'https://example.auth0.com/api/v2/guardian/factors/phone/message-types', + }; + err.originalError = new Error('Not Found'); + err.originalError.status = 404; + err.originalError.response = { + body: { + statusCode: 404, + error: 'Not Found', + message: 'Not Found', + }, + }; + return Promise.reject(err); }, - }; - return Promise.reject(err); + }, }, }, }; @@ -48,25 +60,29 @@ describe('#guardianPhoneFactorMessageTypes handler', () => { it('should support when endpoint is disabled for tenant', async () => { const auth0 = { guardian: { - getPhoneFactorMessageTypes: () => { - const err = new Error('This endpoint is disabled for your tenant.'); - err.name = 'Forbidden'; - err.statusCode = 403; - err.requestInfo = { - method: 'get', - url: 'https://example.auth0.com/api/v2/guardian/factors/phone/message-types', - }; - err.originalError = new Error('Forbidden'); - err.originalError.status = 403; - err.originalError.response = { - body: { - statusCode: 403, - error: 'Forbidden', - message: 'This endpoint is disabled for your tenant.', - errorCode: 'voice_mfa_not_allowed', + factors: { + phone: { + getMessageTypes: () => { + const err = new Error('This endpoint is disabled for your tenant.'); + err.name = 'Forbidden'; + err.statusCode = 403; + err.requestInfo = { + method: 'get', + url: 'https://example.auth0.com/api/v2/guardian/factors/phone/message-types', + }; + err.originalError = new Error('Forbidden'); + err.originalError.status = 403; + err.originalError.response = { + body: { + statusCode: 403, + error: 'Forbidden', + message: 'This endpoint is disabled for your tenant.', + errorCode: 'voice_mfa_not_allowed', + }, + }; + return Promise.reject(err); }, - }; - return Promise.reject(err); + }, }, }, }; @@ -79,7 +95,11 @@ describe('#guardianPhoneFactorMessageTypes handler', () => { it('should get guardian phone factor message types', async () => { const auth0 = { guardian: { - getPhoneFactorMessageTypes: () => ({ data: { message_types: ['sms', 'voice'] } }), + factors: { + phone: { + getMessageTypes: () => ({ message_types: ['sms', 'voice'] }), + }, + }, }, }; @@ -91,10 +111,14 @@ describe('#guardianPhoneFactorMessageTypes handler', () => { it('should throw an error for all other failed requests', async () => { const auth0 = { guardian: { - getPhoneFactorMessageTypes: () => { - const error = new Error('Bad request'); - error.statusCode = 500; - throw error; + factors: { + phone: { + getMessageTypes: () => { + const error = new Error('Bad request'); + error.statusCode = 500; + throw error; + }, + }, }, }, }; @@ -112,9 +136,13 @@ describe('#guardianPhoneFactorMessageTypes handler', () => { it('should update guardian phone factor message types', async () => { const auth0 = { guardian: { - updatePhoneFactorMessageTypes: (data) => { - expect(data).to.eql({ message_types: ['sms', 'voice'] }); - return Promise.resolve({ data }); + factors: { + phone: { + setMessageTypes: (data) => { + expect(data).to.eql({ message_types: ['sms', 'voice'] }); + return Promise.resolve({ data }); + }, + }, }, }, }; @@ -130,9 +158,13 @@ describe('#guardianPhoneFactorMessageTypes handler', () => { it('should skip processing if assets are empty', async () => { const auth0 = { guardian: { - updatePhoneFactorMessageTypes: () => { - const err = new Error('updatePhoneFactorMessageTypes() should not have been called'); - return Promise.reject(err); + factors: { + phone: { + setMessageTypes: () => { + const err = new Error('setMessageTypes() should not have been called'); + return Promise.reject(err); + }, + }, }, }, }; diff --git a/test/tools/auth0/handlers/guardianPhoneFactorSelectedProvider.tests.js b/test/tools/auth0/handlers/guardianPhoneFactorSelectedProvider.tests.js index cff0d015d..8a8702313 100644 --- a/test/tools/auth0/handlers/guardianPhoneFactorSelectedProvider.tests.js +++ b/test/tools/auth0/handlers/guardianPhoneFactorSelectedProvider.tests.js @@ -6,7 +6,15 @@ describe('#guardianPhoneFactorSelectedProvider handler', () => { it('should support older version of auth0 client', async () => { const auth0 = { guardian: { - // omitting getPhoneFactorSelectedProvider() + factors: { + phone: { + getSelectedProvider: () => { + const err = new Error('Not Found'); + err.statusCode = 404; + return Promise.reject(err); + }, + }, + }, }, }; @@ -18,24 +26,28 @@ describe('#guardianPhoneFactorSelectedProvider handler', () => { it('should support when endpoint does not exist (older installations)', async () => { const auth0 = { guardian: { - getPhoneFactorSelectedProvider: () => { - const err = new Error('Not Found'); - err.name = 'Not Found'; - err.statusCode = 404; - err.requestInfo = { - method: 'get', - url: 'https://example.auth0.com/api/v2/guardian/factors/sms/selected-provider', - }; - err.originalError = new Error('Not Found'); - err.originalError.status = 404; - err.originalError.response = { - body: { - statusCode: 404, - error: 'Not Found', - message: 'Not Found', + factors: { + phone: { + getSelectedProvider: () => { + const err = new Error('Not Found'); + err.name = 'Not Found'; + err.statusCode = 404; + err.requestInfo = { + method: 'get', + url: 'https://example.auth0.com/api/v2/guardian/factors/sms/selected-provider', + }; + err.originalError = new Error('Not Found'); + err.originalError.status = 404; + err.originalError.response = { + body: { + statusCode: 404, + error: 'Not Found', + message: 'Not Found', + }, + }; + return Promise.reject(err); }, - }; - return Promise.reject(err); + }, }, }, }; @@ -48,25 +60,29 @@ describe('#guardianPhoneFactorSelectedProvider handler', () => { it('should support when endpoint is disabled for tenant', async () => { const auth0 = { guardian: { - getPhoneFactorSelectedProvider: () => { - const err = new Error('This endpoint is disabled for your tenant.'); - err.name = 'Forbidden'; - err.statusCode = 403; - err.requestInfo = { - method: 'get', - url: 'https://example.auth0.com/api/v2/guardian/factors/sms/selected-provider', - }; - err.originalError = new Error('Forbidden'); - err.originalError.status = 403; - err.originalError.response = { - body: { - statusCode: 403, - error: 'Forbidden', - message: 'This endpoint is disabled for your tenant.', - errorCode: 'hooks_not_allowed', + factors: { + phone: { + getSelectedProvider: () => { + const err = new Error('This endpoint is disabled for your tenant.'); + err.name = 'Forbidden'; + err.statusCode = 403; + err.requestInfo = { + method: 'get', + url: 'https://example.auth0.com/api/v2/guardian/factors/sms/selected-provider', + }; + err.originalError = new Error('Forbidden'); + err.originalError.status = 403; + err.originalError.response = { + body: { + statusCode: 403, + error: 'Forbidden', + message: 'This endpoint is disabled for your tenant.', + errorCode: 'hooks_not_allowed', + }, + }; + return Promise.reject(err); }, - }; - return Promise.reject(err); + }, }, }, }; @@ -79,7 +95,11 @@ describe('#guardianPhoneFactorSelectedProvider handler', () => { it('should get guardian phone factor selected provider', async () => { const auth0 = { guardian: { - getPhoneFactorSelectedProvider: () => ({ data: { provider: 'twilio' } }), + factors: { + phone: { + getSelectedProvider: () => Promise.resolve({ provider: 'twilio' }), + }, + }, }, }; @@ -91,10 +111,14 @@ describe('#guardianPhoneFactorSelectedProvider handler', () => { it('should throw an error for all other failed requests', async () => { const auth0 = { guardian: { - getPhoneFactorSelectedProvider: () => { - const error = new Error('Bad request'); - error.statusCode = 500; - throw error; + factors: { + phone: { + getSelectedProvider: () => { + const error = new Error('Bad request'); + error.statusCode = 500; + throw error; + }, + }, }, }, }; @@ -112,9 +136,13 @@ describe('#guardianPhoneFactorSelectedProvider handler', () => { it('should update guardian phone factor selected provider', async () => { const auth0 = { guardian: { - updatePhoneFactorSelectedProvider: (data) => { - expect(data).to.eql({ provider: 'twilio' }); - return Promise.resolve({ data }); + factors: { + phone: { + setProvider: (data) => { + expect(data).to.eql({ provider: 'twilio' }); + return Promise.resolve(data); + }, + }, }, }, }; @@ -130,11 +158,13 @@ describe('#guardianPhoneFactorSelectedProvider handler', () => { it('should skip processing if assets are empty', async () => { const auth0 = { guardian: { - updatePhoneFactorSelectedProvider: () => { - const err = new Error( - 'updatePhoneFactorSelectedProvider() should not have been called' - ); - return Promise.reject(err); + factors: { + phone: { + setProvider: () => { + const err = new Error('setProvider() should not have been called'); + return Promise.reject(err); + }, + }, }, }, }; diff --git a/test/tools/auth0/handlers/guardianPolicies.tests.js b/test/tools/auth0/handlers/guardianPolicies.tests.js index 6cbf29f47..2fe63414b 100644 --- a/test/tools/auth0/handlers/guardianPolicies.tests.js +++ b/test/tools/auth0/handlers/guardianPolicies.tests.js @@ -6,19 +6,23 @@ describe('#guardianPolicies handler', () => { it('should support older version of auth0 client', async () => { const auth0 = { guardian: { - // omitting getPolicies() + policies: { + list: () => Promise.resolve([]), + }, }, }; const handler = new guardianPolicies.default({ client: auth0 }); const data = await handler.getType(); - expect(data).to.deep.equal({}); + expect(data).to.deep.equal({ policies: [] }); }); it('should get guardian policies', async () => { const auth0 = { guardian: { - getPolicies: () => ({ data: ['all-applications'] }), + policies: { + list: () => Promise.resolve(['all-applications']), + }, }, }; @@ -34,10 +38,12 @@ describe('#guardianPolicies handler', () => { it('should update guardian policies settings', async () => { const auth0 = { guardian: { - updatePolicies: (data) => { - expect(data).to.be.an('array'); - expect(data[0]).to.equal('all-applications'); - return Promise.resolve({ data }); + policies: { + set: (data) => { + expect(data).to.be.an('array'); + expect(data[0]).to.equal('all-applications'); + return Promise.resolve(data); + }, }, }, }; @@ -57,9 +63,11 @@ describe('#guardianPolicies handler', () => { it('should skip processing if assets are empty', async () => { const auth0 = { guardian: { - updatePolicies: () => { - const err = new Error('updatePolicies() should not have been called'); - return Promise.reject(err); + policies: { + set: () => { + const err = new Error('set() should not have been called'); + return Promise.reject(err); + }, }, }, }; diff --git a/test/tools/auth0/handlers/logStreams.test.ts b/test/tools/auth0/handlers/logStreams.test.ts index b2bdcb0e9..deafa08b9 100644 --- a/test/tools/auth0/handlers/logStreams.test.ts +++ b/test/tools/auth0/handlers/logStreams.test.ts @@ -86,10 +86,10 @@ const mockLogStreams = [ const auth0ApiClientMock = { logStreams: { - getAll: async () => ({ data: mockLogStreams }), - create: async () => ({ data: mockLogStreams }), - update: async () => ({ data: mockLogStreams }), - delete: async () => ({ data: mockLogStreams }), + list: async () => mockLogStreams, + create: async () => mockLogStreams, + update: async () => mockLogStreams, + delete: async () => mockLogStreams, }, pool: new PromisePoolExecutor({ concurrencyLimit: 3, @@ -198,27 +198,25 @@ describe('#logStreams handler', () => { ...auth0ApiClientMock, logStreams: { ...auth0ApiClientMock.logStreams, - getAll: async () => ({ data: [] }), - }, - }, - functions: { - create: (data) => { - didCreateFunctionGetCalled = true; - const expectedValue = (() => { - const value = mockLogStreams.find((logStream) => { - return logStream.id === data.id; - }); - value.sink = { ...value.sink }; - //@ts-ignore because it's actually ok for sink property to be omitted in POST payload - delete value.status; // Not expecting status in POST payload - if (value?.type == 'eventgrid') delete value.sink.azurePartnerTopic; // Topic name is auto-generated on create, not expecting it in POST payload - if (value?.type == 'eventbridge') delete value.sink.awsPartnerEventSource; // Not expecting this in POST payload + list: async () => [], + create: async (data) => { + didCreateFunctionGetCalled = true; + const expectedValue = (() => { + const value = mockLogStreams.find((logStream) => { + return logStream.id === data.id; + }); + value.sink = { ...value.sink }; + //@ts-ignore because it's actually ok for sink property to be omitted in POST payload + delete value.status; // Not expecting status in POST payload + if (value?.type == 'eventgrid') delete value.sink.azurePartnerTopic; // Topic name is auto-generated on create, not expecting it in POST payload + if (value?.type == 'eventbridge') delete value.sink.awsPartnerEventSource; // Not expecting this in POST payload - return value; - })(); + return value; + })(); - expect(data).to.deep.equal(expectedValue); - return Promise.resolve(data); + expect(data).to.deep.equal(expectedValue); + return Promise.resolve(data); + }, }, }, }); @@ -232,26 +230,29 @@ describe('#logStreams handler', () => { const handler = new logStreamsHandler({ config: () => {}, - client: auth0ApiClientMock, - functions: { - update: ({ id }, data) => { - didUpdateFunctionGetCalled = true; - const expectedValue = (() => { - const value = mockLogStreams.find((logStream) => { - return logStream.id === id; - }); - //@ts-ignore because it's actually ok for status property to be omitted in PATCH payload - if (value?.type === 'eventbridge' || value?.type === 'eventgrid') delete value.sink; - delete value.id; // Not expecting ID in PATCH payload - delete value.type; // Not expecting type in PATCH payload - //@ts-ignore because it's actually ok for status property to be omitted in PATCH payload - if (value?.status === 'suspended') delete value.status; // Not expecting status in PATCH payload if suspended + client: { + ...auth0ApiClientMock, + logStreams: { + ...auth0ApiClientMock.logStreams, + update: async (id, data) => { + didUpdateFunctionGetCalled = true; + const expectedValue = (() => { + const value = mockLogStreams.find((logStream) => { + return logStream.id === id; + }); + //@ts-ignore because it's actually ok for status property to be omitted in PATCH payload + if (value?.type === 'eventbridge' || value?.type === 'eventgrid') delete value.sink; + delete value.id; // Not expecting ID in PATCH payload + delete value.type; // Not expecting type in PATCH payload + //@ts-ignore because it's actually ok for status property to be omitted in PATCH payload + if (value?.status === 'suspended') delete value.status; // Not expecting status in PATCH payload if suspended - return value; - })(); + return value; + })(); - expect(data).to.deep.equal(expectedValue); - return Promise.resolve(data); + expect(data).to.deep.equal(expectedValue); + return Promise.resolve(data); + }, }, }, }); diff --git a/test/tools/auth0/handlers/networkACLs.test.ts b/test/tools/auth0/handlers/networkACLs.test.ts index 9ec420046..9367af987 100644 --- a/test/tools/auth0/handlers/networkACLs.test.ts +++ b/test/tools/auth0/handlers/networkACLs.test.ts @@ -81,9 +81,9 @@ describe('#networkACLs handler', () => { (() => expect(this).to.not.be.undefined)(); expect(data).to.be.an('object'); expect(data.description).to.equal(sampleNetworkACL.description); - return Promise.resolve({ data }); + return Promise.resolve(data); }, - getAll: (params) => mockPagedData(params, 'network_acls', []), + list: (params) => mockPagedData(params, 'network_acls', []), }, pool, }; @@ -101,7 +101,7 @@ describe('#networkACLs handler', () => { it('should get networkACLs', async () => { const auth0 = { networkAcls: { - getAll: (params) => mockPagedData(params, 'network_acls', [sampleNetworkACL]), + list: (params) => mockPagedData(params, 'network_acls', [sampleNetworkACL]), }, pool, }; @@ -114,7 +114,7 @@ describe('#networkACLs handler', () => { it('should handle 403 error when tenant ACL Management is not enabled', async () => { const auth0 = { networkAcls: { - getAll: () => Promise.reject(Object.assign(new Error('Forbidden'), { statusCode: 403 })), + list: () => Promise.reject(Object.assign(new Error('Forbidden'), { statusCode: 403 })), }, }; @@ -126,15 +126,15 @@ describe('#networkACLs handler', () => { it('should update networkACLs', async () => { const auth0 = { networkAcls: { - update: function (params, data) { + update: function (id, data) { (() => expect(this).to.not.be.undefined)(); - expect(params).to.be.an('object'); - expect(params.id).to.equal(sampleNetworkACL.id); + expect(id).to.be.a('string'); + expect(id).to.equal(sampleNetworkACL.id); expect(data).to.be.an('object'); expect(data.description).to.equal(sampleNetworkACL.description); - return Promise.resolve({ data }); + return Promise.resolve(data); }, - getAll: (params) => mockPagedData(params, 'network_acls', [sampleNetworkACL]), + list: (params) => mockPagedData(params, 'network_acls', [sampleNetworkACL]), }, pool, }; @@ -173,22 +173,21 @@ describe('#networkACLs handler', () => { (() => expect(this).to.not.be.undefined)(); expect(data).to.be.an('object'); expect(data.description).to.equal(newNetworkACL.description); - return Promise.resolve({ data }); + return Promise.resolve(data); }, - delete: function (params) { + delete: function (id) { (() => expect(this).to.not.be.undefined)(); - expect(params).to.be.an('object'); - expect(params.id).to.equal(sampleNetworkACL.id); - return Promise.resolve({ data: [] }); + expect(id).to.be.a('string'); + expect(id).to.equal(sampleNetworkACL.id); + return Promise.resolve([]); }, - update: function (params, data) { + update: function (id, data) { (() => expect(this).to.not.be.undefined)(); - expect(params).to.be.an('object'); - expect(params.id).to.be.a('string'); + expect(id).to.be.a('string'); expect(data).to.be.an('object'); - return Promise.resolve({ data }); + return Promise.resolve(data); }, - getAll: (params) => mockPagedData(params, 'network_acls', [sampleNetworkACL]), + list: (params) => mockPagedData(params, 'network_acls', [sampleNetworkACL]), }, pool, }; @@ -204,12 +203,12 @@ describe('#networkACLs handler', () => { let idDeleteCalled = false; const auth0 = { networkAcls: { - delete: (params) => { + delete: (id) => { idDeleteCalled = true; - expect(params).to.be.an('undefined'); - return Promise.resolve({ data: [] }); + expect(id).to.be.an('undefined'); + return Promise.resolve([]); }, - getAll: (params) => mockPagedData(params, 'network_acls', [sampleNetworkACL]), + list: (params) => mockPagedData(params, 'network_acls', [sampleNetworkACL]), }, pool, }; @@ -226,14 +225,14 @@ describe('#networkACLs handler', () => { let removed = false; const auth0 = { networkAcls: { - delete: function (params) { + delete: function (id) { removed = true; (() => expect(this).to.not.be.undefined)(); - expect(params).to.be.an('object'); - expect(params.id).to.equal(sampleNetworkACL.id); - return Promise.resolve({ data: [] }); + expect(id).to.be.a('string'); + expect(id).to.equal(sampleNetworkACL.id); + return Promise.resolve([]); }, - getAll: (params) => mockPagedData(params, 'network_acls', [sampleNetworkACL]), + list: (params) => mockPagedData(params, 'network_acls', [sampleNetworkACL]), }, pool, }; diff --git a/test/tools/auth0/handlers/organizations.tests.js b/test/tools/auth0/handlers/organizations.tests.js index 235e51fe7..a9f5964f5 100644 --- a/test/tools/auth0/handlers/organizations.tests.js +++ b/test/tools/auth0/handlers/organizations.tests.js @@ -157,29 +157,51 @@ describe('#organizations handler', () => { data.id = 'fake'; return Promise.resolve({ data }); }, - update: () => Promise.resolve({ data: [] }), - delete: () => Promise.resolve({ data: [] }), - getAll: (params) => Promise.resolve(mockPagedData(params, 'organizations', [])), - addEnabledConnection: (org, connection) => { - expect(org.id).to.equal('fake'); - expect(connection).to.be.an('object'); - expect(connection.connection_id).to.equal('con_123'); - expect(connection.assign_membership_on_login).to.equal(true); - expect(connection.show_as_button).to.equal(false); - expect(connection.is_signup_enabled).to.equal(true); - return Promise.resolve({ data: connection }); + update: () => Promise.resolve([]), + delete: () => Promise.resolve([]), + list: (params) => Promise.resolve(mockPagedData(params, 'organizations', [])), + enabledConnections: { + add: (org, connection) => { + expect(org).to.equal('fake'); + expect(connection).to.be.an('object'); + expect(connection.connection_id).to.equal('con_123'); + expect(connection.assign_membership_on_login).to.equal(true); + expect(connection.show_as_button).to.equal(false); + expect(connection.is_signup_enabled).to.equal(true); + return Promise.resolve(connection); + }, + list: () => ({ + data: [], + hasNextPage: () => false, + getNextPage: () => + Promise.resolve({ + data: [], + hasNextPage: () => false, + getNextPage: () => Promise.resolve({ data: [], hasNextPage: () => false }), + }), + }), }, - createOrganizationClientGrants: (orgId, clientGrants) => { - expect(orgId).to.equal('fake'); - expect(clientGrants).to.be.an('array'); - expect(clientGrants).to.have.length(1); - expect(clientGrants[0].client_id).to.equal('abc_123'); - return Promise.resolve({ data: clientGrants }); + clientGrants: { + create: (orgId, clientGrant) => { + expect(orgId).to.equal('fake'); + expect(clientGrant).to.be.an('object'); + expect(clientGrant).to.have.property('grant_id'); + return Promise.resolve({ grant_id: clientGrant.grant_id }); + }, + list: () => ({ + data: [], + hasNextPage: () => false, + getNextPage: () => + Promise.resolve({ + data: [], + hasNextPage: () => false, + getNextPage: () => Promise.resolve({ data: [], hasNextPage: () => false }), + }), + }), }, - postOrganizationClientGrants: () => Promise.resolve({ data: sampleClientGrant }), }, connections: { - getAll: (params) => + list: (params) => mockPagedData(params, 'connections', [ { id: sampleEnabledConnection.connection_id, @@ -195,10 +217,10 @@ describe('#organizations handler', () => { ]), }, clients: { - getAll: (params) => mockPagedData(params, 'clients', sampleClients), + list: (params) => mockPagedData(params, 'clients', sampleClients), }, clientGrants: { - getAll: (params) => mockPagedData(params, 'client_grants', [sampleClientGrant]), + list: (params) => mockPagedData(params, 'client_grants', [sampleClientGrant]), }, pool, }; @@ -256,19 +278,25 @@ describe('#organizations handler', () => { }, update: () => Promise.resolve({ data: [] }), delete: () => Promise.resolve({ data: [] }), - getAll: (params) => Promise.resolve(mockPagedData(params, 'organizations', [sampleOrg])), - getEnabledConnections: () => Promise.resolve({ data: [] }), - getOrganizationClientGrants: () => ({ data: [] }), - getAllDiscoveryDomains: () => Promise.resolve({ data: [], next: undefined }), + list: (params) => Promise.resolve(mockPagedData(params, 'organizations', [sampleOrg])), + enabledConnections: { + list: () => mockPagedData({}, 'enabled_connections', []), + }, + clientGrants: { + list: () => mockPagedData({}, 'client_grants', []), + }, + discoveryDomains: { + list: () => mockPagedData({}, 'discovery_domains', []), + }, }, connections: { - getAll: (params) => mockPagedData(params, 'connections', []), + list: (params) => mockPagedData(params, 'connections', []), }, clients: { - getAll: (params) => mockPagedData(params, 'clients', sampleClients), + list: (params) => mockPagedData(params, 'clients', sampleClients), }, clientGrants: { - getAll: (params) => mockPagedData(params, 'client_grants', [sampleClientGrant]), + list: (params) => mockPagedData(params, 'client_grants', [sampleClientGrant]), }, pool, }; @@ -282,14 +310,19 @@ describe('#organizations handler', () => { it('should get organizations', async () => { const auth0 = { organizations: { - getAll: (params) => Promise.resolve(mockPagedData(params, 'organizations', [sampleOrg])), - getEnabledConnections: () => ({ data: [sampleEnabledConnection] }), - getOrganizationClientGrants: () => ({ data: sampleOrgClientGrants }), - getAllDiscoveryDomains: () => - Promise.resolve({ data: [sampleDiscoveryDomain], next: undefined }), + list: (params) => Promise.resolve(mockPagedData(params, 'organizations', [sampleOrg])), + enabledConnections: { + list: () => mockPagedData({}, 'enabled_connections', [sampleEnabledConnection]), + }, + clientGrants: { + list: () => mockPagedData({}, 'client_grants', sampleOrgClientGrants), + }, + discoveryDomains: { + list: () => mockPagedData({}, 'discovery_domains', [sampleDiscoveryDomain]), + }, }, clients: { - getAll: (params) => mockPagedData(params, 'clients', sampleClients), + list: (params) => mockPagedData(params, 'clients', sampleClients), }, pool, }; @@ -307,27 +340,34 @@ describe('#organizations handler', () => { it('should get all organizations', async function () { const organizationsPage1 = Array.from({ length: 3 }, (v, i) => ({ + id: 'org_' + i, name: 'acme' + i, display_name: 'Acme ' + i, })); const organizationsPage2 = Array.from({ length: 5 }, (v, i) => ({ + id: 'org_' + (i + 10), name: 'acme' + (i + 10), display_name: 'Acme ' + (i + 10), })); const auth0 = { organizations: { - getAll: (params) => + list: (params) => Promise.resolve( mockPagedData(params, 'organizations', [...organizationsPage2, ...organizationsPage1]) ), - getEnabledConnections: () => Promise.resolve({ data: { connections: [] } }), - getOrganizationClientGrants: () => - Promise.resolve({ data: { client_grants: [], total: 0 } }), - getAllDiscoveryDomains: () => Promise.resolve({ data: [], next: undefined }), + enabledConnections: { + list: () => mockPagedData({}, 'enabled_connections', []), + }, + clientGrants: { + list: () => mockPagedData({}, 'client_grants', []), + }, + discoveryDomains: { + list: () => mockPagedData({}, 'discovery_domains', []), + }, }, clients: { - getAll: (params) => mockPagedData(params, 'clients', sampleClients), + list: (params) => mockPagedData(params, 'clients', sampleClients), }, pool, }; @@ -339,6 +379,20 @@ describe('#organizations handler', () => { it('should return an empty array for old versions of the sdk', async () => { const auth0 = { + organizations: { + list: () => { + const error = new Error('organizations.list is not a function'); + error.statusCode = 501; + throw error; + }, + }, + clients: { + list: () => { + const error = new Error('clients.list is not a function'); + error.statusCode = 501; + throw error; + }, + }, pool, }; @@ -350,14 +404,14 @@ describe('#organizations handler', () => { it('should return an empty array for 501 status code', async () => { const auth0 = { organizations: { - getAll: () => { + list: () => { const error = new Error('Feature is not yet implemented'); error.statusCode = 501; throw error; }, }, clients: { - getAll: (params) => mockPagedData(params, 'clients', sampleClients), + list: (params) => mockPagedData(params, 'clients', sampleClients), }, pool, }; @@ -370,14 +424,14 @@ describe('#organizations handler', () => { it('should return an empty array for 404 status code', async () => { const auth0 = { organizations: { - getAll: () => { + list: () => { const error = new Error('Not found'); error.statusCode = 404; throw error; }, }, clients: { - getAll: (params) => mockPagedData(params, 'clients', sampleClients), + list: (params) => mockPagedData(params, 'clients', sampleClients), }, pool, }; @@ -390,7 +444,7 @@ describe('#organizations handler', () => { it('should throw an error for all other failed requests', async () => { const auth0 = { organizations: { - getAll: () => { + list: () => { const error = new Error('Bad request'); error.statusCode = 500; throw error; @@ -411,19 +465,25 @@ describe('#organizations handler', () => { let shouldThrow = false; const auth0 = { organizations: { - getAll: (params) => { + list: (params) => { if (!shouldThrow) { return mockPagedData(params, 'organizations', [sampleOrg]); } throw new Error('Unexpected'); }, - getEnabledConnections: () => Promise.resolve({ data: [] }), - getOrganizationClientGrants: () => ({ data: [] }), - getAllDiscoveryDomains: () => Promise.resolve({ data: [], next: undefined }), + enabledConnections: { + list: () => mockPagedData({}, 'enabled_connections', []), + }, + clientGrants: { + list: () => mockPagedData({}, 'client_grants', []), + }, + discoveryDomains: { + list: () => mockPagedData({}, 'discovery_domains', []), + }, }, clients: { - getAll: (params) => mockPagedData(params, 'clients', sampleClients), + list: (params) => mockPagedData(params, 'clients', sampleClients), }, pool, }; @@ -441,59 +501,67 @@ describe('#organizations handler', () => { const auth0 = { organizations: { create: () => Promise.resolve({ data: [] }), - update: function (params, data) { + update: function (id, data) { (() => expect(this).to.not.be.undefined)(); - expect(params).to.be.an('object'); - expect(params.id).to.equal('123'); + expect(id).to.equal('123'); expect(data.display_name).to.equal('Acme 2'); - return Promise.resolve({ data }); + return Promise.resolve(data); }, - delete: () => Promise.resolve({ data: [] }), - getAll: (params) => + delete: () => Promise.resolve([]), + list: (params) => Promise.resolve( mockPagedData({ ...params, include_totals: true }, 'organizations', [sampleOrg]) ), - getEnabledConnections: () => ({ - data: [sampleEnabledConnection, sampleEnabledConnection2], - }), - addEnabledConnection: (params, data) => { - expect(params).to.be.an('object'); - expect(params.id).to.equal('123'); - expect(data).to.be.an('object'); - expect(data.connection_id).to.equal('con_789'); - expect(data.assign_membership_on_login).to.equal(false); - return Promise.resolve({ data }); - }, - removeEnabledConnection: (params) => { - expect(params).to.be.an('object'); - expect(params.id).to.equal('123'); - expect(params.connection_id).to.equal(sampleEnabledConnection2.connection_id); - return Promise.resolve({ data: undefined }); - }, - updateEnabledConnection: (params, data) => { - if (params.connectionId === sampleEnabledConnection.connection_id) { - expect(params).to.be.an('object'); - expect(params.id).to.equal('123'); - expect(params.connectionId).to.equal(sampleEnabledConnection.connection_id); + enabledConnections: { + list: () => ({ + data: [sampleEnabledConnection, sampleEnabledConnection2], + hasNextPage: () => false, + getNextPage: () => + Promise.resolve({ + data: [], + hasNextPage: () => false, + getNextPage: () => Promise.resolve({ data: [], hasNextPage: () => false }), + }), + }), + add: (orgId, data) => { + expect(orgId).to.equal('123'); expect(data).to.be.an('object'); + expect(data.connection_id).to.equal('con_789'); expect(data.assign_membership_on_login).to.equal(false); - expect(data.show_as_button).to.equal(true); - expect(data.is_signup_enabled).to.equal(false); - } else { - expect(params).to.be.an('object'); - expect(params.id).to.equal('123'); - expect(params.connectionId).to.equal(sampleEnabledConnection2.connection_id); - expect(data).to.be.an('object'); - expect(data.assign_membership_on_login).to.equal(true); - expect(data.show_as_button).to.equal(false); - } - return Promise.resolve(data); + return Promise.resolve(data); + }, + delete: (orgId, connectionId) => { + expect(orgId).to.equal('123'); + expect(connectionId).to.equal(sampleEnabledConnection2.connection_id); + return Promise.resolve(undefined); + }, + update: (orgId, connectionId, data) => { + if (connectionId === sampleEnabledConnection.connection_id) { + expect(orgId).to.equal('123'); + expect(connectionId).to.equal(sampleEnabledConnection.connection_id); + expect(data).to.be.an('object'); + expect(data.assign_membership_on_login).to.equal(false); + expect(data.show_as_button).to.equal(true); + expect(data.is_signup_enabled).to.equal(false); + } else { + expect(orgId).to.equal('123'); + expect(connectionId).to.equal(sampleEnabledConnection2.connection_id); + expect(data).to.be.an('object'); + expect(data.assign_membership_on_login).to.equal(true); + expect(data.show_as_button).to.equal(false); + } + return Promise.resolve(data); + }, + }, + clientGrants: { + list: () => mockPagedData({}, 'client_grants', []), + }, + discoveryDomains: { + list: () => mockPagedData({}, 'discovery_domains', []), }, - getOrganizationClientGrants: () => ({ data: [] }), - getAllDiscoveryDomains: () => Promise.resolve({ data: [], next: undefined }), }, connections: { - getAll: (params) => + list: (params) => mockPagedData({ ...params, include_totals: true }, 'connections', [ { id: sampleEnabledConnection.connection_id, @@ -509,10 +577,10 @@ describe('#organizations handler', () => { ]), }, clients: { - getAll: (params) => mockPagedData(params, 'clients', sampleClients), + list: (params) => mockPagedData(params, 'clients', sampleClients), }, clientGrants: { - getAll: (params) => mockPagedData(params, 'client_grants', [sampleClientGrant]), + list: (params) => mockPagedData(params, 'client_grants', [sampleClientGrant]), }, pool, }; @@ -545,32 +613,45 @@ describe('#organizations handler', () => { it('should add an enabled connection to the organizations', async () => { const auth0 = { organizations: { - create: () => Promise.resolve({ data: [] }), - update: function (params, data) { + create: () => Promise.resolve([]), + update: function (id, data) { (() => expect(this).to.not.be.undefined)(); - expect(params).to.be.an('object'); - expect(params.id).to.equal('123'); + expect(id).to.equal('123'); expect(data.display_name).to.equal('Acme 2'); - return Promise.resolve({ data }); + return Promise.resolve(data); }, - delete: () => Promise.resolve({ data: [] }), - getAll: (params) => Promise.resolve(mockPagedData(params, 'organizations', [sampleOrg])), - getEnabledConnections: () => ({ data: [] }), - addEnabledConnection: (params, data) => { - expect(params).to.be.an('object'); - expect(params.id).to.equal('123'); - expect(data).to.be.an('object'); - expect(data.connection_id).to.equal('con_123'); - expect(data.assign_membership_on_login).to.equal(false); - expect(data.show_as_button).to.equal(false); - expect(data.is_signup_enabled).to.equal(false); - return Promise.resolve({ data }); + delete: () => Promise.resolve([]), + list: (params) => Promise.resolve(mockPagedData(params, 'organizations', [sampleOrg])), + enabledConnections: { + list: () => ({ + data: [], + hasNextPage: () => false, + getNextPage: () => + Promise.resolve({ + data: [], + hasNextPage: () => false, + getNextPage: () => Promise.resolve({ data: [], hasNextPage: () => false }), + }), + }), + add: (orgId, data) => { + expect(orgId).to.equal('123'); + expect(data).to.be.an('object'); + expect(data.connection_id).to.equal('con_123'); + expect(data.assign_membership_on_login).to.equal(false); + expect(data.show_as_button).to.equal(false); + expect(data.is_signup_enabled).to.equal(false); + return Promise.resolve(data); + }, + }, + clientGrants: { + list: () => mockPagedData({}, 'client_grants', []), + }, + discoveryDomains: { + list: () => mockPagedData({}, 'discovery_domains', []), }, - getOrganizationClientGrants: () => ({ data: [] }), - getAllDiscoveryDomains: () => Promise.resolve({ data: [], next: undefined }), }, connections: { - getAll: (params) => + list: (params) => mockPagedData(params, 'connections', [ { id: sampleEnabledConnection.connection_id, @@ -586,10 +667,10 @@ describe('#organizations handler', () => { ]), }, clients: { - getAll: (params) => mockPagedData(params, 'clients', sampleClients), + list: (params) => mockPagedData(params, 'clients', sampleClients), }, clientGrants: { - getAll: (params) => mockPagedData(params, 'client_grants', [sampleClientGrant]), + list: (params) => mockPagedData(params, 'client_grants', [sampleClientGrant]), }, pool, }; @@ -622,32 +703,40 @@ describe('#organizations handler', () => { const auth0 = { organizations: { create: () => Promise.resolve([]), - update: function (params, data) { + update: function (id, data) { (() => expect(this).to.not.be.undefined)(); - expect(params).to.be.an('object'); - expect(params.id).to.equal('123'); + expect(id).to.equal('123'); expect(data.display_name).to.equal('Acme 2'); - return Promise.resolve({ data }); + return Promise.resolve(data); }, - delete: () => Promise.resolve({ data: [] }), - getAll: (params) => Promise.resolve(mockPagedData(params, 'organizations', [sampleOrg])), - getEnabledConnections: () => ({ data: [sampleEnabledConnection2] }), - deleteEnabledConnection: (params) => { - expect(params).to.be.an('object'); - expect(params.connectionId).to.equal(sampleEnabledConnection2.connection_id); - return Promise.resolve({ data: [] }); + delete: () => Promise.resolve([]), + list: (params) => Promise.resolve(mockPagedData(params, 'organizations', [sampleOrg])), + enabledConnections: { + list: () => ({ + data: [sampleEnabledConnection2], + hasNextPage: () => false, + getNextPage: () => + Promise.resolve({ + data: [], + hasNextPage: () => false, + getNextPage: () => Promise.resolve({ data: [], hasNextPage: () => false }), + }), + }), + delete: (orgId, connectionId) => { + expect(orgId).to.equal('123'); + expect(connectionId).to.equal(sampleEnabledConnection2.connection_id); + return Promise.resolve(undefined); + }, }, - removeEnabledConnection: (params) => { - expect(params).to.be.an('object'); - expect(params.id).to.equal('123'); - expect(params.connection_id).to.equal(sampleEnabledConnection2.connection_id); - return Promise.resolve({ data: undefined }); + clientGrants: { + list: () => mockPagedData({}, 'client_grants', []), + }, + discoveryDomains: { + list: () => mockPagedData({}, 'discovery_domains', []), }, - getOrganizationClientGrants: () => ({ data: [] }), - getAllDiscoveryDomains: () => Promise.resolve({ data: [], next: undefined }), }, connections: { - getAll: (params) => + list: (params) => mockPagedData(params, 'connections', [ { id: sampleEnabledConnection.connection_id, @@ -663,10 +752,10 @@ describe('#organizations handler', () => { ]), }, clients: { - getAll: (params) => mockPagedData(params, 'clients', sampleClients), + list: (params) => mockPagedData(params, 'clients', sampleClients), }, clientGrants: { - getAll: (params) => mockPagedData(params, 'client_grants', [sampleClientGrant]), + list: (params) => mockPagedData(params, 'client_grants', [sampleClientGrant]), }, pool, }; @@ -691,21 +780,26 @@ describe('#organizations handler', () => { const auth0 = { organizations: { create: () => Promise.resolve([]), - update: function (params, data) { + update: function (id, data) { (() => expect(this).to.not.be.undefined)(); - expect(params).to.be.an('object'); - expect(params.id).to.equal('123'); + expect(id).to.equal('123'); expect(data.display_name).to.equal('Acme 2'); - return Promise.resolve({ data }); + return Promise.resolve(data); + }, + delete: () => Promise.resolve([]), + list: (params) => Promise.resolve(mockPagedData(params, 'organizations', [sampleOrg])), + enabledConnections: { + list: () => mockPagedData({}, 'enabled_connections', []), + }, + clientGrants: { + list: () => mockPagedData({}, 'client_grants', []), + }, + discoveryDomains: { + list: () => mockPagedData({}, 'discovery_domains', []), }, - delete: () => Promise.resolve({ data: [] }), - getAll: (params) => Promise.resolve(mockPagedData(params, 'organizations', [sampleOrg])), - getEnabledConnections: () => ({ data: [] }), - getOrganizationClientGrants: () => ({ data: [] }), - getAllDiscoveryDomains: () => Promise.resolve({ data: [], next: undefined }), }, connections: { - getAll: (params) => + list: (params) => mockPagedData(params, 'connections', [ { id: sampleEnabledConnection.connection_id, @@ -721,10 +815,10 @@ describe('#organizations handler', () => { ]), }, clients: { - getAll: (params) => mockPagedData(params, 'clients', sampleClients), + list: (params) => mockPagedData(params, 'clients', sampleClients), }, clientGrants: { - getAll: (params) => mockPagedData(params, 'client_grants', [sampleClientGrant]), + list: (params) => mockPagedData(params, 'client_grants', [sampleClientGrant]), }, pool, }; @@ -749,26 +843,31 @@ describe('#organizations handler', () => { it('should delete organizations', async () => { const auth0 = { organizations: { - create: () => Promise.resolve({ data: [] }), - update: () => Promise.resolve({ data: [] }), - delete: (data) => { - expect(data).to.be.an('object'); - expect(data.id).to.equal(sampleOrg.id); - return Promise.resolve({ data }); + create: () => Promise.resolve([]), + update: () => Promise.resolve([]), + delete: (orgId) => { + expect(orgId).to.equal(sampleOrg.id); + return Promise.resolve(); + }, + list: (params) => Promise.resolve(mockPagedData(params, 'organizations', [sampleOrg])), + enabledConnections: { + list: () => mockPagedData({}, 'enabled_connections', []), + }, + clientGrants: { + list: () => mockPagedData({}, 'client_grants', []), + }, + discoveryDomains: { + list: () => mockPagedData({}, 'discovery_domains', []), }, - getAll: (params) => Promise.resolve(mockPagedData(params, 'organizations', [sampleOrg])), - getEnabledConnections: () => [], - getOrganizationClientGrants: () => ({ data: [] }), - getAllDiscoveryDomains: () => Promise.resolve({ data: [], next: undefined }), }, connections: { - getAll: (params) => mockPagedData(params, 'connections', []), + list: (params) => mockPagedData(params, 'connections', []), }, clients: { - getAll: (params) => mockPagedData(params, 'clients', sampleClients), + list: (params) => mockPagedData(params, 'clients', sampleClients), }, clientGrants: { - getAll: (params) => mockPagedData(params, 'client_grants', [sampleClientGrant]), + list: (params) => mockPagedData(params, 'client_grants', [sampleClientGrant]), }, pool, }; @@ -790,24 +889,26 @@ describe('#organizations handler', () => { }, update: () => Promise.resolve({ data: [] }), delete: () => Promise.resolve({ data: [] }), - getAll: (params) => Promise.resolve(mockPagedData(params, 'organizations', [])), - createDiscoveryDomain: (params, domain) => { - expect(params.id).to.equal('fake'); - expect(domain).to.be.an('object'); - expect(domain.domain).to.equal('login.acme.com'); - expect(domain.status).to.equal('pending'); - return Promise.resolve({ data: { ...domain, id: 'dd_new' } }); + list: (params) => Promise.resolve(mockPagedData(params, 'organizations', [])), + discoveryDomains: { + list: () => mockPagedData({}, 'discovery_domains', []), + create: (orgId, domain) => { + expect(orgId).to.equal('fake'); + expect(domain).to.be.an('object'); + expect(domain.domain).to.equal('login.acme.com'); + expect(domain.status).to.equal('pending'); + return Promise.resolve({ data: { ...domain, id: 'dd_new' } }); + }, }, - getAllDiscoveryDomains: () => Promise.resolve({ data: [], next: undefined }), }, connections: { - getAll: (params) => mockPagedData(params, 'connections', []), + list: (params) => mockPagedData(params, 'connections', []), }, clients: { - getAll: (params) => mockPagedData(params, 'clients', sampleClients), + list: (params) => mockPagedData(params, 'clients', sampleClients), }, clientGrants: { - getAll: (params) => mockPagedData(params, 'client_grants', [sampleClientGrant]), + list: (params) => mockPagedData(params, 'client_grants', [sampleClientGrant]), }, pool, }; @@ -831,43 +932,48 @@ describe('#organizations handler', () => { const auth0 = { organizations: { create: () => Promise.resolve({ data: [] }), - update: function (params, data) { + update: function (id, data) { (() => expect(this).to.not.be.undefined)(); - expect(params).to.be.an('object'); - expect(params.id).to.equal('123'); + expect(id).to.be.a('string'); + expect(id).to.equal('123'); return Promise.resolve({ data }); }, delete: () => Promise.resolve({ data: [] }), - getAll: (params) => Promise.resolve(mockPagedData(params, 'organizations', [sampleOrg])), - getEnabledConnections: () => ({ data: [] }), - getOrganizationClientGrants: () => ({ data: [] }), - getAllDiscoveryDomains: () => - Promise.resolve({ data: [sampleDiscoveryDomain], next: undefined }), - updateDiscoveryDomain: (params, body) => { - expect(params.id).to.equal('123'); - expect(params.discovery_domain_id).to.equal('dd_123'); - expect(body.status).to.equal('verified'); - return Promise.resolve({ data: { ...sampleDiscoveryDomain, status: 'verified' } }); + list: (params) => Promise.resolve(mockPagedData(params, 'organizations', [sampleOrg])), + enabledConnections: { + list: () => mockPagedData({}, 'enabled_connections', []), }, - createDiscoveryDomain: (params, domain) => { - expect(params.id).to.equal('123'); - expect(domain.domain).to.equal('auth.acme.com'); - return Promise.resolve({ data: { ...domain, id: 'dd_new' } }); + clientGrants: { + list: () => mockPagedData({}, 'client_grants', []), }, - deleteDiscoveryDomain: (params) => { - expect(params.id).to.equal('123'); - expect(params.discovery_domain_id).to.equal('dd_123'); - return Promise.resolve({ data: {} }); + discoveryDomains: { + list: () => mockPagedData({}, 'discovery_domains', [sampleDiscoveryDomain]), + update: (orgId, discoveryDomainId, body) => { + expect(orgId).to.equal('123'); + expect(discoveryDomainId).to.equal('dd_123'); + expect(body.status).to.equal('verified'); + return Promise.resolve({ data: { ...sampleDiscoveryDomain, status: 'verified' } }); + }, + create: (orgId, domain) => { + expect(orgId).to.equal('123'); + expect(domain.domain).to.equal('auth.acme.com'); + return Promise.resolve({ data: { ...domain, id: 'dd_new' } }); + }, + delete: (orgId, discoveryDomainId) => { + expect(orgId).to.equal('123'); + expect(discoveryDomainId).to.equal('dd_123'); + return Promise.resolve({ data: {} }); + }, }, }, connections: { - getAll: (params) => mockPagedData(params, 'connections', []), + list: (params) => mockPagedData(params, 'connections', []), }, clients: { - getAll: (params) => mockPagedData(params, 'clients', sampleClients), + list: (params) => mockPagedData(params, 'clients', sampleClients), }, clientGrants: { - getAll: (params) => mockPagedData(params, 'client_grants', [sampleClientGrant]), + list: (params) => mockPagedData(params, 'client_grants', [sampleClientGrant]), }, pool, }; @@ -896,19 +1002,23 @@ describe('#organizations handler', () => { const auth0 = { organizations: { create: () => Promise.resolve({ data: [] }), - update: function (params, data) { + update: function (id, data) { (() => expect(this).to.not.be.undefined)(); - expect(params).to.be.an('object'); - expect(params.id).to.equal('123'); + expect(id).to.be.a('string'); + expect(id).to.equal('123'); return Promise.resolve({ data }); }, delete: () => Promise.resolve({ data: [] }), - getAll: (params) => Promise.resolve(mockPagedData(params, 'organizations', [sampleOrg])), - getEnabledConnections: () => ({ data: [] }), - getOrganizationClientGrants: () => ({ data: [] }), - getAllDiscoveryDomains: () => - Promise.resolve({ - data: [ + list: (params) => Promise.resolve(mockPagedData(params, 'organizations', [sampleOrg])), + enabledConnections: { + list: () => mockPagedData({}, 'enabled_connections', []), + }, + clientGrants: { + list: () => mockPagedData({}, 'client_grants', []), + }, + discoveryDomains: { + list: () => + mockPagedData({}, 'discovery_domains', [ sampleDiscoveryDomain, { id: 'dd_456', @@ -917,28 +1027,27 @@ describe('#organizations handler', () => { verification_txt: 'auth0-domain-verification=abc', verification_host: '_auth0-domain-verification.auth.acme.com', }, - ], - next: undefined, - }), - updateDiscoveryDomain: (params, body) => { - expect(params.id).to.equal('123'); - expect(params.discovery_domain_id).to.equal('dd_123'); - return Promise.resolve({ data: { ...sampleDiscoveryDomain, ...body } }); - }, - deleteDiscoveryDomain: (params) => { - expect(params.id).to.equal('123'); - expect(params.discovery_domain_id).to.equal('dd_456'); - return Promise.resolve({ data: {} }); + ]), + update: (orgId, discoveryDomainId, body) => { + expect(orgId).to.equal('123'); + expect(discoveryDomainId).to.equal('dd_123'); + return Promise.resolve({ data: { ...sampleDiscoveryDomain, ...body } }); + }, + delete: (orgId, discoveryDomainId) => { + expect(orgId).to.equal('123'); + expect(discoveryDomainId).to.equal('dd_456'); + return Promise.resolve({ data: {} }); + }, }, }, connections: { - getAll: (params) => mockPagedData(params, 'connections', []), + list: (params) => mockPagedData(params, 'connections', []), }, clients: { - getAll: (params) => mockPagedData(params, 'clients', sampleClients), + list: (params) => mockPagedData(params, 'clients', sampleClients), }, clientGrants: { - getAll: (params) => mockPagedData(params, 'client_grants', [sampleClientGrant]), + list: (params) => mockPagedData(params, 'client_grants', [sampleClientGrant]), }, pool, }; @@ -975,19 +1084,23 @@ describe('#organizations handler', () => { const auth0 = { organizations: { create: () => Promise.resolve({ data: [] }), - update: function (params, data) { + update: function (id, data) { (() => expect(this).to.not.be.undefined)(); - expect(params).to.be.an('object'); - expect(params.id).to.equal('123'); + expect(id).to.be.a('string'); + expect(id).to.equal('123'); return Promise.resolve({ data }); }, delete: () => Promise.resolve({ data: [] }), - getAll: (params) => Promise.resolve(mockPagedData(params, 'organizations', [sampleOrg])), - getEnabledConnections: () => ({ data: [] }), - getOrganizationClientGrants: () => ({ data: [] }), - getAllDiscoveryDomains: () => - Promise.resolve({ - data: [ + list: (params) => Promise.resolve(mockPagedData(params, 'organizations', [sampleOrg])), + enabledConnections: { + list: () => mockPagedData({}, 'enabled_connections', []), + }, + clientGrants: { + list: () => mockPagedData({}, 'client_grants', []), + }, + discoveryDomains: { + list: () => + mockPagedData({}, 'discovery_domains', [ sampleDiscoveryDomain, { id: 'dd_456', @@ -996,25 +1109,24 @@ describe('#organizations handler', () => { verification_txt: 'auth0-domain-verification=abc', verification_host: '_auth0-domain-verification.auth.acme.com', }, - ], - next: undefined, - }), - updateDiscoveryDomain: (params, body) => { - expect(params.id).to.equal('123'); - return Promise.resolve({ data: { ...sampleDiscoveryDomain, ...body } }); - }, - deleteDiscoveryDomain: () => { - throw new Error('deleteDiscoveryDomain should not be called when delete is disabled'); + ]), + update: (orgId, discoveryDomainId, body) => { + expect(orgId).to.equal('123'); + return Promise.resolve({ data: { ...sampleDiscoveryDomain, ...body } }); + }, + delete: () => { + throw new Error('deleteDiscoveryDomain should not be called when delete is disabled'); + }, }, }, connections: { - getAll: (params) => mockPagedData(params, 'connections', []), + list: (params) => mockPagedData(params, 'connections', []), }, clients: { - getAll: (params) => mockPagedData(params, 'clients', sampleClients), + list: (params) => mockPagedData(params, 'clients', sampleClients), }, clientGrants: { - getAll: (params) => mockPagedData(params, 'client_grants', [sampleClientGrant]), + list: (params) => mockPagedData(params, 'client_grants', [sampleClientGrant]), }, pool, }; diff --git a/test/tools/auth0/handlers/pages.tests.js b/test/tools/auth0/handlers/pages.tests.js index f4e4ab6ed..b5eaac265 100644 --- a/test/tools/auth0/handlers/pages.tests.js +++ b/test/tools/auth0/handlers/pages.tests.js @@ -9,16 +9,16 @@ describe('#pages handler', () => { it('should update login page', async () => { const auth0 = { clients: { - update: function (params, data) { + update: function (clientId, data) { (() => expect(this).to.not.be.undefined)(); - expect(params).to.be.an('object'); + expect(clientId).to.be.a('string'); expect(data).to.be.an('object'); - expect(params.client_id).to.equal('global1'); + expect(clientId).to.equal('global1'); expect(data.custom_login_page).to.equal('login_body'); expect(data.custom_login_page_on).to.equal(true); - return Promise.resolve({ data }); + return Promise.resolve(data); }, - getAll: (params) => mockPagedData(params, 'clients', [{ client_id: 'global1' }]), + list: (params) => mockPagedData(params, 'clients', [{ client_id: 'global1' }]), }, }; @@ -36,7 +36,7 @@ describe('#pages handler', () => { const auth0 = { clients: { - getAll: (params) => + list: (params) => mockPagedData(params, 'clients', [ { name: 'Global Client', @@ -47,13 +47,13 @@ describe('#pages handler', () => { ]), }, tenants: { - getSettings: () => ({ - data: { + settings: { + get: () => ({ guardian_mfa_page: { enabled: true, html: html }, change_password: { enabled: true, html: html }, error_page: { show_log_link: true, html: html, url: errorPageUrl }, - }, - }), + }), + }, }, }; @@ -75,12 +75,14 @@ describe('#pages handler', () => { it('should update password_reset page', async () => { const auth0 = { tenants: { - updateSettings: (data) => { - expect(data).to.be.an('object'); - expect(data.change_password).to.be.an('object'); - expect(data.change_password.html).to.equal('password_reset_body'); - expect(data.change_password.enabled).to.equal(false); - return Promise.resolve({ data }); + settings: { + update: (data) => { + expect(data).to.be.an('object'); + expect(data.change_password).to.be.an('object'); + expect(data.change_password.html).to.equal('password_reset_body'); + expect(data.change_password.enabled).to.equal(false); + return Promise.resolve(data); + }, }, }, }; @@ -98,13 +100,15 @@ describe('#pages handler', () => { const errorPageUrl = 'https://mycompany.org/error'; const auth0 = { tenants: { - updateSettings: (data) => { - expect(data).to.be.an('object'); - expect(data.error_page).to.be.an('object'); - expect(data.error_page.html).to.equal(errorPageHtml); - expect(data.error_page.url).to.equal(errorPageUrl); - expect(data.error_page.show_log_link).to.equal(true); - return Promise.resolve({ data }); + settings: { + update: (data) => { + expect(data).to.be.an('object'); + expect(data.error_page).to.be.an('object'); + expect(data.error_page.html).to.equal(errorPageHtml); + expect(data.error_page.url).to.equal(errorPageUrl); + expect(data.error_page.show_log_link).to.equal(true); + return Promise.resolve(data); + }, }, }, }; diff --git a/test/tools/auth0/handlers/phoneProvider.test.ts b/test/tools/auth0/handlers/phoneProvider.test.ts index 911d2c965..8b40ccfa5 100644 --- a/test/tools/auth0/handlers/phoneProvider.test.ts +++ b/test/tools/auth0/handlers/phoneProvider.test.ts @@ -21,7 +21,11 @@ describe('#phoneProviders handler', () => { it('should get phoneProviders', async () => { const auth0 = { branding: { - getAllPhoneProviders: () => Promise.resolve({ data: mockProviders }), + phone: { + providers: { + list: () => Promise.resolve(mockProviders), + }, + }, }, }; @@ -34,7 +38,11 @@ describe('#phoneProviders handler', () => { it('should return empty array if there are no phone providers', async () => { const auth0 = { branding: { - getAllPhoneProviders: () => Promise.resolve({ data: { providers: [] } }), + phone: { + providers: { + list: () => Promise.resolve({ providers: [] }), + }, + }, }, }; @@ -47,7 +55,11 @@ describe('#phoneProviders handler', () => { it('should fail for unexpected api errors', async () => { const auth0 = { branding: { - getAllPhoneProviders: () => Promise.reject(new Error('Unexpected API error')), + phone: { + providers: { + list: () => Promise.reject(new Error('Unexpected API error')), + }, + }, }, }; @@ -66,8 +78,12 @@ describe('#phoneProviders handler', () => { it('should configure phone provider', async () => { const auth0 = { branding: { - getAllPhoneProviders: () => Promise.resolve({ data: { providers: [] } }), - configurePhoneProvider: (data) => Promise.resolve({ data }), + phone: { + providers: { + list: () => Promise.resolve({ providers: [] }), + create: (data) => Promise.resolve(data), + }, + }, }, }; @@ -80,17 +96,20 @@ describe('#phoneProviders handler', () => { it('should update phone provider', async () => { const auth0 = { branding: { - getAllPhoneProviders: () => - Promise.resolve({ - data: { providers: [{ id: 'pro_5nbdb4pWifFdA1rV6pW6BE' }] }, - }), - updatePhoneProvider: (data, updatePayload) => { - expect(data).to.be.an('object'); - expect(data.id).to.equal('pro_5nbdb4pWifFdA1rV6pW6BE'); - expect(updatePayload).to.be.an('object'); - expect(updatePayload.name).to.equal('custom'); - expect(updatePayload.configuration.delivery_methods[0]).to.equal('text'); - return Promise.resolve({ data: { ...updatePayload, ...data } }); + phone: { + providers: { + list: () => + Promise.resolve({ + providers: [{ id: 'pro_5nbdb4pWifFdA1rV6pW6BE' }], + }), + update: (id, updatePayload) => { + expect(id).to.equal('pro_5nbdb4pWifFdA1rV6pW6BE'); + expect(updatePayload).to.be.an('object'); + expect(updatePayload.name).to.equal('custom'); + expect(updatePayload.configuration.delivery_methods[0]).to.equal('text'); + return Promise.resolve({ ...updatePayload, id }); + }, + }, }, }, }; @@ -113,10 +132,29 @@ describe('#phoneProviders handler', () => { it('should delete the phone provider when provider exists and AUTH0_ALLOW_DELETE is true', async () => { const AUTH0_ALLOW_DELETE = true; + const mockProvidersWithId = { + providers: [ + { + id: 'provider_123', + disabled: false, + name: 'twilio', + configuration: { + sid: 'twilio_sid', + default_from: '++15673812247', + delivery_methods: ['text', 'voice'], + }, + }, + ], + }; + const auth0 = { branding: { - getAllPhoneProviders: () => Promise.resolve({ data: mockProviders }), - deletePhoneProvider: () => Promise.resolve({ data: null }), + phone: { + providers: { + list: () => Promise.resolve(mockProvidersWithId), + delete: () => Promise.resolve(), + }, + }, }, }; @@ -132,11 +170,30 @@ describe('#phoneProviders handler', () => { it('shouldnot delete the phone provider when provider exists and AUTH0_ALLOW_DELETE is false', async () => { const AUTH0_ALLOW_DELETE = false; + const mockProvidersWithId = { + providers: [ + { + id: 'provider_123', + disabled: false, + name: 'twilio', + configuration: { + sid: 'twilio_sid', + default_from: '++15673812247', + delivery_methods: ['text', 'voice'], + }, + }, + ], + }; + const auth0 = { branding: { - getAllPhoneProviders: () => Promise.resolve({ data: mockProviders }), - deletePhoneProvider: () => { - throw new Error('was not expecting delete to be called'); + phone: { + providers: { + list: () => Promise.resolve(mockProvidersWithId), + delete: () => { + throw new Error('was not expecting delete to be called'); + }, + }, }, }, }; diff --git a/test/tools/auth0/handlers/phoneTemplates.test.ts b/test/tools/auth0/handlers/phoneTemplates.test.ts new file mode 100644 index 000000000..b9345296d --- /dev/null +++ b/test/tools/auth0/handlers/phoneTemplates.test.ts @@ -0,0 +1,313 @@ +import { expect } from 'chai'; + +import phoneTemplatesHandler from '../../../../src/tools/auth0/handlers/phoneTemplates'; + +const mockTemplates = { + templates: [ + { + id: 'pntm_1234567890', + type: 'otp_verify', + disabled: false, + content: { + syntax: 'liquid', + from: '+15551234567', + body: { + text: 'Your verification code is ##OTP_VERIFICATION_TEXT## {{ code }}', + voice: 'Your verification code is ##OTP_VERIFICATION_TEXT## {{ code }}', + }, + }, + }, + { + id: 'pntm_0987654321', + type: 'otp_enroll', + disabled: false, + content: { + syntax: 'liquid', + from: '+15551234567', + body: { + text: 'Your enrollment code is ##OTP_ENROLL_TEXT## {{ code }}', + voice: 'Your enrollment code is ##OTP_ENROLL_TEXT## {{ code }}', + }, + }, + }, + ], +}; + +const mockPool = { + addEachTask: function (data) { + return { + promise: () => Promise.all(data.data.map(data.generator)), + }; + }, +}; + +describe('#phoneTemplates handler', () => { + describe('#phoneTemplates getType', () => { + it('should get phoneTemplates', async () => { + const auth0 = { + branding: { + phone: { + templates: { + list: () => Promise.resolve(mockTemplates), + }, + }, + }, + }; + + const handler = new phoneTemplatesHandler({ client: auth0 }); + const data = await handler.getType(); + + expect(data).to.deep.equal(mockTemplates.templates); + }); + + it('should return empty array if there are no phone templates', async () => { + const auth0 = { + branding: { + phone: { + templates: { + list: () => Promise.resolve({ templates: [] }), + }, + }, + }, + }; + + const handler = new phoneTemplatesHandler({ client: auth0 }); + const data = await handler.getType(); + + expect(data).to.deep.equal([]); + }); + + it('should return empty array if templates is undefined', async () => { + const auth0 = { + branding: { + phone: { + templates: { + list: () => Promise.resolve({}), + }, + }, + }, + }; + + const handler = new phoneTemplatesHandler({ client: auth0 }); + const data = await handler.getType(); + + expect(data).to.deep.equal([]); + }); + + it('should fail for unexpected api errors', async () => { + const auth0 = { + branding: { + phone: { + templates: { + list: () => Promise.reject(new Error('Unexpected API error')), + }, + }, + }, + }; + + const handler = new phoneTemplatesHandler({ client: auth0 }); + + try { + await handler.getType(); + } catch (error) { + expect(error).to.be.an('error'); + expect(error.message).to.equal('Unexpected API error'); + } + }); + }); + + describe('#phoneTemplates processChanges', () => { + it('should create phone template', async () => { + let createCalled = false; + const auth0 = { + branding: { + phone: { + templates: { + list: () => Promise.resolve({ templates: [] }), + create: (data) => { + createCalled = true; + expect(data.type).to.equal('otp_verify'); + expect(data.disabled).to.equal(false); + return Promise.resolve({ id: 'pntm_new', ...data }); + }, + }, + }, + }, + pool: mockPool, + }; + + const handler = new phoneTemplatesHandler({ client: auth0, config: () => false }); + const stageFn = Object.getPrototypeOf(handler).processChanges; + + const newTemplate = { + type: 'otp_verify', + disabled: false, + content: { + syntax: 'liquid', + from: '+15551234567', + body: { + text: 'Your verification code is ##OTP_VERIFICATION_TEXT## {{ code }}', + }, + }, + }; + + await stageFn.apply(handler, [{ phoneTemplates: [newTemplate] }]); + expect(createCalled).to.equal(true); + }); + + it('should update phone template', async () => { + let updateCalled = false; + const existingTemplate = { + id: 'pntm_1234567890', + type: 'otp_verify', + disabled: false, + content: { + syntax: 'liquid', + from: '+15551234567', + body: { + text: 'Your verification code is ##OTP_VERIFICATION_TEXT## {{ code }}', + }, + }, + }; + + const auth0 = { + branding: { + phone: { + templates: { + list: () => Promise.resolve({ templates: [existingTemplate] }), + update: (id, updatePayload) => { + updateCalled = true; + expect(id).to.equal('pntm_1234567890'); + expect(updatePayload.content.body.text).to.equal( + 'Your verification code is ##OTP_VERIFICATION_TEXT## {{ code }}' + ); + expect(updatePayload.disabled).to.equal(true); + return Promise.resolve({ id, ...updatePayload }); + }, + }, + }, + }, + pool: mockPool, + }; + + const handler = new phoneTemplatesHandler({ client: auth0, config: () => false }); + const stageFn = Object.getPrototypeOf(handler).processChanges; + + const updatedTemplate = { + type: 'otp_verify', + disabled: true, + content: { + syntax: 'liquid', + from: '+15551234567', + body: { + text: 'Your verification code is ##OTP_VERIFICATION_TEXT## {{ code }}', + }, + }, + }; + + await stageFn.apply(handler, [{ phoneTemplates: [updatedTemplate] }]); + expect(updateCalled).to.equal(true); + }); + + it('should delete phone template when AUTH0_ALLOW_DELETE is true', async () => { + let deleteCalled = false; + const AUTH0_ALLOW_DELETE = true; + + const existingTemplate = { + id: 'pntm_1234567890', + type: 'otp_verify', + disabled: false, + content: { + syntax: 'liquid', + from: '+15551234567', + body: { + text: 'Some text', + }, + }, + }; + + const auth0 = { + branding: { + phone: { + templates: { + list: () => Promise.resolve({ templates: [existingTemplate] }), + delete: (id) => { + deleteCalled = true; + expect(id).to.equal('pntm_1234567890'); + return Promise.resolve(); + }, + }, + }, + }, + pool: mockPool, + }; + + const handler = new phoneTemplatesHandler({ + client: auth0, + config: () => AUTH0_ALLOW_DELETE, + }); + const stageFn = Object.getPrototypeOf(handler).processChanges; + + await stageFn.apply(handler, [{ phoneTemplates: [] }]); + expect(deleteCalled).to.equal(true); + }); + + it('should not delete phone template when AUTH0_ALLOW_DELETE is false', async () => { + const AUTH0_ALLOW_DELETE = false; + + const existingTemplate = { + id: 'pntm_1234567890', + type: 'otp_verify', + disabled: false, + content: { + syntax: 'liquid', + from: '+15551234567', + body: { + text: 'Some text', + }, + }, + }; + + const auth0 = { + branding: { + phone: { + templates: { + list: () => Promise.resolve({ templates: [existingTemplate] }), + delete: () => { + throw new Error('was not expecting delete to be called'); + }, + }, + }, + }, + pool: mockPool, + }; + + const handler = new phoneTemplatesHandler({ + client: auth0, + config: () => AUTH0_ALLOW_DELETE, + }); + const stageFn = Object.getPrototypeOf(handler).processChanges; + + await stageFn.apply(handler, [{ phoneTemplates: [] }]); + }); + + it('should do nothing when phoneTemplates is not provided', async () => { + const auth0 = { + branding: { + phone: { + templates: { + list: () => { + throw new Error('was not expecting list to be called'); + }, + }, + }, + }, + }; + + const handler = new phoneTemplatesHandler({ client: auth0 }); + const stageFn = Object.getPrototypeOf(handler).processChanges; + + await stageFn.apply(handler, [{}]); + }); + }); +}); diff --git a/test/tools/auth0/handlers/prompts.tests.ts b/test/tools/auth0/handlers/prompts.tests.ts index 57e0bdee4..90db6feb9 100644 --- a/test/tools/auth0/handlers/prompts.tests.ts +++ b/test/tools/auth0/handlers/prompts.tests.ts @@ -1,11 +1,10 @@ import { expect } from 'chai'; import _ from 'lodash'; import { PromisePoolExecutor } from 'promise-pool-executor'; -import sinon from 'sinon'; +import * as sinon from 'sinon'; import promptsHandler, { Prompts } from '../../../../src/tools/auth0/handlers/prompts'; import { Language } from '../../../../src/types'; import log from '../../../../src/logger'; -import { CustomPartialsPromptTypes } from '../../../../lib/tools/auth0/handlers/prompts'; const mockPromptsSettings = { universal_login_experience: 'classic', @@ -108,30 +107,38 @@ describe('#prompts handler', () => { const auth0 = { tenants: { - getSettings: () => - Promise.resolve({ - data: { + settings: { + get: () => + Promise.resolve({ enabled_locales: supportedLanguages, - }, - }), + }), + }, }, prompts: { - get: () => ({ data: mockPromptsSettings }), - getCustomTextByLanguage: ({ language, prompt }) => { - const customTextLanguageMap = { - en: englishCustomText, - es: spanishCustomText, - fr: frenchCustomText, - }; - const customTextValue = customTextLanguageMap[language][prompt]; - - if (customTextValue === undefined || _.isEmpty(customTextValue)) - return Promise.resolve({ data: {} }); - - return Promise.resolve({ data: customTextValue }); + getSettings: () => Promise.resolve(mockPromptsSettings), + customText: { + get: (prompt, language, _options) => { + const customTextLanguageMap = { + en: englishCustomText, + es: spanishCustomText, + fr: frenchCustomText, + }; + const customTextForLanguage = customTextLanguageMap[language]; + if (!customTextForLanguage || !customTextForLanguage[prompt]) { + return Promise.resolve({}); + } + + const customTextValue = customTextForLanguage[prompt]; // Get the wrapper object with prompt as key + + if (customTextValue === undefined || _.isEmpty(customTextValue)) + return Promise.resolve({}); + + return Promise.resolve(customTextValue); + }, + }, + rendering: { + list: () => [sampleScreenRenderLogin, sampleScreenRenderSignUp], }, - getAllRenderingSettings: () => - Promise.resolve({ data: [sampleScreenRenderLogin, sampleScreenRenderSignUp] }), }, pool: new PromisePoolExecutor({ concurrencyLimit: 3, @@ -146,13 +153,15 @@ describe('#prompts handler', () => { }); const getCustomPartial = sinon.stub(handler, 'getCustomPartial'); - getCustomPartial.withArgs({ prompt: 'login' }).resolves({ data: loginPartial }); + getCustomPartial.withArgs({ prompt: 'login' }).resolves(loginPartial); getCustomPartial.withArgs({ prompt: 'login-id' }).resolves({}); getCustomPartial.withArgs({ prompt: 'login-password' }).resolves({}); getCustomPartial.withArgs({ prompt: 'login-passwordless' }).resolves({}); getCustomPartial.withArgs({ prompt: 'signup-password' }).resolves({}); getCustomPartial.withArgs({ prompt: 'signup-id' }).resolves({}); - getCustomPartial.withArgs({ prompt: 'signup' }).resolves({ data: signupPartial }); + getCustomPartial.withArgs({ prompt: 'signup' }).resolves(signupPartial); + // Stub new prompts to return empty for retrieval test + getCustomPartial.withArgs({ prompt: 'brute-force-protection' }).resolves({}); const data = await handler.getType(); expect(data).to.deep.equal({ @@ -177,6 +186,111 @@ describe('#prompts handler', () => { }, screenRenderers: [sampleScreenRenderLogin, sampleScreenRenderSignUp], }); + sinon.restore(); + }); + + it('should get brute-force-protection custom texts along with others', async () => { + const supportedLanguages: Language[] = ['en']; + + const englishCustomText = { + login: { + login: { + description: 'login description in english', + title: 'login title in english', + buttonText: 'login button text in english', + }, + }, + 'brute-force-protection': { + 'brute-force-protection-unblock': { + pageTitle: 'Unblock My Account here', + description: 'Unblock My Account here', + buttonText: 'Continue here', + logoAltText: 'comapny_name', + }, + 'brute-force-protection-unblock-success': { + pageTitle: 'Account Unblocked', + eventTitle: 'Account Unblocked', + description: 'Your account has been unblocked Description', + }, + 'brute-force-protection-unblock-failure': { + pageTitle: 'Authentication Error', + eventTitle: 'Authentication Error', + expiredError: 'This link has expired.', + usedError: 'This link can only be used once.', + genericError: 'Something went wrong, please try again later.', + }, + }, + }; + + const auth0 = { + tenants: { + settings: { + get: () => + Promise.resolve({ + enabled_locales: supportedLanguages, + }), + }, + }, + prompts: { + getSettings: () => Promise.resolve(mockPromptsSettings), + customText: { + get: (prompt, language, _options) => { + const customTextLanguageMap = { + en: { + login: englishCustomText.login, + 'brute-force-protection': englishCustomText['brute-force-protection'], + }, + }; + + // Simulate fetching custom text for the specific prompt ('login' or 'brute-force-protection') + const customTextForLanguage = customTextLanguageMap[language]; + + if (!customTextForLanguage || !customTextForLanguage[prompt]) { + return Promise.resolve({}); + } + + const customTextValue = customTextForLanguage[prompt]; + if (customTextValue === undefined || _.isEmpty(customTextValue)) + return Promise.resolve({}); + + return Promise.resolve(customTextValue); + }, + }, + rendering: { + list: () => [], + }, + }, + pool: new PromisePoolExecutor({ + concurrencyLimit: 3, + frequencyLimit: 1000, + frequencyWindow: 1000, // 1 sec + }), + }; + + const handler = new promptsHandler({ + client: auth0, + config: config, + }); + + const getCustomPartial = sinon.stub(handler, 'getCustomPartial'); + // Stub all partials to return empty for simplicity in this test + getCustomPartial.resolves({}); + + const data = await handler.getType(); + + // The expected data should include the brute-force-protection custom texts + expect(data).to.deep.equal({ + ...mockPromptsSettings, + customText: { + en: { + login: englishCustomText.login, + 'brute-force-protection': englishCustomText['brute-force-protection'], + }, + }, + partials: {}, + screenRenderers: [], + }); + sinon.restore(); }); it('should update prompts settings but not custom text/partials settings if not set', async () => { @@ -186,22 +300,26 @@ describe('#prompts handler', () => { const auth0 = { tenants: { - getSettings: () => ({ - enabled_locales: ['en'], - }), + settings: { + get: () => ({ + enabled_locales: ['en'], + }), + }, }, prompts: { - updateCustomTextByLanguage: () => { - didCallUpdateCustomText = true; + customText: { + set: () => { + didCallUpdateCustomText = true; + }, }, - update: (data) => { + updateSettings: (data) => { didCallUpdatePromptsSettings = true; expect(data).to.deep.equal(mockPromptsSettings); return Promise.resolve({ data }); }, - _getRestClient: (endpoint) => ({ - get: (...options) => Promise.resolve({ endpoint, method: 'get', options }), - }), + rendering: { + update: () => {}, // Stub update since AUTH0_EXPERIMENTAL_EA is true by default here + }, }, }; @@ -222,9 +340,10 @@ describe('#prompts handler', () => { expect(didCallUpdatePromptsSettings).to.equal(true); expect(didCallUpdateCustomText).to.equal(false); expect(didCallUpdatePartials).to.equal(false); + sinon.restore(); }); - it('should update prompts settings and custom text/partials, screen renderer settings when set', async () => { + it('should update prompts settings and custom text/partials, screen renderer settings when set, including brute-force-protection', async () => { let didCallUpdatePromptsSettings = false; let didCallUpdateCustomText = false; let didCallUpdatePartials = false; @@ -239,6 +358,17 @@ describe('#prompts handler', () => { description: 'description text', title: 'title text', }, + 'brute-force-protection': { + // Added brute-force-protection custom text + 'brute-force-protection-unblock': { + pageTitle: 'Unblock My Account here', + description: 'Unblock My Account here', + buttonText: 'Continue here', + }, + 'brute-force-protection-unblock-success': { + pageTitle: 'Account Unblocked', + }, + }, 'mfa-webauthn': {}, }, fr: { @@ -290,19 +420,29 @@ describe('#prompts handler', () => { const auth0 = { prompts: { - updateCustomTextByLanguage: () => { - didCallUpdateCustomText = true; - numberOfUpdateCustomTextCalls++; - return Promise.resolve({ data: {} }); + customText: { + set: (prompt, language, body) => { + didCallUpdateCustomText = true; + numberOfUpdateCustomTextCalls++; + if (prompt === 'brute-force-protection') { + expect(language).to.equal('en'); + // Check if the body contains the brute-force-protection screens + expect(body).to.have.property('brute-force-protection-unblock'); + expect(body).to.have.property('brute-force-protection-unblock-success'); + } + return Promise.resolve({ data: {} }); + }, }, - update: (data) => { + updateSettings: (data) => { didCallUpdatePromptsSettings = true; expect(data).to.deep.equal(mockPromptsSettings); return Promise.resolve({ data }); }, - updateRendering: () => { - didCallUpdateScreenRenderer = true; - return Promise.resolve({ data: {} }); + rendering: { + update: () => { + didCallUpdateScreenRenderer = true; + return Promise.resolve({ data: {} }); + }, }, _getRestClient: (endpoint) => ({ get: (...options) => Promise.resolve({ endpoint, method: 'get', options }), @@ -342,8 +482,12 @@ describe('#prompts handler', () => { expect(didCallUpdateCustomText).to.equal(true); expect(didCallUpdatePartials).to.equal(true); expect(didCallUpdateScreenRenderer).to.equal(true); - expect(numberOfUpdateCustomTextCalls).to.equal(3); - expect(numberOfUpdatePartialsCalls).to.equal(3); + // Expected calls: login (en), brute-force-protection (en), mfa-webauthn (en), login (fr) + // Note: The total number of calls depends on how many unique prompt/language combinations are in customTextToSet. + // In this case: (en/login), (en/brute-force-protection), (en/mfa-webauthn), (fr/login) = 4 calls + expect(numberOfUpdateCustomTextCalls).to.equal(4); + expect(numberOfUpdatePartialsCalls).to.equal(3); // Based on partialsToSet keys + sinon.restore(); }); it('should update prompts settings and custom text/partials, not screen renderer settings when AUTH0_EXPERIMENTAL_EA=false', async () => { @@ -393,19 +537,23 @@ describe('#prompts handler', () => { const auth0 = { prompts: { - updateCustomTextByLanguage: () => { - didCallUpdateCustomText = true; - numberOfUpdateCustomTextCalls++; - return Promise.resolve({ data: {} }); + customText: { + set: () => { + didCallUpdateCustomText = true; + numberOfUpdateCustomTextCalls++; + return Promise.resolve({ data: {} }); + }, }, - update: (data) => { + updateSettings: (data) => { didCallUpdatePromptsSettings = true; expect(data).to.deep.equal(mockPromptsSettings); return Promise.resolve({ data }); }, - updateRendering: () => { - didCallUpdateScreenRenderer = true; - return Promise.resolve({ data: {} }); + rendering: { + update: () => { + didCallUpdateScreenRenderer = true; + return Promise.resolve({ data: {} }); + }, }, _getRestClient: (endpoint) => ({ get: (...options) => Promise.resolve({ endpoint, method: 'get', options }), @@ -447,27 +595,29 @@ describe('#prompts handler', () => { expect(didCallUpdateCustomText).to.equal(true); expect(didCallUpdatePartials).to.equal(true); expect(didCallUpdateScreenRenderer).to.equal(false); - expect(numberOfUpdateCustomTextCalls).to.equal(3); + expect(numberOfUpdateCustomTextCalls).to.equal(3); // login-en, mfa-webauthn-en, login-fr expect(numberOfUpdatePartialsCalls).to.equal(3); + config.data.AUTH0_EXPERIMENTAL_EA = true; // Reset config for subsequent tests + sinon.restore(); }); it('should not fail if tenant languages or partials are undefined', async () => { const auth0 = { tenants: { - getSettings: () => - Promise.resolve({ - data: { - enabled_locales: undefined, - }, - }), + settings: { + get: () => + Promise.resolve({ + data: { + enabled_locales: undefined, + }, + }), + }, }, prompts: { - get: () => ({ data: mockPromptsSettings }), - getSettings: () => mockPromptsSettings, - _getRestClient: (endpoint) => ({ - get: (...options) => Promise.resolve({ endpoint, method: 'get', options }), - }), - getAllRenderingSettings: () => Promise.resolve({ data: [] }), + getSettings: () => Promise.resolve(mockPromptsSettings), + rendering: { + list: () => [], + }, }, pool: new PromisePoolExecutor({ concurrencyLimit: 3, @@ -487,6 +637,7 @@ describe('#prompts handler', () => { getCustomPartial.withArgs({ prompt: 'signup-password' }).resolves({}); getCustomPartial.withArgs({ prompt: 'signup-id' }).resolves({}); getCustomPartial.withArgs({ prompt: 'signup' }).resolves({}); + getCustomPartial.withArgs({ prompt: 'brute-force-protection' }).resolves({}); const data = await handler.getType(); expect(data).to.deep.equal({ @@ -495,6 +646,7 @@ describe('#prompts handler', () => { partials: {}, // Partials empty screenRenderers: [], }); + sinon.restore(); }); }); describe('withErrorHandling', () => { @@ -596,7 +748,7 @@ describe('#prompts handler', () => { handler.IsFeatureSupported = false; const result = await handler.getCustomPartial({ - prompt: 'login' as CustomPartialsPromptTypes, + prompt: 'login', }); expect(result).to.deep.equal({}); }); diff --git a/test/tools/auth0/handlers/resourceServers.tests.js b/test/tools/auth0/handlers/resourceServers.tests.js index 571e7b0b8..91948aa08 100644 --- a/test/tools/auth0/handlers/resourceServers.tests.js +++ b/test/tools/auth0/handlers/resourceServers.tests.js @@ -82,11 +82,11 @@ describe('#resourceServers handler', () => { expect(data).to.be.an('object'); expect(data.name).to.equal('someAPI'); expect(data.identifier).to.equal('https://api.example.com'); - return Promise.resolve({ data }); + return Promise.resolve(data); }, - update: () => Promise.resolve({ data: [] }), - delete: () => Promise.resolve({ data: [] }), - getAll: (params) => mockPagedData(params, 'resource_servers', []), + update: () => Promise.resolve([]), + delete: () => Promise.resolve([]), + list: (params) => mockPagedData(params, 'resource_servers', []), }, pool, }; @@ -110,11 +110,11 @@ describe('#resourceServers handler', () => { mechanism: 'mtls', required: true, }); - return Promise.resolve({ data }); + return Promise.resolve(data); }, - update: () => Promise.resolve({ data: [] }), - delete: () => Promise.resolve({ data: [] }), - getAll: (params) => mockPagedData(params, 'resource_servers', []), + update: () => Promise.resolve([]), + delete: () => Promise.resolve([]), + list: (params) => mockPagedData(params, 'resource_servers', []), }, pool, }; @@ -149,11 +149,11 @@ describe('#resourceServers handler', () => { mechanism: 'dpop', required: true, }); - return Promise.resolve({ data }); + return Promise.resolve(data); }, - update: () => Promise.resolve({ data: [] }), - delete: () => Promise.resolve({ data: [] }), - getAll: (params) => mockPagedData(params, 'resource_servers', []), + update: () => Promise.resolve([]), + delete: () => Promise.resolve([]), + list: (params) => mockPagedData(params, 'resource_servers', []), }, pool, }; @@ -192,11 +192,11 @@ describe('#resourceServers handler', () => { policy: 'deny_all', }, }); - return Promise.resolve({ data }); + return Promise.resolve(data); }, - update: () => Promise.resolve({ data: [] }), - delete: () => Promise.resolve({ data: [] }), - getAll: (params) => mockPagedData(params, 'resource_servers', []), + update: () => Promise.resolve([]), + delete: () => Promise.resolve([]), + list: (params) => mockPagedData(params, 'resource_servers', []), }, pool, }; @@ -227,7 +227,7 @@ describe('#resourceServers handler', () => { it('should get resource servers', async () => { const auth0 = { resourceServers: { - getAll: (params) => + list: (params) => mockPagedData(params, 'resource_servers', [ { name: 'Auth0 Management API', @@ -247,15 +247,15 @@ describe('#resourceServers handler', () => { const auth0 = { resourceServers: { create: () => Promise.resolve([]), - update: function (params, data) { - expect(params).to.be.an('object'); + update: function (id, data) { + expect(id).to.be.a('string'); expect(data).to.be.an('object'); - expect(params.id).to.equal('rs1'); + expect(id).to.equal('rs1'); expect(data.scope).to.equal('new:scope'); - return Promise.resolve({ data }); + return Promise.resolve(data); }, - delete: () => Promise.resolve({ data: [] }), - getAll: (params) => + delete: () => Promise.resolve([]), + list: (params) => mockPagedData(params, 'resource_servers', [ { id: 'rs1', identifier: 'some-api', name: 'someAPI' }, ]), @@ -275,18 +275,18 @@ describe('#resourceServers handler', () => { const auth0 = { resourceServers: { create: () => Promise.resolve([]), - update: function (params, data) { - expect(params).to.be.an('object'); + update: function (id, data) { + expect(id).to.be.a('string'); expect(data).to.be.an('object'); - expect(params.id).to.equal('rs1'); + expect(id).to.equal('rs1'); expect(data.proof_of_possession).to.deep.equal({ mechanism: 'mtls', required: true, }); - return Promise.resolve({ data }); + return Promise.resolve(data); }, - delete: () => Promise.resolve({ data: [] }), - getAll: (params) => + delete: () => Promise.resolve([]), + list: (params) => mockPagedData(params, 'resource_servers', [ { id: 'rs1', identifier: 'some-api', name: 'someAPI' }, ]), @@ -317,18 +317,18 @@ describe('#resourceServers handler', () => { const auth0 = { resourceServers: { create: () => Promise.resolve([]), - update: function (params, data) { - expect(params).to.be.an('object'); + update: function (id, data) { + expect(id).to.be.a('string'); expect(data).to.be.an('object'); - expect(params.id).to.equal('rs1'); + expect(id).to.equal('rs1'); expect(data.proof_of_possession).to.deep.equal({ mechanism: 'dpop', required: false, }); - return Promise.resolve({ data }); + return Promise.resolve(data); }, - delete: () => Promise.resolve({ data: [] }), - getAll: (params) => + delete: () => Promise.resolve([]), + list: (params) => mockPagedData(params, 'resource_servers', [ { id: 'rs1', identifier: 'some-api', name: 'someAPI' }, ]), @@ -364,16 +364,16 @@ describe('#resourceServers handler', () => { expect(data.name).to.equal('someAPI'); expect(data.scope).to.equal('new:scope'); expect(data.identifier).to.equal('another-api'); - return Promise.resolve({ data }); + return Promise.resolve(data); }, - update: function (params, data) { + update: function (id, data) { (() => expect(this).to.not.be.undefined)(); - expect(params).to.be('undefined'); + expect(id).to.be('undefined'); expect(data).to.be('undefined'); - return Promise.resolve({ data }); + return Promise.resolve(data); }, delete: () => Promise.resolve([]), - getAll: (params) => + list: (params) => mockPagedData(params, 'resource_servers', [ { id: 'rs1', identifier: 'some-api', name: 'someAPI' }, ]), @@ -393,11 +393,11 @@ describe('#resourceServers handler', () => { const auth0 = { resourceServers: { create: () => Promise.resolve([]), - update: function (params, data) { + update: function (id, data) { (() => expect(this).to.not.be.undefined)(); - expect(params).to.be.an('object'); + expect(id).to.be.a('string'); expect(data).to.be.an('object'); - expect(params.id).to.equal('rs1'); + expect(id).to.equal('rs1'); expect(data.subject_type_authorization).to.deep.equal({ user: { policy: 'allow_all', @@ -406,10 +406,10 @@ describe('#resourceServers handler', () => { policy: 'require_client_grant', }, }); - return Promise.resolve({ data }); + return Promise.resolve(data); }, - delete: () => Promise.resolve({ data: [] }), - getAll: (params) => + delete: () => Promise.resolve([]), + list: (params) => mockPagedData(params, 'resource_servers', [ { id: 'rs1', identifier: 'some-api', name: 'advancedAPI' }, ]), @@ -446,11 +446,11 @@ describe('#resourceServers handler', () => { create: () => Promise.resolve([]), update: () => Promise.resolve([]), delete: (data) => { - expect(data).to.be.an('object'); - expect(data.id).to.equal('rs1'); - return Promise.resolve({ data }); + expect(data).to.be.a('string'); + expect(data).to.equal('rs1'); + return Promise.resolve(data); }, - getAll: (params) => + list: (params) => mockPagedData(params, 'resource_servers', [ { id: 'rs1', identifier: 'some-api', name: 'someAPI' }, ]), @@ -468,15 +468,15 @@ describe('#resourceServers handler', () => { let removed = false; const auth0 = { resourceServers: { - create: () => Promise.resolve({ data: [] }), - update: () => Promise.resolve({ data: [] }), + create: () => Promise.resolve([]), + update: () => Promise.resolve([]), delete: (data) => { - expect(data).to.be.an('object'); - expect(data.id).to.equal('rs1'); + expect(data).to.be.a('string'); + expect(data).to.equal('rs1'); removed = true; - return Promise.resolve({ data }); + return Promise.resolve(data); }, - getAll: (params) => + list: (params) => mockPagedData(params, 'resource_servers', [ { id: 'rs1', identifier: 'some-api', name: 'someAPI' }, ]), @@ -499,15 +499,15 @@ describe('#resourceServers handler', () => { let removed = false; const auth0 = { resourceServers: { - create: () => Promise.resolve({ data: [] }), - update: () => Promise.resolve({ data: [] }), + create: () => Promise.resolve([]), + update: () => Promise.resolve([]), delete: (data) => { - expect(data).to.be.an('object'); - expect(data.id).to.equal('rs1'); + expect(data).to.be.a('string'); + expect(data).to.equal('rs1'); removed = true; - return Promise.resolve({ data }); + return Promise.resolve(data); }, - getAll: (params) => + list: (params) => mockPagedData(params, 'resource_servers', [ { id: 'rs1', identifier: 'some-api', name: 'someAPI' }, ]), @@ -529,13 +529,13 @@ describe('#resourceServers handler', () => { update: function (data) { (() => expect(this).to.not.be.undefined)(); expect(data).to.be.an('undefined'); - return Promise.resolve({ data }); + return Promise.resolve(data); }, delete: (data) => { expect(data).to.be.an('undefined'); - return Promise.resolve({ data }); + return Promise.resolve(data); }, - getAll: (params) => + list: (params) => mockPagedData(params, 'resource_servers', [ { id: 'rs1', identifier: 'some-api', name: 'someAPI' }, { id: 'rs2', identifier: 'some-other-api', name: 'someOtherAPI' }, @@ -567,17 +567,17 @@ describe('#resourceServers handler', () => { const auth0 = { resourceServers: { - create: () => Promise.resolve({ data: [] }), - update: function (params, data) { + create: () => Promise.resolve([]), + update: function (id, data) { updateCalled = true; expect(data.client_id).to.be.equals(undefined); expect(data.name).to.equal('someAPI'); // identifier is also stripped as it's readonly - expect(params.id).to.equal('rs1'); // ID should be in params - return Promise.resolve({ data }); + expect(id).to.equal('rs1'); + return Promise.resolve(data); }, - delete: () => Promise.resolve({ data: [] }), - getAll: (params) => mockPagedData(params, 'resourceServers', [existingResourceServer]), + delete: () => Promise.resolve([]), + list: (params) => mockPagedData(params, 'resourceServers', [existingResourceServer]), }, pool, }; @@ -608,7 +608,7 @@ describe('#resourceServers handler', () => { const auth0 = { resourceServers: { - getAll: (params) => mockPagedData(params, 'resourceServers', [resourceServerWithClient]), + list: (params) => mockPagedData(params, 'resourceServers', [resourceServerWithClient]), }, pool, }; @@ -639,7 +639,7 @@ describe('#resourceServers handler', () => { const auth0 = { resourceServers: { - getAll: (params) => mockPagedData(params, 'resourceServers', [systemResourceServer]), + list: (params) => mockPagedData(params, 'resource_servers', [systemResourceServer]), }, pool, }; @@ -670,16 +670,16 @@ describe('#resourceServers handler', () => { const auth0 = { resourceServers: { create: () => Promise.resolve({ data: [] }), - update: function (params, data) { + update: function (id, data) { updateCalled = true; - expect(params.id).to.equal('rs_my_account'); + expect(id).to.equal('rs_my_account'); expect(data.name).to.equal(undefined); expect(data.is_system).to.equal(undefined); expect(data.token_lifetime).to.equal(54321); return Promise.resolve({ data }); }, delete: () => Promise.resolve({ data: [] }), - getAll: (params) => mockPagedData(params, 'resourceServers', [existingResourceServer]), + list: (params) => mockPagedData(params, 'resource_servers', [existingResourceServer]), }, pool, }; diff --git a/test/tools/auth0/handlers/roles.tests.js b/test/tools/auth0/handlers/roles.tests.js index 450df6be9..3b6143aae 100644 --- a/test/tools/auth0/handlers/roles.tests.js +++ b/test/tools/auth0/handlers/roles.tests.js @@ -66,25 +66,24 @@ describe('#roles handler', () => { expect(data).to.be.an('object'); expect(data.name).to.equal('myRole'); expect(data.description).to.equal('myDescription'); - return Promise.resolve({ data }); + return Promise.resolve(data); }, - update: () => Promise.resolve({ data: [] }), - delete: () => Promise.resolve({ data: [] }), - getAll: (params) => mockPagedData(params, 'roles', []), + update: () => Promise.resolve([]), + delete: () => Promise.resolve([]), + list: (params) => mockPagedData(params, 'roles', []), permissions: { - getAll: () => + list: () => Promise.resolve([ { permission_name: 'Create:cal_entry', resource_server_identifier: 'organise' }, ]), - create: (params, data) => { - expect(params).to.be.an('object'); - expect(params.id).to.equal('myRoleId'); + add: (roleId, data) => { + expect(roleId).to.be.a('string'); + expect(roleId).to.equal('myRoleId'); expect(data).to.be.an('object'); expect(data.permissions).to.not.equal(null); expect(data.permissions).to.be.an('Array'); - return Promise.resolve({ data: data.permissions }); + return Promise.resolve(data.permissions); }, - update: Promise.resolve({ data: [] }), }, }, pool, @@ -113,7 +112,7 @@ describe('#roles handler', () => { const auth0 = { roles: { - getAll: (params) => + list: (params) => mockPagedData({ ...params, include_totals: true }, 'roles', [ { name: 'myRole', @@ -121,8 +120,10 @@ describe('#roles handler', () => { description: 'myDescription', }, ]), - getPermissions: (params) => - mockPagedData({ ...params, include_totals: true }, 'permissions', permissions), + permissions: { + list: (roleId, params) => + mockPagedData({ ...params, include_totals: true }, 'permissions', permissions), + }, }, pool, }; @@ -145,7 +146,7 @@ describe('#roles handler', () => { it('should return an empty array for 501 status code', async () => { const auth0 = { roles: { - getAll: () => { + list: () => { const error = new Error('Feature is not yet implemented'); error.statusCode = 501; throw error; @@ -162,7 +163,7 @@ describe('#roles handler', () => { it('should return an empty array for 404 status code', async () => { const auth0 = { roles: { - getAll: () => { + list: () => { const error = new Error('Not found'); error.statusCode = 404; throw error; @@ -179,7 +180,7 @@ describe('#roles handler', () => { it('should throw an error for all other failed requests', async () => { const auth0 = { roles: { - getAll: () => { + list: () => { const error = new Error('Bad request'); error.statusCode = 500; throw error; @@ -203,20 +204,20 @@ describe('#roles handler', () => { (() => expect(this).to.not.be.undefined)(); expect(data).to.be.an('object'); expect(data.length).to.equal(0); - return Promise.resolve({ data }); + return Promise.resolve(data); }, - update: function (params, data) { + update: function (id, data) { (() => expect(this).to.not.be.undefined)(); - expect(params).to.be.an('object'); - expect(params.id).to.equal('myRoleId'); + expect(id).to.be.a('string'); + expect(id).to.equal('myRoleId'); expect(data).to.be.an('object'); expect(data.name).to.equal('myRole'); expect(data.description).to.equal('myDescription'); - return Promise.resolve({ data }); + return Promise.resolve(data); }, - delete: () => Promise.resolve({ data: [] }), - getAll: (params) => + delete: () => Promise.resolve([]), + list: (params) => mockPagedData(params, 'roles', [ { name: 'myRole', @@ -224,22 +225,24 @@ describe('#roles handler', () => { description: 'myDescription', }, ]), - getPermissions: (params) => - mockPagedData(params, 'permissions', [ - { - permission_name: 'Create:cal_entry', - resource_server_identifier: 'organise', - }, - ]), - deletePermissions: function (params) { - expect(params).to.be.an('object'); - expect(params.id).to.equal('myRoleId'); - return Promise.resolve({ data: [] }); - }, - addPermissions: function (params) { - expect(params).to.be.an('object'); - expect(params.id).to.equal('myRoleId'); - return Promise.resolve({ data: [] }); + permissions: { + list: (roleId, params) => + mockPagedData(params, 'permissions', [ + { + permission_name: 'Create:cal_entry', + resource_server_identifier: 'organise', + }, + ]), + delete: function (roleId, _data) { + expect(roleId).to.be.a('string'); + expect(roleId).to.equal('myRoleId'); + return Promise.resolve([]); + }, + add: function (roleId, _data) { + expect(roleId).to.be.a('string'); + expect(roleId).to.equal('myRoleId'); + return Promise.resolve([]); + }, }, }, pool, @@ -270,14 +273,14 @@ describe('#roles handler', () => { it('should delete role', async () => { const auth0 = { roles: { - create: () => Promise.resolve({ data: [] }), - update: () => Promise.resolve({ data: [] }), - delete: (data) => { - expect(data).to.be.an('object'); - expect(data.id).to.equal('myRoleId'); - return Promise.resolve({ data }); + create: () => Promise.resolve([]), + update: () => Promise.resolve([]), + delete: (id) => { + expect(id).to.be.a('string'); + expect(id).to.equal('myRoleId'); + return Promise.resolve({}); }, - getAll: (params) => + list: (params) => mockPagedData(params, 'roles', [ { name: 'myRole', @@ -285,7 +288,9 @@ describe('#roles handler', () => { description: 'myDescription', }, ]), - getPermissions: (params) => mockPagedData(params, 'permissions', []), + permissions: { + list: (roleId, params) => mockPagedData(params, 'permissions', []), + }, }, pool, }; diff --git a/test/tools/auth0/handlers/scimHandler.tests.js b/test/tools/auth0/handlers/scimHandler.tests.js index 9d18f66e6..5e1cbb22f 100644 --- a/test/tools/auth0/handlers/scimHandler.tests.js +++ b/test/tools/auth0/handlers/scimHandler.tests.js @@ -26,10 +26,12 @@ describe('ScimHandler', () => { getAll: sinon.stub(), update: sinon.stub(), create: sinon.stub(), - getScimConfiguration: sinon.stub(), - createScimConfiguration: sinon.stub(), - deleteScimConfiguration: sinon.stub(), - updateScimConfiguration: sinon.stub(), + scimConfiguration: { + get: sinon.stub(), + create: sinon.stub(), + update: sinon.stub(), + delete: sinon.stub(), + }, }; handler = new ScimHandler(mockConfig, mockConnectionsManager, mockPoolClient); }); @@ -70,7 +72,7 @@ describe('ScimHandler', () => { user_id_attribute: response.user_id_attribute, }; - handler.getScimConfiguration = sinon.stub().resolves({ data: response }); + handler.getScimConfiguration = sinon.stub().resolves(response); await handler.createIdMap(connections); expect(handler.idMap.size).to.equal(1); expect(handler.idMap.get('con_kzpLY0Afi4I8lvwM')).to.have.property('strategy', 'samlp'); @@ -133,6 +135,7 @@ describe('ScimHandler', () => { it('should not modify connections if idMap is empty', async () => { const connections = [{ id: 'con_kzpLY0Afi4I8lvwM', strategy: 'samlp' }]; + mockConnectionsManager.scimConfiguration.get.resolves(null); await handler.applyScimConfiguration(connections); expect(connections[0]).to.not.have.property('scim_configuration'); }); @@ -319,7 +322,7 @@ describe('ScimHandler', () => { it('should create SCIM configuration when creating connection', async () => { const bodyParams = { scim_configuration: { mapping: [], user_id_attribute: 'id' } }; - mockConnectionsManager.create.resolves({ data: { id: 'con_kzpLY0Afi4I8lvwM' } }); + mockConnectionsManager.create.resolves({ id: 'con_kzpLY0Afi4I8lvwM' }); handler.createScimConfiguration = sinon.stub().resolves({ id: 'con_kzpLY0Afi4I8lvwM' }); await handler.createOverride(bodyParams); diff --git a/test/tools/auth0/handlers/selfServiceProfiles.tests.js b/test/tools/auth0/handlers/selfServiceProfiles.tests.js index 0a823a4da..dbf4ce22b 100644 --- a/test/tools/auth0/handlers/selfServiceProfiles.tests.js +++ b/test/tools/auth0/handlers/selfServiceProfiles.tests.js @@ -154,11 +154,11 @@ describe('#selfServiceProfiles handler', () => { expect(data.user_attributes).to.be.an('array'); expect(data.allowed_strategies).to.be.an('array'); expect(data.branding).to.be.an('object'); - return Promise.resolve({ data }); + return Promise.resolve(data); }, - update: () => Promise.resolve({ data: [] }), - delete: () => Promise.resolve({ data: [] }), - getAll: (params) => mockPagedData(params, 'selfServiceProfiles', []), + update: () => Promise.resolve([]), + delete: () => Promise.resolve([]), + list: (params) => mockPagedData(params, 'selfServiceProfiles', []), }, userAttributeProfiles: { getAll: (params) => mockPagedData(params, 'userAttributeProfiles', []), @@ -183,18 +183,20 @@ describe('#selfServiceProfiles handler', () => { (() => expect(this).to.not.be.undefined)(); expect(data).to.be.an('object'); expect(data.name).to.equal(sampleSsProfileWithCustomText.name); - return Promise.resolve({ data }); + return Promise.resolve(data); }, - update: () => Promise.resolve({ data: [] }), - delete: () => Promise.resolve({ data: [] }), - getAll: (params) => mockPagedData(params, 'selfServiceProfiles', []), - updateCustomText: (params, data) => { - expect(params).to.be.an('object'); - expect(data).to.be.an('object'); - expect(params.language).to.equal('en'); - expect(params.page).to.equal('get-started'); - expect(data).to.deep.equal(sampleCustomText); - return Promise.resolve({ data: sampleCustomText }); + update: () => Promise.resolve([]), + delete: () => Promise.resolve([]), + list: (params) => mockPagedData(params, 'selfServiceProfiles', []), + customText: { + set: (sspId, language, page, data) => { + expect(sspId).to.be.a('string'); + expect(language).to.equal('en'); + expect(page).to.equal('get-started'); + expect(data).to.be.an('object'); + expect(data).to.deep.equal(sampleCustomText); + return Promise.resolve(sampleCustomText); + }, }, }, userAttributeProfiles: { @@ -216,10 +218,14 @@ describe('#selfServiceProfiles handler', () => { it('should get selfServiceProfiles', async () => { const auth0 = { selfServiceProfiles: { - getAll: (params) => mockPagedData(params, 'selfServiceProfiles', [sampleSsProfileWithId]), - getCustomText: (params) => { - expect(params).to.be.an('object'); - return Promise.resolve({ data: [] }); + list: (params) => mockPagedData(params, 'selfServiceProfiles', [sampleSsProfileWithId]), + customText: { + list: (sspId, language, page) => { + expect(sspId).to.be.a('string'); + expect(language).to.equal('en'); + expect(page).to.equal('get-started'); + return Promise.resolve({}); + }, }, }, userAttributeProfiles: { @@ -244,12 +250,14 @@ describe('#selfServiceProfiles handler', () => { }; const auth0 = { selfServiceProfiles: { - getAll: (params) => mockPagedData(params, 'selfServiceProfiles', [sampleSsProfileWithId]), - getCustomText: (params) => { - expect(params).to.be.an('object'); - return Promise.resolve({ - data: sampleCustomText, - }); + list: (params) => mockPagedData(params, 'selfServiceProfiles', [sampleSsProfileWithId]), + customText: { + list: (sspId, language, page) => { + expect(sspId).to.be.a('string'); + expect(language).to.equal('en'); + expect(page).to.equal('get-started'); + return Promise.resolve(sampleCustomText); + }, }, }, userAttributeProfiles: { @@ -272,21 +280,25 @@ describe('#selfServiceProfiles handler', () => { const auth0 = { selfServiceProfiles: { - update: function (params, data) { + update: function (id, data) { (() => expect(this).to.not.be.undefined)(); - expect(params).to.be.an('object'); - expect(params.id).to.equal(sampleSsProfileWithId.id); + expect(id).to.be.a('string'); + expect(id).to.equal(sampleSsProfileWithId.id); expect(data).to.be.an('object'); expect(data.name).to.equal(sampleFormUpdated.name); - return Promise.resolve({ data }); + return Promise.resolve(data); }, - getAll: (params) => mockPagedData(params, 'selfServiceProfiles', [sampleSsProfileWithId]), - getCustomText: (params) => { - expect(params).to.be.an('object'); - return Promise.resolve({ - data: sampleCustomText, - }); + list: (params) => mockPagedData(params, 'selfServiceProfiles', [sampleSsProfileWithId]), + customText: { + list: (sspId, language, page) => { + expect(sspId).to.be.a('string'); + expect(language).to.equal('en'); + expect(page).to.equal('get-started'); + return Promise.resolve({ + data: sampleCustomText, + }); + }, }, }, userAttributeProfiles: { @@ -320,32 +332,34 @@ describe('#selfServiceProfiles handler', () => { const auth0 = { selfServiceProfiles: { - update: function (params, data) { + update: function (id, data) { (() => expect(this).to.not.be.undefined)(); - expect(params).to.be.an('object'); - expect(params.id).to.equal(sampleSsProfileWithId.id); + expect(id).to.be.a('string'); + expect(id).to.equal(sampleSsProfileWithId.id); expect(data).to.be.an('object'); expect(data.name).to.equal(sampleFormUpdated.name); - return Promise.resolve({ data }); - }, - getAll: (params) => mockPagedData(params, 'selfServiceProfiles', [sampleSsProfileWithId]), - getCustomText: (params) => { - expect(params).to.be.an('object'); - return Promise.resolve({ - data: {}, - }); + return Promise.resolve(data); }, - updateCustomText: (params, data) => { - expect(params).to.be.an('object'); - expect(data).to.be.an('object'); - expect(params.language).to.equal('en'); - expect(params.page).to.equal('get-started'); - expect(data).to.deep.equal({ - introduction: 'Welcome!

Updated introduction

', - }); - return Promise.resolve({ - data, - }); + list: (params) => mockPagedData(params, 'selfServiceProfiles', [sampleSsProfileWithId]), + customText: { + list: (sspId, language, page) => { + expect(sspId).to.be.a('string'); + expect(language).to.equal('en'); + expect(page).to.equal('get-started'); + return Promise.resolve({ + data: {}, + }); + }, + set: (sspId, language, page, data) => { + expect(sspId).to.be.a('string'); + expect(language).to.equal('en'); + expect(page).to.equal('get-started'); + expect(data).to.be.an('object'); + expect(data).to.deep.equal({ + introduction: 'Welcome!

Updated introduction

', + }); + return Promise.resolve(data); + }, }, }, userAttributeProfiles: { @@ -378,20 +392,24 @@ describe('#selfServiceProfiles handler', () => { (() => expect(this).to.not.be.undefined)(); expect(data).to.be.an('object'); expect(data.name).to.equal(sampleFormNew.name); - return Promise.resolve({ data }); + return Promise.resolve(data); }, - delete: function (params) { + delete: function (id) { (() => expect(this).to.not.be.undefined)(); - expect(params).to.be.an('object'); - expect(params.id).to.equal(sampleSsProfileWithId.id); - return Promise.resolve({ data: [] }); + expect(id).to.be.a('string'); + expect(id).to.equal(sampleSsProfileWithId.id); + return Promise.resolve([]); }, - getAll: (params) => mockPagedData(params, 'selfServiceProfiles', [sampleSsProfileWithId]), - getCustomText: (params) => { - expect(params).to.be.an('object'); - return Promise.resolve({ - data: {}, - }); + list: (params) => mockPagedData(params, 'selfServiceProfiles', [sampleSsProfileWithId]), + customText: { + list: (sspId, language, page) => { + expect(sspId).to.be.a('string'); + expect(language).to.equal('en'); + expect(page).to.equal('get-started'); + return Promise.resolve({ + data: {}, + }); + }, }, }, userAttributeProfiles: { @@ -410,17 +428,21 @@ describe('#selfServiceProfiles handler', () => { let removed = false; const auth0 = { selfServiceProfiles: { - delete: (params) => { + delete: (id) => { removed = true; - expect(params).to.be.an('object'); - return Promise.resolve({ data: [] }); + expect(id).to.be.a('string'); + return Promise.resolve([]); }, - getAll: (params) => mockPagedData(params, 'selfServiceProfiles', [sampleSsProfileWithId]), - getCustomText: (params) => { - expect(params).to.be.an('object'); - return Promise.resolve({ - data: {}, - }); + list: (params) => mockPagedData(params, 'selfServiceProfiles', [sampleSsProfileWithId]), + customText: { + list: (sspId, language, page) => { + expect(sspId).to.be.a('string'); + expect(language).to.equal('en'); + expect(page).to.equal('get-started'); + return Promise.resolve({ + data: {}, + }); + }, }, }, userAttributeProfiles: { @@ -440,16 +462,20 @@ describe('#selfServiceProfiles handler', () => { config.data.AUTH0_ALLOW_DELETE = false; const auth0 = { selfServiceProfiles: { - delete: (params) => { - expect(params).to.be.an('undefined'); - return Promise.resolve({ data: [] }); + delete: (id) => { + expect(id).to.be.an('undefined'); + return Promise.resolve([]); }, - getAll: (params) => mockPagedData(params, 'selfServiceProfiles', [sampleSsProfileWithId]), - getCustomText: (params) => { - expect(params).to.be.an('object'); - return Promise.resolve({ - data: {}, - }); + list: (params) => mockPagedData(params, 'selfServiceProfiles', [sampleSsProfileWithId]), + customText: { + list: (sspId, language, page) => { + expect(sspId).to.be.a('string'); + expect(language).to.equal('en'); + expect(page).to.equal('get-started'); + return Promise.resolve({ + data: {}, + }); + }, }, }, userAttributeProfiles: { @@ -471,19 +497,16 @@ describe('#selfServiceProfiles handler', () => { user_attribute_profile_id: sampleUAP.name, user_attributes: undefined, }; + const auth0 = { selfServiceProfiles: { delete: (params) => { expect(params).to.be.an('undefined'); return Promise.resolve({ data: [] }); }, - getAll: (params) => - mockPagedData(params, 'selfServiceProfiles', [sspWithUserAttributesId]), - getCustomText: (params) => { - expect(params).to.be.an('object'); - return Promise.resolve({ - data: {}, - }); + list: (params) => mockPagedData(params, 'selfServiceProfiles', [sspWithUserAttributesId]), + customText: { + list: () => Promise.resolve({}), }, update: async (params, data) => { expect(data.user_attribute_profile_id).to.equal(sampleUAP.id); @@ -491,7 +514,7 @@ describe('#selfServiceProfiles handler', () => { }, }, userAttributeProfiles: { - getAll: (params) => mockPagedData(params, 'userAttributeProfiles', [sampleUAP]), + list: (params) => mockPagedData(params, 'userAttributeProfiles', [sampleUAP]), }, pool, }; @@ -514,16 +537,13 @@ describe('#selfServiceProfiles handler', () => { expect(params).to.be.an('undefined'); return Promise.resolve({ data: [] }); }, - getAll: (params) => mockPagedData(params, 'selfServiceProfiles', [sspWithBoth]), - getCustomText: (params) => { - expect(params).to.be.an('object'); - return Promise.resolve({ - data: {}, - }); + list: (params) => mockPagedData(params, 'selfServiceProfiles', [sspWithBoth]), + customText: { + list: () => Promise.resolve({}), }, }, userAttributeProfiles: { - getAll: (params) => mockPagedData(params, 'userAttributeProfiles', [sampleUAP]), + list: (params) => mockPagedData(params, 'userAttributeProfiles', [sampleUAP]), }, pool, }; @@ -552,10 +572,10 @@ describe('#selfServiceProfiles handler', () => { }, update: () => Promise.resolve({ data: [] }), delete: () => Promise.resolve({ data: [] }), - getAll: (params) => mockPagedData(params, 'selfServiceProfiles', []), + list: (params) => mockPagedData(params, 'selfServiceProfiles', []), }, userAttributeProfiles: { - getAll: () => { + list: () => { expect.fail('userAttributeProfiles.getAll should not be called'); }, }, diff --git a/test/tools/auth0/handlers/tenant.tests.ts b/test/tools/auth0/handlers/tenant.tests.ts index 873facb66..defec9664 100644 --- a/test/tools/auth0/handlers/tenant.tests.ts +++ b/test/tools/auth0/handlers/tenant.tests.ts @@ -31,8 +31,8 @@ describe('#tenant handler', () => { it('should get tenant', async () => { const auth0 = { tenants: { - getSettings: () => ({ - data: { + settings: { + get: () => ({ friendly_name: 'Test', default_directory: 'users', flags: { @@ -40,8 +40,8 @@ describe('#tenant handler', () => { 'unallowed-flag-1': false, 'unallowed-flag-2': true, }, - }, - }), + }), + }, }, }; @@ -59,19 +59,19 @@ describe('#tenant handler', () => { it('should update tenant settings', async () => { const auth0 = { tenants: { - getSettings: () => ({ - data: { + settings: { + get: () => ({ friendly_name: 'Test', default_directory: 'users', skip_non_verifiable_callback_uri_confirmation_prompt: true, + }), + update: (data) => { + expect(data).to.be.an('object'); + expect(data.sandbox_version).to.equal('4'); + expect(data.skip_non_verifiable_callback_uri_confirmation_prompt).to.equal(null); + expect(data.flags).to.equal(undefined); + return Promise.resolve(data); }, - }), - updateSettings: (data) => { - expect(data).to.be.an('object'); - expect(data.sandbox_version).to.equal('4'); - expect(data.skip_non_verifiable_callback_uri_confirmation_prompt).to.equal(null); - expect(data.flags).to.equal(undefined); - return Promise.resolve(data); }, }, }; @@ -112,27 +112,29 @@ describe('#tenant handler', () => { let wasUpdateCalled = false; const auth0 = { tenants: { - getSettings: () => ({ data: {} }), - updateSettings: function (data) { - wasUpdateCalled = true; - expect(data).to.be.an('object'); - expect(data.default_token_quota).to.deep.equal({ - clients: { - client_credentials: { - enforce: true, - per_day: 2000, - per_hour: 200, + settings: { + get: () => ({}), + update: function (data) { + wasUpdateCalled = true; + expect(data).to.be.an('object'); + expect(data.default_token_quota).to.deep.equal({ + clients: { + client_credentials: { + enforce: true, + per_day: 2000, + per_hour: 200, + }, }, - }, - organizations: { - client_credentials: { - enforce: false, - per_day: 1000, - per_hour: 100, + organizations: { + client_credentials: { + enforce: false, + per_day: 1000, + per_hour: 100, + }, }, - }, - }); - return Promise.resolve(data); + }); + return Promise.resolve(data); + }, }, }, }; @@ -155,13 +157,15 @@ describe('#tenant handler', () => { const auth0 = { tenants: { - updateSettings: (data) => { - expect(data).to.be.an('object'); - expect(data.flags).to.deep.equal({ - require_pushed_authorization_requests: true, - mfa_show_factor_list_on_enrollment: false, - }); - return Promise.resolve(data); + settings: { + update: (data) => { + expect(data).to.be.an('object'); + expect(data.flags).to.deep.equal({ + require_pushed_authorization_requests: true, + mfa_show_factor_list_on_enrollment: false, + }); + return Promise.resolve(data); + }, }, }, }; @@ -180,10 +184,12 @@ describe('#tenant handler', () => { const auth0 = { tenants: { - updateSettings: (data) => { - expect(data).to.be.an('object'); - expect(data.flags).to.be.undefined; - return Promise.resolve({ data }); + settings: { + update: (data) => { + expect(data).to.be.an('object'); + expect(data.flags).to.be.undefined; + return Promise.resolve(data); + }, }, }, }; diff --git a/test/tools/auth0/handlers/themes.tests.js b/test/tools/auth0/handlers/themes.tests.js index 08e817de1..d9a0e0b8e 100644 --- a/test/tools/auth0/handlers/themes.tests.js +++ b/test/tools/auth0/handlers/themes.tests.js @@ -130,7 +130,9 @@ describe('#themes handler', () => { const auth0 = { branding: { - getDefaultTheme: stub().returns(Promise.resolve({ data: theme })), + themes: { + getDefault: stub().returns(Promise.resolve(theme)), + }, }, }; @@ -138,14 +140,16 @@ describe('#themes handler', () => { const data = await handler.getType(); expect(data).to.deep.equal([theme]); - expect(auth0.branding.getDefaultTheme.called).to.equal(true); - expect(auth0.branding.getDefaultTheme.callCount).to.equal(1); + expect(auth0.branding.themes.getDefault.called).to.equal(true); + expect(auth0.branding.themes.getDefault.callCount).to.equal(1); }); it('should return empty array if there is no theme', async () => { const auth0 = { branding: { - getDefaultTheme: stub().returns(Promise.reject(errorWithStatusCode(404))), + themes: { + getDefault: stub().returns(Promise.reject(errorWithStatusCode(404))), + }, }, }; @@ -153,21 +157,23 @@ describe('#themes handler', () => { const data = await handler.getType(); expect(data).to.deep.equal([]); - expect(auth0.branding.getDefaultTheme.called).to.equal(true); - expect(auth0.branding.getDefaultTheme.callCount).to.equal(1); + expect(auth0.branding.themes.getDefault.called).to.equal(true); + expect(auth0.branding.themes.getDefault.callCount).to.equal(1); }); it('should return empty array when no-code is not enabled for the tenant', async () => { const auth0 = { branding: { - getDefaultTheme: stub().returns( - Promise.reject( - errorWithStatusCode( - 400, - 'Your account does not have universal login customizations enabled' + themes: { + getDefault: stub().returns( + Promise.reject( + errorWithStatusCode( + 400, + 'Your account does not have universal login customizations enabled' + ) ) - ) - ), + ), + }, }, }; @@ -175,23 +181,25 @@ describe('#themes handler', () => { const data = await handler.getType(); expect(data).to.deep.equal(null); - expect(auth0.branding.getDefaultTheme.called).to.equal(true); - expect(auth0.branding.getDefaultTheme.callCount).to.equal(1); + expect(auth0.branding.themes.getDefault.called).to.equal(true); + expect(auth0.branding.themes.getDefault.callCount).to.equal(1); }); it('should fail for unexpected api errors', async () => { const auth0 = { branding: { - getDefaultTheme: stub().returns( - Promise.reject(errorWithStatusCode(500, 'Unexpected error')) - ), + themes: { + getDefault: stub().returns( + Promise.reject(errorWithStatusCode(500, 'Unexpected error')) + ), + }, }, }; const handler = new ThemesHandler({ client: auth0 }); await expect(handler.getType()).to.be.rejectedWith('Unexpected error'); - expect(auth0.branding.getDefaultTheme.called).to.equal(true); - expect(auth0.branding.getDefaultTheme.callCount).to.equal(1); + expect(auth0.branding.themes.getDefault.called).to.equal(true); + expect(auth0.branding.themes.getDefault.callCount).to.equal(1); }); }); @@ -201,14 +209,12 @@ describe('#themes handler', () => { const auth0 = { branding: { - getDefaultTheme: stub().returns(Promise.reject(errorWithStatusCode(404))), - createTheme: stub().returns(Promise.resolve(theme)), - updateTheme: stub().returns( - Promise.reject(new Error('updateTheme should not have been called')) - ), - deleteTheme: stub().returns( - Promise.reject(new Error('deleteTheme should not have been called')) - ), + themes: { + getDefault: stub().returns(Promise.reject(errorWithStatusCode(404))), + create: stub().returns(Promise.resolve(theme)), + update: stub().returns(Promise.reject(new Error('update should not have been called'))), + delete: stub().returns(Promise.reject(new Error('delete should not have been called'))), + }, }, }; @@ -217,13 +223,13 @@ describe('#themes handler', () => { await handler.processChanges(assets); - expect(auth0.branding.getDefaultTheme.called).to.equal(true); - expect(auth0.branding.getDefaultTheme.callCount).to.equal(1); - expect(auth0.branding.createTheme.called).to.equal(true); - expect(auth0.branding.createTheme.callCount).to.equal(1); - expect(auth0.branding.createTheme.calledWith(theme)).to.equal(true); - expect(auth0.branding.updateTheme.called).to.equal(false); - expect(auth0.branding.deleteTheme.called).to.equal(false); + expect(auth0.branding.themes.getDefault.called).to.equal(true); + expect(auth0.branding.themes.getDefault.callCount).to.equal(1); + expect(auth0.branding.themes.create.called).to.equal(true); + expect(auth0.branding.themes.create.callCount).to.equal(1); + expect(auth0.branding.themes.create.calledWith(theme)).to.equal(true); + expect(auth0.branding.themes.update.called).to.equal(false); + expect(auth0.branding.themes.delete.called).to.equal(false); }); it('should create the theme when default exists', async () => { @@ -231,14 +237,12 @@ describe('#themes handler', () => { const auth0 = { branding: { - getDefaultTheme: stub().returns({ data: theme }), - createTheme: stub().returns( - Promise.reject(new Error('updateTheme should not have been called')) - ), - updateTheme: stub().returns(Promise.resolve(theme)), - deleteTheme: stub().returns( - Promise.reject(new Error('deleteTheme should not have been called')) - ), + themes: { + getDefault: stub().returns(theme), + create: stub().returns(Promise.reject(new Error('create should not have been called'))), + update: stub().returns(Promise.resolve(theme)), + delete: stub().returns(Promise.reject(new Error('delete should not have been called'))), + }, }, }; @@ -247,15 +251,15 @@ describe('#themes handler', () => { await handler.processChanges(assets); - expect(auth0.branding.getDefaultTheme.called).to.equal(true); - expect(auth0.branding.getDefaultTheme.callCount).to.equal(1); - expect(auth0.branding.updateTheme.called).to.equal(true); - expect(auth0.branding.updateTheme.callCount).to.equal(1); + expect(auth0.branding.themes.getDefault.called).to.equal(true); + expect(auth0.branding.themes.getDefault.callCount).to.equal(1); + expect(auth0.branding.themes.update.called).to.equal(true); + expect(auth0.branding.themes.update.callCount).to.equal(1); expect( - auth0.branding.updateTheme.calledWith({ themeId: 'myThemeId' }, omit(theme, 'themeId')) + auth0.branding.themes.update.calledWith('myThemeId', omit(theme, 'themeId')) ).to.deep.equal(true); - expect(auth0.branding.createTheme.called).to.equal(false); - expect(auth0.branding.deleteTheme.called).to.equal(false); + expect(auth0.branding.themes.create.called).to.equal(false); + expect(auth0.branding.themes.delete.called).to.equal(false); }); }); @@ -267,14 +271,12 @@ describe('#themes handler', () => { const auth0 = { branding: { - getDefaultTheme: stub().returns(Promise.resolve({ data: theme })), - createTheme: stub().returns( - Promise.reject(new Error('createTheme should not have been called')) - ), - updateTheme: stub().returns( - Promise.reject(new Error('updateTheme should not have been called')) - ), - deleteTheme: stub().returns(Promise.resolve({ data: undefined })), + themes: { + getDefault: stub().returns(Promise.resolve(theme)), + create: stub().returns(Promise.reject(new Error('create should not have been called'))), + update: stub().returns(Promise.reject(new Error('update should not have been called'))), + delete: stub().returns(Promise.resolve(undefined)), + }, }, }; @@ -283,12 +285,12 @@ describe('#themes handler', () => { await handler.processChanges(assets); - expect(auth0.branding.getDefaultTheme.called).to.equal(true); - expect(auth0.branding.getDefaultTheme.callCount).to.equal(1); - expect(auth0.branding.deleteTheme.callCount).to.equal(1); - expect(auth0.branding.deleteTheme.calledWith({ themeId: 'delete-me' })).to.equal(true); - expect(auth0.branding.updateTheme.called).to.equal(false); - expect(auth0.branding.createTheme.called).to.equal(false); + expect(auth0.branding.themes.getDefault.called).to.equal(true); + expect(auth0.branding.themes.getDefault.callCount).to.equal(1); + expect(auth0.branding.themes.delete.callCount).to.equal(1); + expect(auth0.branding.themes.delete.calledWith('delete-me')).to.equal(true); + expect(auth0.branding.themes.update.called).to.equal(false); + expect(auth0.branding.themes.create.called).to.equal(false); }); it('should not delete the theme when AUTH0_ALLOW_DELETE: false', async () => { @@ -298,18 +300,14 @@ describe('#themes handler', () => { const auth0 = { branding: { - getDefaultTheme: stub().returns( - Promise.reject(new Error('getDefaultTheme should not have been called')) - ), - createTheme: stub().returns( - Promise.reject(new Error('createTheme should not have been called')) - ), - updateTheme: stub().returns( - Promise.reject(new Error('updateTheme should not have been called')) - ), - deleteTheme: stub().returns( - Promise.reject(new Error('deleteTheme should not have been called')) - ), + themes: { + getDefault: stub().returns( + Promise.reject(new Error('getDefault should not have been called')) + ), + create: stub().returns(Promise.reject(new Error('create should not have been called'))), + update: stub().returns(Promise.reject(new Error('update should not have been called'))), + delete: stub().returns(Promise.reject(new Error('delete should not have been called'))), + }, }, }; @@ -318,10 +316,10 @@ describe('#themes handler', () => { await handler.processChanges(assets); - expect(auth0.branding.getDefaultTheme.called).to.equal(false); - expect(auth0.branding.deleteTheme.called).to.equal(false); - expect(auth0.branding.updateTheme.called).to.equal(false); - expect(auth0.branding.createTheme.called).to.equal(false); + expect(auth0.branding.themes.getDefault.called).to.equal(false); + expect(auth0.branding.themes.delete.called).to.equal(false); + expect(auth0.branding.themes.update.called).to.equal(false); + expect(auth0.branding.themes.create.called).to.equal(false); }); }); diff --git a/test/tools/auth0/handlers/tokenExchangeProfiles.tests.js b/test/tools/auth0/handlers/tokenExchangeProfiles.tests.js new file mode 100644 index 000000000..02548970b --- /dev/null +++ b/test/tools/auth0/handlers/tokenExchangeProfiles.tests.js @@ -0,0 +1,694 @@ +import pageClient from '../../../../src/tools/auth0/client'; + +const { expect } = require('chai'); +const tokenExchangeProfiles = require('../../../../src/tools/auth0/handlers/tokenExchangeProfiles'); +const { mockPagedData } = require('../../../utils'); + +const pool = { + addEachTask: (data) => { + if (data.data && data.data.length) { + data.generator(data.data[0]); + } + return { promise: () => null }; + }, +}; + +describe('#tokenExchangeProfiles handler', () => { + const config = function (key) { + return config.data && config.data[key]; + }; + + config.data = { + AUTH0_CLIENT_ID: 'client_id', + AUTH0_ALLOW_DELETE: true, + }; + + describe('#tokenExchangeProfiles schema', () => { + it('should have valid schema', () => { + expect(tokenExchangeProfiles.schema).to.be.an('object'); + expect(tokenExchangeProfiles.schema.type).to.equal('array'); + expect(tokenExchangeProfiles.schema.items).to.be.an('object'); + expect(tokenExchangeProfiles.schema.items.required).to.include('name'); + expect(tokenExchangeProfiles.schema.items.required).to.include('subject_token_type'); + expect(tokenExchangeProfiles.schema.items.required).to.include('action'); + }); + }); + + describe('#tokenExchangeProfiles validate', () => { + it('should not allow same names', async () => { + const handler = new tokenExchangeProfiles.default({ client: {}, config }); + const stageFn = Object.getPrototypeOf(handler).validate; + const data = [ + { + name: 'CIS token exchange', + subject_token_type: 'https://acme.com/cis-token', + action: 'my-action', + type: 'custom_authentication', + }, + { + name: 'CIS token exchange', + subject_token_type: 'https://acme.com/other-token', + action: 'my-action', + type: 'custom_authentication', + }, + ]; + + try { + await stageFn.apply(handler, [{ tokenExchangeProfiles: data }]); + } catch (err) { + expect(err).to.be.an('object'); + expect(err.message).to.include('Names must be unique'); + } + }); + + it('should pass validation', async () => { + const handler = new tokenExchangeProfiles.default({ client: {}, config }); + const stageFn = Object.getPrototypeOf(handler).validate; + const data = [ + { + name: 'CIS token exchange', + subject_token_type: 'https://acme.com/cis-token', + action: 'my-action', + type: 'custom_authentication', + }, + ]; + + await stageFn.apply(handler, [{ tokenExchangeProfiles: data }]); + }); + }); + + describe('#tokenExchangeProfiles getType', () => { + it('should get token exchange profiles', async () => { + const auth0 = { + tokenExchangeProfiles: { + list: (params) => + mockPagedData({ ...params, include_totals: true }, 'tokenExchangeProfiles', [ + { + id: 'tep_123', + name: 'CIS token exchange', + subject_token_type: 'https://acme.com/cis-token', + action_id: 'action_123', + type: 'custom_authentication', + created_at: '2024-10-01T16:09:42.725Z', + updated_at: '2024-10-01T16:09:42.725Z', + }, + ]), + }, + actions: { + list: () => + Promise.resolve({ + data: [ + { + id: 'action_123', + name: 'my-action', + supported_triggers: [{ id: 'custom-token-exchange', version: 'v1' }], + }, + ], + }), + }, + pool, + }; + + const handler = new tokenExchangeProfiles.default({ client: pageClient(auth0), config }); + const data = await handler.getType(); + expect(data).to.be.an('array'); + expect(data).to.have.lengthOf(1); + expect(data[0].name).to.equal('CIS token exchange'); + expect(data[0].action).to.equal('my-action'); + expect(data[0].action_id).to.be.undefined; // Should be mapped to action name + }); + + it('should return an empty array for 403 status code', async () => { + const auth0 = { + tokenExchangeProfiles: { + list: () => { + const error = new Error('Feature not enabled'); + error.statusCode = 403; + throw error; + }, + }, + pool, + }; + + const handler = new tokenExchangeProfiles.default({ client: pageClient(auth0), config }); + const data = await handler.getType(); + expect(data).to.deep.equal([]); + }); + + it('should throw error for 404 status code', async () => { + const auth0 = { + tokenExchangeProfiles: { + list: () => { + const error = new Error('Not found'); + error.statusCode = 404; + throw error; + }, + }, + pool, + }; + + const handler = new tokenExchangeProfiles.default({ client: pageClient(auth0), config }); + try { + await handler.getType(); + expect.fail('Should have thrown an error'); + } catch (err) { + expect(err.message).to.equal('Not found'); + expect(err.statusCode).to.equal(404); + } + }); + + it('should throw error for 501 status code', async () => { + const auth0 = { + tokenExchangeProfiles: { + list: () => { + const error = new Error('Feature not implemented'); + error.statusCode = 501; + throw error; + }, + }, + pool, + }; + + const handler = new tokenExchangeProfiles.default({ client: pageClient(auth0), config }); + try { + await handler.getType(); + expect.fail('Should have thrown an error'); + } catch (err) { + expect(err.message).to.equal('Feature not implemented'); + expect(err.statusCode).to.equal(501); + } + }); + + it('should return empty array when profiles list is empty', async () => { + const auth0 = { + tokenExchangeProfiles: { + list: (params) => mockPagedData(params, 'tokenExchangeProfiles', []), + }, + actions: { + list: () => Promise.resolve({ data: [] }), + }, + pool, + }; + + const handler = new tokenExchangeProfiles.default({ client: pageClient(auth0), config }); + const data = await handler.getType(); + expect(data).to.deep.equal([]); + }); + + it('should propagate unexpected API errors', async () => { + const auth0 = { + tokenExchangeProfiles: { + list: () => { + throw new Error('Unexpected API error'); + }, + }, + pool, + }; + + const handler = new tokenExchangeProfiles.default({ client: pageClient(auth0), config }); + try { + await handler.getType(); + expect.fail('Should have thrown an error'); + } catch (err) { + expect(err.message).to.equal('Unexpected API error'); + } + }); + }); + + describe('#tokenExchangeProfiles process', () => { + it('should create token exchange profile', async () => { + const auth0 = { + tokenExchangeProfiles: { + create: function (data) { + (() => expect(this).to.not.be.undefined)(); + expect(data).to.be.an('object'); + expect(data.name).to.equal('CIS token exchange'); + expect(data.subject_token_type).to.equal('https://acme.com/cis-token'); + expect(data.action_id).to.equal('action_123'); // Should be mapped to action_id + return Promise.resolve({ + data: { + ...data, + id: 'tep_123', + created_at: '2024-10-01T16:09:42.725Z', + updated_at: '2024-10-01T16:09:42.725Z', + }, + }); + }, + update: () => Promise.resolve({ data: [] }), + delete: () => Promise.resolve({ data: [] }), + list: (params) => mockPagedData(params, 'tokenExchangeProfiles', []), + }, + actions: { + list: () => + Promise.resolve({ + data: [ + { + id: 'action_123', + name: 'my-action', + supported_triggers: [{ id: 'custom-token-exchange', version: 'v1' }], + }, + ], + }), + }, + pool, + }; + const handler = new tokenExchangeProfiles.default({ client: pageClient(auth0), config }); + const stageFn = Object.getPrototypeOf(handler).processChanges; + await stageFn.apply(handler, [ + { + tokenExchangeProfiles: [ + { + name: 'CIS token exchange', + subject_token_type: 'https://acme.com/cis-token', + action: 'my-action', + type: 'custom_authentication', + }, + ], + }, + ]); + }); + + it('should update token exchange profile', async () => { + const auth0 = { + tokenExchangeProfiles: { + create: () => Promise.resolve({ data: [] }), + update: function (id, data) { + (() => expect(this).to.not.be.undefined)(); + expect(id).to.equal('tep_123'); + expect(data.name).to.equal('Updated token exchange'); + expect(data.subject_token_type).to.equal('https://acme.com/updated-token'); + // Verify that action_id and type are stripped (only name and subject_token_type can be updated) + expect(data.action_id).to.be.undefined; + expect(data.type).to.be.undefined; + return Promise.resolve(); + }, + delete: () => Promise.resolve({ data: [] }), + list: (params) => + mockPagedData({ ...params, include_totals: true }, 'tokenExchangeProfiles', [ + { + id: 'tep_123', + name: 'CIS token exchange', + subject_token_type: 'https://acme.com/cis-token', + action_id: 'action_123', + type: 'custom_authentication', + }, + ]), + }, + actions: { + list: () => + Promise.resolve({ + data: [ + { + id: 'action_123', + name: 'my-action', + supported_triggers: [{ id: 'custom-token-exchange', version: 'v1' }], + }, + ], + }), + }, + pool, + }; + + const handler = new tokenExchangeProfiles.default({ client: pageClient(auth0), config }); + const stageFn = Object.getPrototypeOf(handler).processChanges; + await stageFn.apply(handler, [ + { + tokenExchangeProfiles: [ + { + id: 'tep_123', + name: 'Updated token exchange', + subject_token_type: 'https://acme.com/updated-token', + action: 'my-action', + type: 'custom_authentication', + }, + ], + }, + ]); + }); + + it('should delete token exchange profile', async () => { + const auth0 = { + tokenExchangeProfiles: { + create: () => Promise.resolve({ data: [] }), + update: () => Promise.resolve({ data: [] }), + delete: function (id) { + (() => expect(this).to.not.be.undefined)(); + expect(id).to.equal('tep_123'); + return Promise.resolve(); + }, + list: (params) => + mockPagedData({ ...params, include_totals: true }, 'tokenExchangeProfiles', [ + { + id: 'tep_123', + name: 'CIS token exchange', + subject_token_type: 'https://acme.com/cis-token', + action_id: 'action_123', + type: 'custom_authentication', + }, + ]), + }, + actions: { + list: () => Promise.resolve({ data: [] }), + }, + pool, + }; + + const handler = new tokenExchangeProfiles.default({ client: pageClient(auth0), config }); + const stageFn = Object.getPrototypeOf(handler).processChanges; + await stageFn.apply(handler, [{ tokenExchangeProfiles: [] }]); + }); + + it('should throw error when action is not found during create', async () => { + const auth0 = { + tokenExchangeProfiles: { + create: () => Promise.resolve({ data: [] }), + update: () => Promise.resolve({ data: [] }), + delete: () => Promise.resolve({ data: [] }), + list: (params) => mockPagedData(params, 'tokenExchangeProfiles', []), + }, + actions: { + list: () => + Promise.resolve({ + data: [ + { + id: 'action_123', + name: 'my-action', + supported_triggers: [{ id: 'custom-token-exchange', version: 'v1' }], + }, + ], + }), + }, + pool, + }; + + const handler = new tokenExchangeProfiles.default({ client: pageClient(auth0), config }); + const stageFn = Object.getPrototypeOf(handler).processChanges; + + try { + await stageFn.apply(handler, [ + { + tokenExchangeProfiles: [ + { + name: 'CIS token exchange', + subject_token_type: 'https://acme.com/cis-token', + action: 'non-existent-action', + type: 'custom_authentication', + }, + ], + }, + ]); + expect.fail('Should have thrown an error'); + } catch (err) { + expect(err.message).to.include('non-existent-action'); + expect(err.message).to.include('not found'); + } + }); + + it('should handle multiple profiles with different actions', async () => { + const createdProfiles = []; + const auth0 = { + tokenExchangeProfiles: { + create: function (data) { + (() => expect(this).to.not.be.undefined)(); + createdProfiles.push(data); + return Promise.resolve({ + data: { + ...data, + id: `tep_${createdProfiles.length}`, + created_at: '2024-10-01T16:09:42.725Z', + updated_at: '2024-10-01T16:09:42.725Z', + }, + }); + }, + update: () => Promise.resolve({ data: [] }), + delete: () => Promise.resolve({ data: [] }), + list: (params) => mockPagedData(params, 'tokenExchangeProfiles', []), + }, + actions: { + list: () => + Promise.resolve({ + data: [ + { + id: 'action_123', + name: 'my-action', + supported_triggers: [{ id: 'custom-token-exchange', version: 'v1' }], + }, + { + id: 'action_456', + name: 'partner-action', + supported_triggers: [{ id: 'custom-token-exchange', version: 'v1' }], + }, + ], + }), + }, + pool, + }; + + const handler = new tokenExchangeProfiles.default({ client: pageClient(auth0), config }); + const stageFn = Object.getPrototypeOf(handler).processChanges; + await stageFn.apply(handler, [ + { + tokenExchangeProfiles: [ + { + name: 'CIS token exchange', + subject_token_type: 'https://acme.com/cis-token', + action: 'my-action', + type: 'custom_authentication', + }, + { + name: 'Partner token exchange', + subject_token_type: 'https://partner.com/auth-token', + action: 'partner-action', + type: 'custom_authentication', + }, + ], + }, + ]); + + expect(createdProfiles).to.have.lengthOf(2); + expect(createdProfiles[0].action_id).to.equal('action_123'); + expect(createdProfiles[1].action_id).to.equal('action_456'); + }); + + it('should handle profile with action_id already set', async () => { + const auth0 = { + tokenExchangeProfiles: { + create: function (data) { + (() => expect(this).to.not.be.undefined)(); + // If action_id is already set, it should be preserved + expect(data.action_id).to.equal('action_123'); + expect(data.action).to.be.undefined; + return Promise.resolve({ + data: { + ...data, + id: 'tep_123', + created_at: '2024-10-01T16:09:42.725Z', + updated_at: '2024-10-01T16:09:42.725Z', + }, + }); + }, + update: () => Promise.resolve({ data: [] }), + delete: () => Promise.resolve({ data: [] }), + list: (params) => mockPagedData(params, 'tokenExchangeProfiles', []), + }, + actions: { + list: () => + Promise.resolve({ + data: [ + { + id: 'action_123', + name: 'my-action', + supported_triggers: [{ id: 'custom-token-exchange', version: 'v1' }], + }, + ], + }), + }, + pool, + }; + + const handler = new tokenExchangeProfiles.default({ client: pageClient(auth0), config }); + const stageFn = Object.getPrototypeOf(handler).processChanges; + await stageFn.apply(handler, [ + { + tokenExchangeProfiles: [ + { + name: 'CIS token exchange', + subject_token_type: 'https://acme.com/cis-token', + action_id: 'action_123', + type: 'custom_authentication', + }, + ], + }, + ]); + }); + + it('should not delete when AUTH0_ALLOW_DELETE is false', async () => { + let deleteCalled = false; + const auth0 = { + tokenExchangeProfiles: { + create: () => Promise.resolve({ data: [] }), + update: () => Promise.resolve({ data: [] }), + delete: function () { + deleteCalled = true; + return Promise.resolve(); + }, + list: (params) => + mockPagedData({ ...params, include_totals: true }, 'tokenExchangeProfiles', [ + { + id: 'tep_123', + name: 'CIS token exchange', + subject_token_type: 'https://acme.com/cis-token', + action_id: 'action_123', + type: 'custom_authentication', + }, + ]), + }, + actions: { + list: () => Promise.resolve({ data: [] }), + }, + pool, + }; + + const configNoDelete = function (key) { + return configNoDelete.data && configNoDelete.data[key]; + }; + configNoDelete.data = { + AUTH0_CLIENT_ID: 'client_id', + AUTH0_ALLOW_DELETE: false, + }; + + const handler = new tokenExchangeProfiles.default({ + client: pageClient(auth0), + config: configNoDelete, + }); + const stageFn = Object.getPrototypeOf(handler).processChanges; + await stageFn.apply(handler, [{ tokenExchangeProfiles: [] }]); + + expect(deleteCalled).to.equal(false); + }); + + it('should do nothing if tokenExchangeProfiles is not provided', async () => { + let createCalled = false; + let updateCalled = false; + let deleteCalled = false; + + const auth0 = { + tokenExchangeProfiles: { + create: () => { + createCalled = true; + return Promise.resolve({ data: [] }); + }, + update: () => { + updateCalled = true; + return Promise.resolve({ data: [] }); + }, + delete: () => { + deleteCalled = true; + return Promise.resolve(); + }, + list: (params) => mockPagedData(params, 'tokenExchangeProfiles', []), + }, + actions: { + list: () => Promise.resolve({ data: [] }), + }, + pool, + }; + + const handler = new tokenExchangeProfiles.default({ client: pageClient(auth0), config }); + const stageFn = Object.getPrototypeOf(handler).processChanges; + await stageFn.apply(handler, [{}]); // No tokenExchangeProfiles in assets + + expect(createCalled).to.equal(false); + expect(updateCalled).to.equal(false); + expect(deleteCalled).to.equal(false); + }); + }); + + describe('#tokenExchangeProfiles action mapping', () => { + it('should warn when action is not found during export', async () => { + const auth0 = { + tokenExchangeProfiles: { + list: (params) => + mockPagedData({ ...params, include_totals: true }, 'tokenExchangeProfiles', [ + { + id: 'tep_123', + name: 'CIS token exchange', + subject_token_type: 'https://acme.com/cis-token', + action_id: 'action_999', + type: 'custom_authentication', + }, + ]), + }, + actions: { + list: () => + Promise.resolve({ + data: [ + { + id: 'action_123', + name: 'my-action', + supported_triggers: [{ id: 'custom-token-exchange', version: 'v1' }], + }, + ], + }), + }, + pool, + }; + + const handler = new tokenExchangeProfiles.default({ client: pageClient(auth0), config }); + const data = await handler.getType(); + + // Profile should still be returned even if action is not found + expect(data).to.be.an('array'); + expect(data).to.have.lengthOf(1); + expect(data[0].action_id).to.equal('action_999'); // Should keep original action_id + expect(data[0].action).to.be.undefined; + }); + + it('should map multiple profiles with same action correctly', async () => { + const auth0 = { + tokenExchangeProfiles: { + list: (params) => + mockPagedData({ ...params, include_totals: true }, 'tokenExchangeProfiles', [ + { + id: 'tep_123', + name: 'CIS token exchange', + subject_token_type: 'https://acme.com/cis-token', + action_id: 'action_123', + type: 'custom_authentication', + }, + { + id: 'tep_456', + name: 'Partner token exchange', + subject_token_type: 'https://partner.com/auth-token', + action_id: 'action_123', + type: 'custom_authentication', + }, + ]), + }, + actions: { + list: () => + Promise.resolve({ + data: [ + { + id: 'action_123', + name: 'my-action', + supported_triggers: [{ id: 'custom-token-exchange', version: 'v1' }], + }, + ], + }), + }, + pool, + }; + + const handler = new tokenExchangeProfiles.default({ client: pageClient(auth0), config }); + const data = await handler.getType(); + + expect(data).to.be.an('array'); + expect(data).to.have.lengthOf(2); + expect(data[0].action).to.equal('my-action'); + expect(data[1].action).to.equal('my-action'); + expect(data[0].action_id).to.be.undefined; + expect(data[1].action_id).to.be.undefined; + }); + }); +}); diff --git a/test/tools/auth0/handlers/triggers.tests.js b/test/tools/auth0/handlers/triggers.tests.js index 794f38dea..37aaa01f1 100644 --- a/test/tools/auth0/handlers/triggers.tests.js +++ b/test/tools/auth0/handlers/triggers.tests.js @@ -19,7 +19,11 @@ describe('#triggers handler', () => { it('should pass validation', async () => { const auth0 = { actions: { - getTriggerBindings: () => [], + triggers: { + bindings: { + list: () => Promise.resolve({ data: [] }), + }, + }, }, }; @@ -53,8 +57,14 @@ describe('#triggers handler', () => { const auth0 = { actions: { - getAllTriggers: () => Promise.resolve(triggersBindings), - updateTriggerBindings: () => Promise.resolve([]), + triggers: { + list: () => + Promise.resolve({ triggers: Object.keys(triggersBindings).map((id) => ({ id })) }), + bindings: { + list: (triggerId) => Promise.resolve({ data: triggersBindings[triggerId] || [] }), + updateMany: () => Promise.resolve([]), + }, + }, }, pool, getAllCalled: false, @@ -85,21 +95,30 @@ describe('#triggers handler', () => { const auth0 = { actions: { - getAllTriggers: () => Promise.resolve(existingTriggerBindings), - // eslint-disable-next-line camelcase - updateTriggerBindings: ({ triggerId }, { bindings }) => { - expect([ - 'post-login', - 'credentials-exchange', - 'pre-user-registration', - 'post-user-registration', - 'post-change-password', - 'send-phone-message', - 'password-reset-post-challenge', - ]).to.include(triggerId); // eslint-disable-line camelcase - expect(bindings).to.be.an('array').that.is.empty; // eslint-disable-line no-unused-expressions - timesUpdateTriggerBindingsCalled += 1; - return Promise.resolve([]); + triggers: { + list: () => + Promise.resolve({ + triggers: Object.keys(existingTriggerBindings).map((id) => ({ id })), + }), + bindings: { + list: (triggerId) => + Promise.resolve({ data: existingTriggerBindings[triggerId] || [] }), + // eslint-disable-next-line camelcase + updateMany: (triggerId, { bindings }) => { + expect([ + 'post-login', + 'credentials-exchange', + 'pre-user-registration', + 'post-user-registration', + 'post-change-password', + 'send-phone-message', + 'password-reset-post-challenge', + ]).to.include(triggerId); // eslint-disable-line camelcase + expect(bindings).to.be.an('array').that.is.empty; // eslint-disable-line no-unused-expressions + timesUpdateTriggerBindingsCalled += 1; + return Promise.resolve([]); + }, + }, }, }, pool, @@ -165,13 +184,22 @@ describe('#triggers handler', () => { const auth0 = { actions: { - getAllTriggers: () => Promise.resolve(existingTriggerBindings), - // eslint-disable-next-line camelcase - updateTriggerBindings: ({ triggerId }, { bindings }) => { - expect(triggerId).to.equal('post-login'); - expect(bindings).to.deep.equal(updatePayload); - timesUpdateTriggerBindingsCalled += 1; - return Promise.resolve(updatePayload); + triggers: { + list: () => + Promise.resolve({ + triggers: Object.keys(existingTriggerBindings).map((id) => ({ id })), + }), + bindings: { + list: (triggerId) => + Promise.resolve({ data: existingTriggerBindings[triggerId] || [] }), + // eslint-disable-next-line camelcase + updateMany: (triggerId, { bindings }) => { + expect(triggerId).to.equal('post-login'); + expect(bindings).to.deep.equal(updatePayload); + timesUpdateTriggerBindingsCalled += 1; + return Promise.resolve(updatePayload); + }, + }, }, }, pool, @@ -208,41 +236,45 @@ describe('#triggers handler', () => { const auth0 = { actions: { - getTriggerBindings: (params) => { - let res = {}; - switch (params.trigger_id) { - case 'post-login': - res = { - bindings: [ - { - action: { name: 'action-one' }, - display_name: 'display-name', - }, - ], - }; - break; - case 'credentials-exchange': - res = { bindings: [] }; - break; - case 'pre-user-registration': - res = { bindings: [] }; - break; - case 'post-user-registration': - res = { bindings: [] }; - break; - case 'post-change-password': - res = { bindings: [] }; - break; - case 'send-phone-message': - res = { bindings: [] }; - break; - case 'password-reset-post-challenge': - res = { bindings: [] }; - break; - default: - break; - } - return Promise.resolve(res); + triggers: { + list: () => + Promise.resolve({ + triggers: [ + { id: 'post-login' }, + { id: 'credentials-exchange' }, + { id: 'pre-user-registration' }, + { id: 'post-user-registration' }, + { id: 'post-change-password' }, + { id: 'send-phone-message' }, + { id: 'password-reset-post-challenge' }, + ], + }), + bindings: { + list: (triggerId) => { + let res = []; + switch (triggerId) { + case 'post-login': + res = [ + { + action: { name: 'action-one' }, + display_name: 'display-name', + }, + ]; + break; + case 'credentials-exchange': + case 'pre-user-registration': + case 'post-user-registration': + case 'post-change-password': + case 'send-phone-message': + case 'password-reset-post-challenge': + res = []; + break; + default: + break; + } + return Promise.resolve({ data: res }); + }, + }, }, }, }; @@ -255,10 +287,12 @@ describe('#triggers handler', () => { it('should return an empty array for 404 status code', async () => { const auth0 = { actions: { - getTriggerBindings: () => { - const error = new Error('Not found'); - error.statusCode = 404; - throw error; + triggers: { + list: () => { + const error = new Error('Not found'); + error.statusCode = 404; + throw error; + }, }, }, pool, @@ -272,17 +306,19 @@ describe('#triggers handler', () => { it('should return an empty array when the feature flag is disabled', async () => { const auth0 = { actions: { - getAllTriggers: () => { - const error = new Error('Not enabled'); - error.statusCode = 403; - error.originalError = { - response: { - body: { - errorCode: 'feature_not_enabled', + triggers: { + list: () => { + const error = new Error('Not enabled'); + error.statusCode = 403; + error.originalError = { + response: { + body: { + errorCode: 'feature_not_enabled', + }, }, - }, - }; - throw error; + }; + throw error; + }, }, }, pool, @@ -296,10 +332,12 @@ describe('#triggers handler', () => { it('should throw an error for all other failed requests', async () => { const auth0 = { actions: { - getTriggerBindings: () => { - const error = new Error('Bad request'); - error.statusCode = 500; - throw error; + triggers: { + list: () => { + const error = new Error('Bad request'); + error.statusCode = 500; + throw error; + }, }, }, pool, diff --git a/test/tools/auth0/handlers/userAttributeProfiles.tests.js b/test/tools/auth0/handlers/userAttributeProfiles.tests.js index 14e121510..9a6e9510b 100644 --- a/test/tools/auth0/handlers/userAttributeProfiles.tests.js +++ b/test/tools/auth0/handlers/userAttributeProfiles.tests.js @@ -118,7 +118,7 @@ describe('#userAttributeProfiles handler', () => { }, update: () => Promise.resolve({ data: [] }), delete: () => Promise.resolve({ data: [] }), - getAll: (params) => mockPagedData(params, 'userAttributeProfiles', []), + list: (params) => mockPagedData(params, 'userAttributeProfiles', []), }, pool, }; @@ -136,7 +136,7 @@ describe('#userAttributeProfiles handler', () => { it('should get userAttributeProfiles', async () => { const auth0 = { userAttributeProfiles: { - getAll: (params) => mockPagedData(params, 'userAttributeProfiles', [sampleUAPWithId]), + list: (params) => mockPagedData(params, 'userAttributeProfiles', [sampleUAPWithId]), }, pool, }; @@ -149,7 +149,7 @@ describe('#userAttributeProfiles handler', () => { it('should get userAttributeProfiles with correct parameters', async () => { const auth0 = { userAttributeProfiles: { - getAll: (params) => { + list: (params) => { expect(params).to.be.an('object'); expect(params.include_totals).to.equal(true); expect(params.is_global).to.equal(false); @@ -173,14 +173,14 @@ describe('#userAttributeProfiles handler', () => { userAttributeProfiles: { update: function (params, data) { (() => expect(this).to.not.be.undefined)(); - expect(params).to.be.an('object'); - expect(params.id).to.equal(sampleUAPWithId.id); + expect(params).to.be.a('string'); + expect(params).to.equal(sampleUAPWithId.id); expect(data).to.be.an('object'); expect(data.name).to.equal(sampleUAPUpdated.name); return Promise.resolve({ data }); }, - getAll: (params) => mockPagedData(params, 'userAttributeProfiles', [sampleUAPWithId]), + list: (params) => mockPagedData(params, 'userAttributeProfiles', [sampleUAPWithId]), }, pool, }; @@ -213,11 +213,11 @@ describe('#userAttributeProfiles handler', () => { }, delete: function (params) { (() => expect(this).to.not.be.undefined)(); - expect(params).to.be.an('object'); - expect(params.id).to.equal(sampleUAPWithId.id); + expect(params).to.be.a('string'); + expect(params).to.equal(sampleUAPWithId.id); return Promise.resolve({ data: [] }); }, - getAll: (params) => mockPagedData(params, 'userAttributeProfiles', [sampleUAPWithId]), + list: (params) => mockPagedData(params, 'userAttributeProfiles', [sampleUAPWithId]), }, pool, }; @@ -234,10 +234,10 @@ describe('#userAttributeProfiles handler', () => { userAttributeProfiles: { delete: (params) => { removed = true; - expect(params).to.be.an('object'); + expect(params).to.be.a('string'); return Promise.resolve({ data: [] }); }, - getAll: (params) => mockPagedData(params, 'userAttributeProfiles', [sampleUAPWithId]), + list: (params) => mockPagedData(params, 'userAttributeProfiles', [sampleUAPWithId]), }, pool, }; @@ -257,7 +257,7 @@ describe('#userAttributeProfiles handler', () => { expect(params).to.be.an('undefined'); return Promise.resolve({ data: [] }); }, - getAll: (params) => mockPagedData(params, 'userAttributeProfiles', [sampleUAPWithId]), + list: (params) => mockPagedData(params, 'userAttributeProfiles', [sampleUAPWithId]), }, pool, }; @@ -271,7 +271,7 @@ describe('#userAttributeProfiles handler', () => { it('should handle 403 error when not enabled on tenant', async () => { const auth0 = { userAttributeProfiles: { - getAll: () => Promise.reject(Object.assign(new Error('Forbidden'), { statusCode: 403 })), + list: () => Promise.reject(Object.assign(new Error('Forbidden'), { statusCode: 403 })), }, }; diff --git a/test/tools/auth0/validator.tests.js b/test/tools/auth0/validator.tests.js index 7db0a148e..3c7ef4541 100644 --- a/test/tools/auth0/validator.tests.js +++ b/test/tools/auth0/validator.tests.js @@ -140,17 +140,6 @@ describe('#schema validation tests', () => { checkRequired('client_id', { clientGrants: data }, done); }); - it('should fail validation if no "scope" provided', (done) => { - const data = [ - { - client_id: 'client_id', - audience: 'audience', - }, - ]; - - checkRequired('scope', { clientGrants: data }, done); - }); - it('should fail validation if no "audience" provided', (done) => { const data = [ { diff --git a/test/utils.js b/test/utils.js index 00ef87ea1..1afaa4cd3 100644 --- a/test/utils.js +++ b/test/utils.js @@ -14,55 +14,86 @@ export const localDir = 'local'; export const testDataDir = path.resolve(localDir, 'testData'); export function mockPagedData(params, key, data) { + // SDK v5 Page always returns data as an array, with total as a separate property + const pagedResponse = { + data, + hasNextPage: () => false, + getNextPage: () => + Promise.resolve({ + data: [], + hasNextPage: () => false, + getNextPage: () => Promise.resolve({ data: [], hasNextPage: () => false }), + }), + }; + if (params && params.include_totals) { - return { data: { [key]: data, total: data.length || 0 } }; - } - // For checkpoint pagination (params.take is set), return data with entity key - if (params && params.take) { - return { data: { [key]: data, total: data.length || 0 } }; + pagedResponse.total = data.length || 0; + return pagedResponse; } - return { data }; + + return pagedResponse; } export function mockMgmtClient() { // Fake Mgmt Client. Bit hacky but good enough for now. return { - rules: { getAll: (params) => mockPagedData(params, 'rules', []) }, - hooks: { getAll: (params) => mockPagedData(params, 'hooks', []) }, - actions: { getAll: () => mockPagedData({ include_totals: true }, 'actions', []) }, - databases: { getAll: (params) => mockPagedData(params, 'databases', []) }, - connections: { getAll: (params) => mockPagedData(params, 'connections', []) }, - resourceServers: { getAll: (params) => mockPagedData(params, 'resource_servers', []) }, - rulesConfigs: { getAll: (params) => mockPagedData(params, 'rules_configs', []) }, + rules: { list: (params) => mockPagedData(params, 'rules', []) }, + hooks: { list: (params) => mockPagedData(params, 'hooks', []) }, + actions: { + list: () => mockPagedData({ include_totals: true }, 'actions', []), + triggers: { + list: () => {}, + bindings: { + list: (_triggerId) => Promise.resolve({ data: [] }), + }, + }, + }, + databases: { list: (params) => mockPagedData(params, 'databases', []) }, + connections: { list: (params) => mockPagedData(params, 'connections', []) }, + resourceServers: { list: (params) => mockPagedData(params, 'resource_servers', []) }, + rulesConfigs: { list: (params) => mockPagedData(params, 'rules_configs', []) }, emails: { - get: () => ({ - data: { + provider: { + get: () => ({ name: 'smtp', enabled: true, - }, - }), + }), + }, }, - clientGrants: { getAll: (params) => mockPagedData(params, 'client_grants', []) }, + clientGrants: { list: (params) => mockPagedData(params, 'client_grants', []) }, guardian: { - getFactors: () => ({ data: [] }), - getSmsFactorProviderTwilio: () => ({ data: [] }), - getPushNotificationProviderSNS: () => ({ data: [] }), - getSmsFactorTemplates: () => ({ data: [] }), - getPhoneFactorMessageTypes: () => ({ data: { message_types: ['sms'] } }), - getPhoneFactorSelectedProvider: () => ({ data: { provider: 'twilio' } }), - getPolicies: () => ({ data: [] }), + factors: { + list: () => [], + sms: { + getTwilioProvider: () => [], + getTemplates: () => [], + getSelectedProvider: () => ({ provider: 'twilio' }), + }, + phone: { + getMessageTypes: () => ({ message_types: ['sms'] }), + getSelectedProvider: () => ({ provider: 'twilio' }), + }, + pushNotification: { + getSnsProvider: () => [], + }, + }, + policies: { + list: () => [], + }, }, emailTemplates: { - get: (template) => ({ - data: { - template: template.templateName, + get: (template) => { + const templateName = typeof template === 'string' ? template : template.templateName; + + return { + template: templateName, enabled: true, body: 'fake template', - }, - }), + }; + }, }, clients: { - getAll: (params) => { + list: (params) => { const client = { name: 'Global Client', client_id: 'FMfcgxvzLDvPsgpRFKkLVrnKqGgkHhQV', @@ -75,7 +106,7 @@ export function mockMgmtClient() { }, }, roles: { - getAll: (params) => + list: (params) => mockPagedData(params, 'roles', [ { name: 'App Admin', @@ -83,85 +114,114 @@ export function mockMgmtClient() { description: 'Admin of app', }, ]), - getPermissions: (params) => - mockPagedData(params, 'permissions', [ - { - permission_name: 'create:data', - resource_server_identifier: 'urn:ref', - }, - ]), + permissions: { + list: (params) => + mockPagedData(params, 'permissions', [ + { + permission_name: 'create:data', + resource_server_identifier: 'urn:ref', + }, + ]), + }, }, tenants: { - getSettings: () => - new Promise((resolve) => { - resolve({ - data: { + settings: { + get: () => + new Promise((resolve) => { + resolve({ friendly_name: 'Test', default_directory: 'users', enabled_locales: ['en'], - }, - }); - }), - getCustomTextByLanguage: () => Promise.resolve({ data: {} }), + }); + }), + }, + getCustomTextByLanguage: () => Promise.resolve({}), }, attackProtection: { - getBreachedPasswordDetectionConfig: () => ({ data: {} }), - getBruteForceConfig: () => ({ data: {} }), - getSuspiciousIpThrottlingConfig: () => ({ data: {} }), + breachedPasswordDetection: { + get: () => ({}), + }, + bruteForceProtection: { + get: () => ({}), + }, + suspiciousIpThrottling: { + get: () => ({}), + }, }, branding: { - getSettings: () => ({ data: {} }), - getDefaultTheme: () => { - const err = new Error('Not found'); - err.statusCode = 404; - return Promise.reject(err); - }, - getAllPhoneProviders: () => ({ - data: [ - { - disabled: false, - name: 'twilio', - configuration: { - sid: 'twilio_sid', - default_from: '++15673812247', - delivery_methods: ['text', 'voice'], - }, - }, - ], - }), + get: () => ({}), + themes: { + getDefault: () => { + const err = new Error('Not found'); + err.statusCode = 404; + return Promise.reject(err); + }, + }, + phone: { + providers: { + list: () => Promise.resolve({ providers: [] }), + get: (_id) => Promise.resolve({}), + create: (data) => Promise.resolve(data), + update: (_id, data) => Promise.resolve(data), + delete: (_id) => Promise.resolve(), + }, + templates: { + list: () => Promise.resolve({ templates: [] }), + create: (data) => Promise.resolve(data), + update: (_id, data) => Promise.resolve(data), + delete: (_id) => Promise.resolve(), + }, + }, }, - logStreams: { getAll: (params) => mockPagedData(params, 'log_streams', []) }, + logStreams: { list: () => Promise.resolve([]) }, prompts: { - _getRestClient: (endpoint) => ({ - get: (...options) => Promise.resolve({ endpoint, method: 'get', options }), - }), - getCustomTextByLanguage: () => - new Promise((res) => { - res({ data: {} }); - }), - get: () => ({ data: {} }), - getAllRenderingSettings: () => Promise.resolve({ data: [] }), + customText: { + get: (_promptType, _language, _options) => Promise.resolve({}), + }, + partials: { + get: (_prompt, _options) => Promise.resolve({}), + }, + rendering: { + list: () => Promise.resolve({ data: [] }), + }, + getSettings: () => Promise.resolve(Object.create(null)), + updateSettings: () => Promise.resolve({}), }, customDomains: { - getAll: (params) => mockPagedData(params, 'customDomains', []), - _getRestClient: () => ({}), + list: (params) => mockPagedData(params, 'customDomains', []), }, - forms: { getAll: (params) => mockPagedData(params, 'forms', []) }, + forms: { list: (params) => mockPagedData(params, 'forms', []) }, flows: { - getAll: (params) => mockPagedData(params, 'flows', []), - getAllConnections: (params) => mockPagedData(params, 'connections', []), + list: (params) => mockPagedData(params, 'flows', []), + vault: { + connections: { + list: (params) => mockPagedData(params, 'connections', []), + }, + }, }, selfServiceProfiles: { - getAll: (params) => mockPagedData(params, 'selfServiceProfiles', []), + list: (params) => mockPagedData(params, 'selfServiceProfiles', []), }, networkAcls: { - getAll: (params) => mockPagedData(params, 'network_acls', []), + list: (params) => mockPagedData(params, 'network_acls', []), + }, + organizations: { + list: (params) => mockPagedData(params, 'organizations', []), + enabledConnections: { + list: (_orgId, params) => mockPagedData(params, 'enabled_connections', []), + }, + clientGrants: { + list: (_orgId, params) => mockPagedData(params, 'client_grants', []), + }, }, userAttributeProfiles: { - getAll: (params) => mockPagedData(params, 'userAttributeProfiles', []), + list: (params) => mockPagedData(params, 'userAttributeProfiles', []), }, connectionProfiles: { - getAll: (params) => mockPagedData(params, 'connectionProfiles', []), + list: (params) => mockPagedData(params, 'connectionProfiles', []), + }, + tokenExchangeProfiles: { + list: (params) => mockPagedData(params, 'tokenExchangeProfiles', []), }, }; } diff --git a/tsconfig.json b/tsconfig.json index 772ad734c..3ebe7ac57 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,12 +1,13 @@ { "compilerOptions": { - "target": "es2016", + "target": "es2020", "experimentalDecorators": true, - "module": "commonjs", + "module": "nodenext", + "moduleResolution": "nodenext", "rootDir": "./src", "allowJs": true, "outDir": "./lib", - "sourceMap": true, + "sourceMap": false, "esModuleInterop": true, "forceConsistentCasingInFileNames": true, "strict": false,