From 53f1afb42a732e448a1a90beec71b2e4f495c182 Mon Sep 17 00:00:00 2001 From: Pavindu Lakshan Date: Mon, 4 May 2026 11:37:40 +0530 Subject: [PATCH] Initialize docusaurus website --- docusaurus-asgardeo/.gitignore | 7 + docusaurus-asgardeo/docusaurus.config.js | 129 + docusaurus-asgardeo/package-lock.json | 18432 ++++++++++++++++ docusaurus-asgardeo/package.json | 35 + docusaurus-asgardeo/scripts/preprocess.js | 451 + docusaurus-asgardeo/sidebars.js | 1589 ++ .../src/assets/fonts/fa/fa-brands-400.ttf | Bin 0 -> 189684 bytes .../src/assets/fonts/fa/fa-brands-400.woff2 | Bin 0 -> 109808 bytes .../src/assets/fonts/fa/fa-solid-900.ttf | Bin 0 -> 394668 bytes .../src/assets/fonts/fa/fa-solid-900.woff2 | Bin 0 -> 150020 bytes .../src/assets/fonts/gilmer/gilmer-bold.eot | Bin 0 -> 98922 bytes .../src/assets/fonts/gilmer/gilmer-bold.ttf | Bin 0 -> 98696 bytes .../src/assets/fonts/gilmer/gilmer-bold.woff | Bin 0 -> 47548 bytes .../src/assets/fonts/gilmer/gilmer-bold.woff2 | Bin 0 -> 33648 bytes .../src/assets/fonts/gilmer/gilmer-medium.eot | Bin 0 -> 97498 bytes .../src/assets/fonts/gilmer/gilmer-medium.ttf | Bin 0 -> 97272 bytes .../assets/fonts/gilmer/gilmer-medium.woff | Bin 0 -> 46992 bytes .../assets/fonts/gilmer/gilmer-medium.woff2 | Bin 0 -> 33288 bytes .../assets/fonts/gilmer/gilmer-regular.eot | Bin 0 -> 97770 bytes .../assets/fonts/gilmer/gilmer-regular.ttf | Bin 0 -> 97544 bytes .../assets/fonts/gilmer/gilmer-regular.woff | Bin 0 -> 47036 bytes .../assets/fonts/gilmer/gilmer-regular.woff2 | Bin 0 -> 33596 bytes .../src/assets/fonts/gilmer/gilmer.css | 83 + docusaurus-asgardeo/src/components/Card.jsx | 43 + .../src/components/HomePageCards.jsx | 226 + docusaurus-asgardeo/src/css/custom.css | 1395 ++ .../restapis/account-recovery.yaml | 256 + .../organization-apis/restapis/actions.yaml | 1418 ++ .../restapis/api-resources.yaml | 779 + .../restapis/application.yaml | 1310 ++ .../association-management-by-admin.yaml | 589 + .../restapis/authenticators.yaml | 618 + .../restapis/branding-management.yaml | 642 + .../restapis/claim-management.yaml | 677 + .../end-user-credential-management.yaml | 198 + .../restapis/idle-account-identification.yaml | 135 + .../apis/organization-apis/restapis/idp.yaml | 3171 +++ .../restapis/notification-senders-v2.yaml | 2274 ++ .../restapis/notification-senders.yaml | 1363 ++ .../restapis/org-application-mgt.yaml | 2569 +++ .../restapis/org-group-mgt.yaml | 937 + .../restapis/org-management.yaml | 1131 + .../restapis/org-offline-user-onboard.yaml | 104 + .../restapis/org-user-mgt.yaml | 845 + .../restapis/org-user-store.yaml | 900 + .../restapis/organization-discovery.yaml | 223 + .../organization-user-invitation.yaml | 740 + .../restapis/organization-user-share-v2.yaml | 1081 + .../restapis/organization-user-share.yaml | 800 + .../restapis/role-management.yaml | 1156 + .../restapis/rule-metadata.yaml | 301 + .../organization-apis/restapis/scim-bulk.yaml | 193 + .../verification-code-management.yaml | 175 + .../static/apis/restapis/actions.yaml | 1683 ++ .../restapis/admin-identity-verification.yaml | 498 + .../static/apis/restapis/api-resources.yaml | 1138 + .../app-native-authentication-api.yaml | 455 + .../apis/restapis/application-management.yaml | 5633 +++++ .../static/apis/restapis/approvals.yaml | 377 + .../association-management-by-admin.yaml | 589 + .../association-management-by-user.yaml | 404 + .../apis/restapis/attribute-management.yaml | 1537 ++ .../static/apis/restapis/authenticators.yaml | 616 + .../static/apis/restapis/backup-code.yaml | 158 + .../apis/restapis/branding-preference.yaml | 716 + .../apis/restapis/consent-management.yaml | 1561 ++ .../static/apis/restapis/email-template.yaml | 692 + .../end-user-credential-management.yaml | 198 + .../apis/restapis/event-configuration.yaml | 349 + .../apis/restapis/export-user-info.yaml | 125 + .../static/apis/restapis/extend-sessions.yaml | 110 + .../apis/restapis/identity-governance.yaml | 501 + .../identity-verification-providers.yaml | 578 + .../restapis/idle-account-identification.yaml | 135 + .../static/apis/restapis/idp.yaml | 3661 +++ .../restapis/notification-senders-v2.yaml | 2275 ++ .../apis/restapis/notification-senders.yaml | 1360 ++ .../static/apis/restapis/oauth-dcr.yaml | 448 + .../apis/restapis/offline-user-onboard.yaml | 104 + .../static/apis/restapis/org-management.yaml | 1117 + .../organization-discovery-config-mgt.yaml | 250 + .../apis/restapis/organization-discovery.yaml | 551 + .../restapis/organization-user-share-v2.yaml | 1080 + .../restapis/organization-user-share.yaml | 804 + .../apis/restapis/password-recovery.yaml | 936 + .../restapis/push-notification-devices.yaml | 331 + .../static/apis/restapis/roles.yaml | 1166 + .../static/apis/restapis/rule-metadata.yaml | 401 + .../static/apis/restapis/scim2-agents.yaml | 894 + .../static/apis/restapis/scim2-bulk.yaml | 633 + .../static/apis/restapis/scim2-groups.yaml | 859 + .../static/apis/restapis/scim2-me.yaml | 693 + .../apis/restapis/scim2-resource-types.yaml | 125 + .../static/apis/restapis/scim2-schemas.yaml | 356 + .../apis/restapis/scim2-sp-configs.yaml | 106 + .../static/apis/restapis/scim2-users.yaml | 852 + .../static/apis/restapis/session.yaml | 467 + .../static/apis/restapis/totp.yaml | 226 + .../apis/restapis/user-account-recovery.yaml | 1402 ++ .../restapis/user-identity-verification.yaml | 299 + .../apis/restapis/user-organization.yaml | 339 + .../static/apis/restapis/user-password.yaml | 163 + .../static/apis/restapis/user-store.yaml | 1187 + .../static/apis/restapis/validation.yaml | 443 + .../static/apis/restapis/vc-templates.yaml | 495 + .../verification-code-management-me.yaml | 167 + .../verification-code-management.yaml | 175 + .../apis/restapis/webhook-management.yaml | 530 + .../apis/restapis/webhook-metadata.yaml | 188 + .../static/apis/restapis/workflow.yaml | 1255 ++ docusaurus-asgardeo/static/assets | 1 + 111 files changed, 91367 insertions(+) create mode 100644 docusaurus-asgardeo/.gitignore create mode 100644 docusaurus-asgardeo/docusaurus.config.js create mode 100644 docusaurus-asgardeo/package-lock.json create mode 100644 docusaurus-asgardeo/package.json create mode 100644 docusaurus-asgardeo/scripts/preprocess.js create mode 100644 docusaurus-asgardeo/sidebars.js create mode 100644 docusaurus-asgardeo/src/assets/fonts/fa/fa-brands-400.ttf create mode 100644 docusaurus-asgardeo/src/assets/fonts/fa/fa-brands-400.woff2 create mode 100644 docusaurus-asgardeo/src/assets/fonts/fa/fa-solid-900.ttf create mode 100644 docusaurus-asgardeo/src/assets/fonts/fa/fa-solid-900.woff2 create mode 100644 docusaurus-asgardeo/src/assets/fonts/gilmer/gilmer-bold.eot create mode 100644 docusaurus-asgardeo/src/assets/fonts/gilmer/gilmer-bold.ttf create mode 100644 docusaurus-asgardeo/src/assets/fonts/gilmer/gilmer-bold.woff create mode 100644 docusaurus-asgardeo/src/assets/fonts/gilmer/gilmer-bold.woff2 create mode 100644 docusaurus-asgardeo/src/assets/fonts/gilmer/gilmer-medium.eot create mode 100644 docusaurus-asgardeo/src/assets/fonts/gilmer/gilmer-medium.ttf create mode 100644 docusaurus-asgardeo/src/assets/fonts/gilmer/gilmer-medium.woff create mode 100644 docusaurus-asgardeo/src/assets/fonts/gilmer/gilmer-medium.woff2 create mode 100644 docusaurus-asgardeo/src/assets/fonts/gilmer/gilmer-regular.eot create mode 100644 docusaurus-asgardeo/src/assets/fonts/gilmer/gilmer-regular.ttf create mode 100644 docusaurus-asgardeo/src/assets/fonts/gilmer/gilmer-regular.woff create mode 100644 docusaurus-asgardeo/src/assets/fonts/gilmer/gilmer-regular.woff2 create mode 100644 docusaurus-asgardeo/src/assets/fonts/gilmer/gilmer.css create mode 100644 docusaurus-asgardeo/src/components/Card.jsx create mode 100644 docusaurus-asgardeo/src/components/HomePageCards.jsx create mode 100644 docusaurus-asgardeo/src/css/custom.css create mode 100644 docusaurus-asgardeo/static/apis/organization-apis/restapis/account-recovery.yaml create mode 100644 docusaurus-asgardeo/static/apis/organization-apis/restapis/actions.yaml create mode 100644 docusaurus-asgardeo/static/apis/organization-apis/restapis/api-resources.yaml create mode 100644 docusaurus-asgardeo/static/apis/organization-apis/restapis/application.yaml create mode 100644 docusaurus-asgardeo/static/apis/organization-apis/restapis/association-management-by-admin.yaml create mode 100644 docusaurus-asgardeo/static/apis/organization-apis/restapis/authenticators.yaml create mode 100644 docusaurus-asgardeo/static/apis/organization-apis/restapis/branding-management.yaml create mode 100644 docusaurus-asgardeo/static/apis/organization-apis/restapis/claim-management.yaml create mode 100644 docusaurus-asgardeo/static/apis/organization-apis/restapis/end-user-credential-management.yaml create mode 100644 docusaurus-asgardeo/static/apis/organization-apis/restapis/idle-account-identification.yaml create mode 100644 docusaurus-asgardeo/static/apis/organization-apis/restapis/idp.yaml create mode 100644 docusaurus-asgardeo/static/apis/organization-apis/restapis/notification-senders-v2.yaml create mode 100644 docusaurus-asgardeo/static/apis/organization-apis/restapis/notification-senders.yaml create mode 100644 docusaurus-asgardeo/static/apis/organization-apis/restapis/org-application-mgt.yaml create mode 100644 docusaurus-asgardeo/static/apis/organization-apis/restapis/org-group-mgt.yaml create mode 100644 docusaurus-asgardeo/static/apis/organization-apis/restapis/org-management.yaml create mode 100644 docusaurus-asgardeo/static/apis/organization-apis/restapis/org-offline-user-onboard.yaml create mode 100644 docusaurus-asgardeo/static/apis/organization-apis/restapis/org-user-mgt.yaml create mode 100644 docusaurus-asgardeo/static/apis/organization-apis/restapis/org-user-store.yaml create mode 100644 docusaurus-asgardeo/static/apis/organization-apis/restapis/organization-discovery.yaml create mode 100644 docusaurus-asgardeo/static/apis/organization-apis/restapis/organization-user-invitation.yaml create mode 100644 docusaurus-asgardeo/static/apis/organization-apis/restapis/organization-user-share-v2.yaml create mode 100644 docusaurus-asgardeo/static/apis/organization-apis/restapis/organization-user-share.yaml create mode 100644 docusaurus-asgardeo/static/apis/organization-apis/restapis/role-management.yaml create mode 100644 docusaurus-asgardeo/static/apis/organization-apis/restapis/rule-metadata.yaml create mode 100644 docusaurus-asgardeo/static/apis/organization-apis/restapis/scim-bulk.yaml create mode 100644 docusaurus-asgardeo/static/apis/organization-apis/restapis/verification-code-management.yaml create mode 100644 docusaurus-asgardeo/static/apis/restapis/actions.yaml create mode 100644 docusaurus-asgardeo/static/apis/restapis/admin-identity-verification.yaml create mode 100644 docusaurus-asgardeo/static/apis/restapis/api-resources.yaml create mode 100644 docusaurus-asgardeo/static/apis/restapis/app-native-authentication-api.yaml create mode 100644 docusaurus-asgardeo/static/apis/restapis/application-management.yaml create mode 100644 docusaurus-asgardeo/static/apis/restapis/approvals.yaml create mode 100644 docusaurus-asgardeo/static/apis/restapis/association-management-by-admin.yaml create mode 100644 docusaurus-asgardeo/static/apis/restapis/association-management-by-user.yaml create mode 100644 docusaurus-asgardeo/static/apis/restapis/attribute-management.yaml create mode 100644 docusaurus-asgardeo/static/apis/restapis/authenticators.yaml create mode 100644 docusaurus-asgardeo/static/apis/restapis/backup-code.yaml create mode 100644 docusaurus-asgardeo/static/apis/restapis/branding-preference.yaml create mode 100644 docusaurus-asgardeo/static/apis/restapis/consent-management.yaml create mode 100644 docusaurus-asgardeo/static/apis/restapis/email-template.yaml create mode 100644 docusaurus-asgardeo/static/apis/restapis/end-user-credential-management.yaml create mode 100644 docusaurus-asgardeo/static/apis/restapis/event-configuration.yaml create mode 100644 docusaurus-asgardeo/static/apis/restapis/export-user-info.yaml create mode 100644 docusaurus-asgardeo/static/apis/restapis/extend-sessions.yaml create mode 100644 docusaurus-asgardeo/static/apis/restapis/identity-governance.yaml create mode 100644 docusaurus-asgardeo/static/apis/restapis/identity-verification-providers.yaml create mode 100644 docusaurus-asgardeo/static/apis/restapis/idle-account-identification.yaml create mode 100644 docusaurus-asgardeo/static/apis/restapis/idp.yaml create mode 100644 docusaurus-asgardeo/static/apis/restapis/notification-senders-v2.yaml create mode 100644 docusaurus-asgardeo/static/apis/restapis/notification-senders.yaml create mode 100644 docusaurus-asgardeo/static/apis/restapis/oauth-dcr.yaml create mode 100644 docusaurus-asgardeo/static/apis/restapis/offline-user-onboard.yaml create mode 100644 docusaurus-asgardeo/static/apis/restapis/org-management.yaml create mode 100644 docusaurus-asgardeo/static/apis/restapis/organization-discovery-config-mgt.yaml create mode 100644 docusaurus-asgardeo/static/apis/restapis/organization-discovery.yaml create mode 100644 docusaurus-asgardeo/static/apis/restapis/organization-user-share-v2.yaml create mode 100644 docusaurus-asgardeo/static/apis/restapis/organization-user-share.yaml create mode 100644 docusaurus-asgardeo/static/apis/restapis/password-recovery.yaml create mode 100644 docusaurus-asgardeo/static/apis/restapis/push-notification-devices.yaml create mode 100644 docusaurus-asgardeo/static/apis/restapis/roles.yaml create mode 100644 docusaurus-asgardeo/static/apis/restapis/rule-metadata.yaml create mode 100644 docusaurus-asgardeo/static/apis/restapis/scim2-agents.yaml create mode 100644 docusaurus-asgardeo/static/apis/restapis/scim2-bulk.yaml create mode 100644 docusaurus-asgardeo/static/apis/restapis/scim2-groups.yaml create mode 100644 docusaurus-asgardeo/static/apis/restapis/scim2-me.yaml create mode 100644 docusaurus-asgardeo/static/apis/restapis/scim2-resource-types.yaml create mode 100644 docusaurus-asgardeo/static/apis/restapis/scim2-schemas.yaml create mode 100644 docusaurus-asgardeo/static/apis/restapis/scim2-sp-configs.yaml create mode 100644 docusaurus-asgardeo/static/apis/restapis/scim2-users.yaml create mode 100644 docusaurus-asgardeo/static/apis/restapis/session.yaml create mode 100644 docusaurus-asgardeo/static/apis/restapis/totp.yaml create mode 100644 docusaurus-asgardeo/static/apis/restapis/user-account-recovery.yaml create mode 100644 docusaurus-asgardeo/static/apis/restapis/user-identity-verification.yaml create mode 100644 docusaurus-asgardeo/static/apis/restapis/user-organization.yaml create mode 100644 docusaurus-asgardeo/static/apis/restapis/user-password.yaml create mode 100644 docusaurus-asgardeo/static/apis/restapis/user-store.yaml create mode 100644 docusaurus-asgardeo/static/apis/restapis/validation.yaml create mode 100644 docusaurus-asgardeo/static/apis/restapis/vc-templates.yaml create mode 100644 docusaurus-asgardeo/static/apis/restapis/verification-code-management-me.yaml create mode 100644 docusaurus-asgardeo/static/apis/restapis/verification-code-management.yaml create mode 100644 docusaurus-asgardeo/static/apis/restapis/webhook-management.yaml create mode 100644 docusaurus-asgardeo/static/apis/restapis/webhook-metadata.yaml create mode 100644 docusaurus-asgardeo/static/apis/restapis/workflow.yaml create mode 120000 docusaurus-asgardeo/static/assets diff --git a/docusaurus-asgardeo/.gitignore b/docusaurus-asgardeo/.gitignore new file mode 100644 index 0000000000..784d699c9b --- /dev/null +++ b/docusaurus-asgardeo/.gitignore @@ -0,0 +1,7 @@ +.docusaurus +.generated-docs +node_modules +.cache-loader +build +*.log +.DS_Store diff --git a/docusaurus-asgardeo/docusaurus.config.js b/docusaurus-asgardeo/docusaurus.config.js new file mode 100644 index 0000000000..ff210653d9 --- /dev/null +++ b/docusaurus-asgardeo/docusaurus.config.js @@ -0,0 +1,129 @@ +// @ts-check +import { themes as prismThemes } from 'prism-react-renderer'; + +/** @type {import('@docusaurus/types').Config} */ +const config = { + title: 'Asgardeo', + tagline: 'Asgardeo Learning Center', + favicon: 'assets/images/asgardeo-favicon.svg', + url: 'https://wso2.com', + baseUrl: '/asgardeo/docs/', + organizationName: 'wso2', + projectName: 'docs-is', + trailingSlash: true, + onBrokenLinks: 'warn', + + i18n: { + defaultLocale: 'en', + locales: ['en'], + }, + + markdown: { + format: 'detect', + }, + + presets: [ + [ + '@docusaurus/preset-classic', + /** @type {import('@docusaurus/preset-classic').Options} */ + ({ + docs: { + path: '.generated-docs', + routeBasePath: '/', + sidebarPath: './sidebars.js', + editUrl: 'https://github.com/wso2/docs-is/edit/master/en/asgardeo/docs/', + showLastUpdateTime: false, + breadcrumbs: true, + }, + blog: false, + theme: { + customCss: './src/css/custom.css', + }, + }), + ], + ], + + stylesheets: [ + '/asgardeo/docs/assets/libs/fontawesome-free-6.4.2-web/css/all.min.css', + ], + + scripts: [ + '/asgardeo/docs/assets/js/redoc.standalone.js', + ], + + themeConfig: + /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ + ({ + image: 'assets/images/asgardeo-docs-logo-dark.svg', + navbar: { + logo: { + alt: 'Asgardeo', + src: 'assets/images/asgardeo-docs-logo-dark.svg', + srcDark: 'assets/images/asgardeo-docs-logo.svg', + }, + items: [ + { + href: 'https://github.com/wso2/docs-is', + label: 'GitHub', + position: 'right', + }, + ], + }, + footer: { + style: 'light', + links: [ + { + title: 'Docs', + items: [ + { label: 'Get Started', to: '/get-started' }, + { label: 'Guides', to: '/guides' }, + { label: 'APIs', to: '/apis' }, + { label: 'References', to: '/references' }, + ], + }, + { + title: 'Community', + items: [ + { label: 'Discord', href: 'https://discord.com/invite/wso2' }, + { label: 'GitHub', href: 'https://github.com/wso2' }, + { label: 'YouTube', href: 'https://www.youtube.com/user/WSO2TechFlicks' }, + { label: 'X (Twitter)', href: 'https://twitter.com/intent/follow?screen_name=wso2' }, + ], + }, + { + title: 'Support', + items: [ + { label: 'Stack Overflow', href: 'https://stackoverflow.com/questions/tagged/wso2-asgardeo' }, + { label: 'Send us an email', href: 'mailto:asgardeo-help@wso2.com' }, + ], + }, + { + title: 'More', + items: [ + { label: 'Asgardeo Console', href: 'https://console.asgardeo.io/' }, + { label: 'WSO2', href: 'https://wso2.com/' }, + ], + }, + ], + copyright: `Copyright © ${new Date().getFullYear()} WSO2 LLC. All Rights Reserved.`, + }, + prism: { + theme: prismThemes.github, + darkTheme: prismThemes.dracula, + additionalLanguages: ['java', 'bash', 'yaml', 'json'], + }, + colorMode: { + defaultMode: 'light', + disableSwitch: false, + respectPrefersColorScheme: true, + }, + docs: { + sidebar: { + hideable: true, + autoCollapseCategories: false, + }, + }, + }), +}; + +export default config; diff --git a/docusaurus-asgardeo/package-lock.json b/docusaurus-asgardeo/package-lock.json new file mode 100644 index 0000000000..de5925e50e --- /dev/null +++ b/docusaurus-asgardeo/package-lock.json @@ -0,0 +1,18432 @@ +{ + "name": "asgardeo-docs-docusaurus", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "asgardeo-docs-docusaurus", + "version": "0.1.0", + "dependencies": { + "@docusaurus/core": "^3.10.1", + "@docusaurus/preset-classic": "^3.10.1", + "clsx": "^2.1.1", + "nunjucks": "^3.2.4", + "prism-react-renderer": "^2.4.1", + "react": "^18.3.1", + "react-dom": "^18.3.1" + }, + "devDependencies": { + "@docusaurus/module-type-aliases": "^3.10.1", + "@docusaurus/types": "^3.10.1" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@algolia/abtesting": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.18.0.tgz", + "integrity": "sha512-8siuLG+FIns1AjZ/g2SDVwHz9S+ObacDQISEJvS8XsNei1zl3FXqfqQrBpmrG7ACWCyesXHbicMJtvRbg00FEw==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.52.0", + "@algolia/requester-browser-xhr": "5.52.0", + "@algolia/requester-fetch": "5.52.0", + "@algolia/requester-node-http": "5.52.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/autocomplete-core": { + "version": "1.19.8", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.19.8.tgz", + "integrity": "sha512-3YEorYg44niXcm7gkft3nXYItHd44e8tmh4D33CTszPgP0QWkaLEaFywiNyJBo7UL/mqObA/G9RYuU7R8tN1IA==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-plugin-algolia-insights": "1.19.8", + "@algolia/autocomplete-shared": "1.19.8" + } + }, + "node_modules/@algolia/autocomplete-plugin-algolia-insights": { + "version": "1.19.8", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.19.8.tgz", + "integrity": "sha512-ZvJWO8ZZJDpc1LNM2TTBdmQsZBLMR4rU5iNR2OYvEeFBiaf/0ESnRSSLQbryarJY4SVxtoz6A2ZtDMNM+iQEAA==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-shared": "1.19.8" + }, + "peerDependencies": { + "search-insights": ">= 1 < 3" + } + }, + "node_modules/@algolia/autocomplete-shared": { + "version": "1.19.8", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.19.8.tgz", + "integrity": "sha512-h5hf2t8ejF6vlOgvLaZzQbWs5SyH2z4PAWygNAvvD/2RI29hdQ54ldUGwqVuj9Srs+n8XUKTPUqb7fvhBhQrnQ==", + "license": "MIT", + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/client-abtesting": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.52.0.tgz", + "integrity": "sha512-wtwPgyPmO7b7sQPVgoK29c1VpfS08DnnJCmxX/oU1pV2DlMRJCzQcLN7JSloYpodyKHwM8+9wOzlAM0co3TDmA==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.52.0", + "@algolia/requester-browser-xhr": "5.52.0", + "@algolia/requester-fetch": "5.52.0", + "@algolia/requester-node-http": "5.52.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.52.0.tgz", + "integrity": "sha512-9KY36bRl4AH7RjqSeDDOKnjsz4IxQFBEOB8/fWmEbdQe+Isbs5jGzVJu9NEPQ1Tgwxlf8Uf07Swj3jZyMNUZ2g==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.52.0", + "@algolia/requester-browser-xhr": "5.52.0", + "@algolia/requester-fetch": "5.52.0", + "@algolia/requester-node-http": "5.52.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-common": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.52.0.tgz", + "integrity": "sha512-3a/qM3dzJqqfTx7Yrw7uGQ98I3Q0rDfb4Vkv0wEzko96l7YQMxfBVz/VbLq2N+c59GweYv6Vhp8mPeqnWJSITw==", + "license": "MIT", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-insights": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.52.0.tgz", + "integrity": "sha512-Rki7ACbMcvbQW0BuM84x9dkGHY47ABmv4jU6tYssat2k02p3mIUms2YOLUAMeknhmnFsj6lb6ZzOXdMWMyc1sA==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.52.0", + "@algolia/requester-browser-xhr": "5.52.0", + "@algolia/requester-fetch": "5.52.0", + "@algolia/requester-node-http": "5.52.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.52.0.tgz", + "integrity": "sha512-96s4Uzc3kk+/f4jJXIVVGWP5XlngOGNQ1x6hW9AT59pOixHlOs5tqJg+ZUS/GQ6h/iYP0ceQcmxDQeLyCLTaDQ==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.52.0", + "@algolia/requester-browser-xhr": "5.52.0", + "@algolia/requester-fetch": "5.52.0", + "@algolia/requester-node-http": "5.52.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-query-suggestions": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.52.0.tgz", + "integrity": "sha512-lqeycNpSPe5Qa0OUWpejVvYQjQWV5nQuLT0a4aq7XzRAvCxprV/6Lf841EygdD2nrFnuS58ok7Au1uOtXzpnkg==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.52.0", + "@algolia/requester-browser-xhr": "5.52.0", + "@algolia/requester-fetch": "5.52.0", + "@algolia/requester-node-http": "5.52.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-search": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.52.0.tgz", + "integrity": "sha512-ly1wETVGRo30cx61O7fetESN+ElL9c9K+bD/AVgnT1ar4c6v+/Yqjrhdtu6Fm4D0s4NZP081Isf6tunH1wUXHg==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.52.0", + "@algolia/requester-browser-xhr": "5.52.0", + "@algolia/requester-fetch": "5.52.0", + "@algolia/requester-node-http": "5.52.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/events": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz", + "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==", + "license": "MIT" + }, + "node_modules/@algolia/ingestion": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.52.0.tgz", + "integrity": "sha512-U4EeTvgmluRjj39ykZSAd5X+a6LD5m7/mcOWDmB7hqm1R6QY0yT8jLxpNVEjYhzgEN5hcDGW6X67EWQY8KiYGQ==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.52.0", + "@algolia/requester-browser-xhr": "5.52.0", + "@algolia/requester-fetch": "5.52.0", + "@algolia/requester-node-http": "5.52.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/monitoring": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.52.0.tgz", + "integrity": "sha512-FCPnDcILfpTE94u7BVlV4DmnSV5wE3+j25EEF+3dYPrVzkVCSoAHs318oWDGxnxsAgiL4HpL12Jc4XHmw9shpA==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.52.0", + "@algolia/requester-browser-xhr": "5.52.0", + "@algolia/requester-fetch": "5.52.0", + "@algolia/requester-node-http": "5.52.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/recommend": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.52.0.tgz", + "integrity": "sha512-br3DO7n4N8CXwTRbZS0MnB4WQ9YHfNjCwkCEzVR/wek/qNTDQKDb0nROmkFaNZ8ucUqUVKZi074dbwMwRDlK8Q==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.52.0", + "@algolia/requester-browser-xhr": "5.52.0", + "@algolia/requester-fetch": "5.52.0", + "@algolia/requester-node-http": "5.52.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.52.0.tgz", + "integrity": "sha512-b0T/Ca2c9KyEslKsVrGZvbe1UrrKKSdfXhBZ2pbpKahFUzJfziRZ0urbOm7V65O0tO/jwU+Lo/+bIiiyhzGt8w==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.52.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-fetch": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.52.0.tgz", + "integrity": "sha512-ozBT8J/mtD4H4IAojw8QPirlcL2gHrI1BGuZ4/ZXXO/rTE1yQ4VIPJj4mTTbwo4FbkS1MoJsD/DsrqLzhnc4/g==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.52.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-node-http": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.52.0.tgz", + "integrity": "sha512-gyyWcLD22tnabmoit4iukCXuoRc5HYJuUjPSEa8a0D/f/NlRafpWi52AlAaa4Uu/rsl7saHsJFTNjTptWbu2+A==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.52.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.3.tgz", + "integrity": "sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "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==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@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" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.29.3.tgz", + "integrity": "sha512-RpLYy2sb51oNLjuu1iD3bwBqCBWUzjO0ocp+iaCP/lJtb2CPLcnC2Fftw+4sAzaMELGeWTgExSKADbdo0GFVzA==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.29.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.28.5.tgz", + "integrity": "sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "regexpu-core": "^6.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.8.tgz", + "integrity": "sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "debug": "^4.4.3", + "lodash.debounce": "^4.0.8", + "resolve": "^1.22.11" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", + "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", + "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-wrap-function": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz", + "integrity": "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==", + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@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==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.6.tgz", + "integrity": "sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", + "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.3.tgz", + "integrity": "sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.28.5.tgz", + "integrity": "sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", + "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", + "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array": { + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array/-/plugin-bugfix-safari-rest-destructuring-rhs-array-7.29.3.tgz", + "integrity": "sha512-SRS46DFR4HqzUzCVgi90/xMoL+zeBDBvWdKYXSEzh79kXswNFEglUpMKxR04//dPqwYXWUBJ3mpUd933ru9Kmg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", + "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.6.tgz", + "integrity": "sha512-a0aBScVTlNaiUe35UtfxAN7A/tehvvG4/ByO6+46VPKTRSlfnAFsgKy0FUh+qAkQrDTmhDkT+IBOKlOoMUxQ0g==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.28.6.tgz", + "integrity": "sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", + "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz", + "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz", + "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", + "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.0.tgz", + "integrity": "sha512-va0VdWro4zlBr2JsXC+ofCPB2iG12wPtVGTWFx2WLDOM3nYQZZIGP82qku2eW/JR83sD+k2k+CsNtyEbUqhU6w==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-remap-async-to-generator": "^7.27.1", + "@babel/traverse": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.28.6.tgz", + "integrity": "sha512-ilTRcmbuXjsMmcZ3HASTe4caH5Tpo93PkTxF9oG2VZsSWsahydmcEHhix9Ik122RcTnZnUzPbmux4wh1swfv7g==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-remap-async-to-generator": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", + "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.6.tgz", + "integrity": "sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.28.6.tgz", + "integrity": "sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.6.tgz", + "integrity": "sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.6.tgz", + "integrity": "sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-globals": "^7.28.0", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-replace-supers": "^7.28.6", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.28.6.tgz", + "integrity": "sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/template": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz", + "integrity": "sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.28.6.tgz", + "integrity": "sha512-SljjowuNKB7q5Oayv4FoPzeB74g3QgLt8IVJw9ADvWy3QnUb/01aw8I4AVv8wYnPvQz2GDDZ/g3GhcNyDBI4Bg==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", + "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.29.0.tgz", + "integrity": "sha512-zBPcW2lFGxdiD8PUnPwJjag2J9otbcLQzvbiOzDxpYXyCuYX9agOwMPGn1prVH0a4qzhCKu24rlH4c1f7yA8rw==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", + "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-explicit-resource-management": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.6.tgz", + "integrity": "sha512-Iao5Konzx2b6g7EPqTy40UZbcdXE126tTxVFr/nAIj+WItNxjKSYTEw3RC+A2/ZetmdJsgueL1KhaMCQHkLPIg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.6.tgz", + "integrity": "sha512-WitabqiGjV/vJ0aPOLSFfNY1u9U3R7W36B03r5I2KoNix+a3sOhJ3pKFB3R5It9/UiK78NiO0KE9P21cMhlPkw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", + "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", + "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", + "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.28.6.tgz", + "integrity": "sha512-Nr+hEN+0geQkzhbdgQVPoqr47lZbm+5fCUmO70722xJZd0Mvb59+33QLImGj6F+DkK3xgDi1YVysP8whD6FQAw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", + "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.6.tgz", + "integrity": "sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", + "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", + "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.28.6.tgz", + "integrity": "sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.0.tgz", + "integrity": "sha512-PrujnVFbOdUpw4UHiVwKvKRLMMic8+eC0CuNlxjsyZUiBjhFdPsewdXCkveh2KqBA9/waD0W1b4hXSOBQJezpQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", + "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.0.tgz", + "integrity": "sha512-1CZQA5KNAD6ZYQLPw7oi5ewtDNxH/2vuCh+6SmvgDfhumForvs8a1o9n0UrEoBD8HU4djO2yWngTQlXl1NDVEQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", + "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.28.6.tgz", + "integrity": "sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.28.6.tgz", + "integrity": "sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.6.tgz", + "integrity": "sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", + "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.28.6.tgz", + "integrity": "sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.6.tgz", + "integrity": "sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", + "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.28.6.tgz", + "integrity": "sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.28.6.tgz", + "integrity": "sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", + "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-constant-elements": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.27.1.tgz", + "integrity": "sha512-edoidOjl/ZxvYo4lSBOQGDSyToYVkTAwyVoa2tkuYTSmjrB1+uAedoL5iROVLXkxH+vRgA7uP4tMg2pUJpZ3Ug==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.28.0.tgz", + "integrity": "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.28.6.tgz", + "integrity": "sha512-61bxqhiRfAACulXSLd/GxqmAedUSrRZIu/cbaT18T1CetkTmtDN15it7i80ru4DVqRK1WMxQhXs+Lf9kajm5Ow==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-syntax-jsx": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz", + "integrity": "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==", + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz", + "integrity": "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.0.tgz", + "integrity": "sha512-FijqlqMA7DmRdg/aINBSs04y8XNTYw/lr1gJ2WsmBnnaNw1iS43EPkJW+zK7z65auG3AWRFXWj+NcTQwYptUog==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.28.6.tgz", + "integrity": "sha512-QGWAepm9qxpaIs7UM9FvUSnCGlb8Ua1RhyM4/veAxLwt3gMat/LSGrZixyuj4I6+Kn9iwvqCyPTtbdxanYoWYg==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", + "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.29.0.tgz", + "integrity": "sha512-jlaRT5dJtMaMCV6fAuLbsQMSwz/QkvaHOHOSXRitGGwSpR1blCY4KUKoyP2tYO8vJcqYe8cEj96cqSztv3uF9w==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", + "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.28.6.tgz", + "integrity": "sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", + "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", + "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", + "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.6.tgz", + "integrity": "sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", + "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.28.6.tgz", + "integrity": "sha512-4Wlbdl/sIZjzi/8St0evF0gEZrgOswVO6aOzqxh1kDZOl9WmLrHq2HtGhnOJZmHZYKP8WZ1MDLCt5DAWwRo57A==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", + "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.28.6.tgz", + "integrity": "sha512-/wHc/paTUmsDYN7SZkpWxogTOBNnlx7nBQYfy6JJlCT7G3mVhltk3e++N7zV0XfgGsrqBxd4rJQt9H16I21Y1Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.29.3.tgz", + "integrity": "sha512-ySZypNLAIH1ClygLDQzVMoGQRViATnkHkYYV6TcNDz+8+jwZCdsguGvsb3EY5d9wyWyhmF1iSuFM0Yh5XPnqSA==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.3", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", + "@babel/plugin-bugfix-safari-rest-destructuring-rhs-array": "^7.29.3", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.6", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.28.6", + "@babel/plugin-syntax-import-attributes": "^7.28.6", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.29.0", + "@babel/plugin-transform-async-to-generator": "^7.28.6", + "@babel/plugin-transform-block-scoped-functions": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.28.6", + "@babel/plugin-transform-class-properties": "^7.28.6", + "@babel/plugin-transform-class-static-block": "^7.28.6", + "@babel/plugin-transform-classes": "^7.28.6", + "@babel/plugin-transform-computed-properties": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5", + "@babel/plugin-transform-dotall-regex": "^7.28.6", + "@babel/plugin-transform-duplicate-keys": "^7.27.1", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.29.0", + "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-explicit-resource-management": "^7.28.6", + "@babel/plugin-transform-exponentiation-operator": "^7.28.6", + "@babel/plugin-transform-export-namespace-from": "^7.27.1", + "@babel/plugin-transform-for-of": "^7.27.1", + "@babel/plugin-transform-function-name": "^7.27.1", + "@babel/plugin-transform-json-strings": "^7.28.6", + "@babel/plugin-transform-literals": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.28.6", + "@babel/plugin-transform-member-expression-literals": "^7.27.1", + "@babel/plugin-transform-modules-amd": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.28.6", + "@babel/plugin-transform-modules-systemjs": "^7.29.0", + "@babel/plugin-transform-modules-umd": "^7.27.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.29.0", + "@babel/plugin-transform-new-target": "^7.27.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.28.6", + "@babel/plugin-transform-numeric-separator": "^7.28.6", + "@babel/plugin-transform-object-rest-spread": "^7.28.6", + "@babel/plugin-transform-object-super": "^7.27.1", + "@babel/plugin-transform-optional-catch-binding": "^7.28.6", + "@babel/plugin-transform-optional-chaining": "^7.28.6", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/plugin-transform-private-methods": "^7.28.6", + "@babel/plugin-transform-private-property-in-object": "^7.28.6", + "@babel/plugin-transform-property-literals": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.29.0", + "@babel/plugin-transform-regexp-modifiers": "^7.28.6", + "@babel/plugin-transform-reserved-words": "^7.27.1", + "@babel/plugin-transform-shorthand-properties": "^7.27.1", + "@babel/plugin-transform-spread": "^7.28.6", + "@babel/plugin-transform-sticky-regex": "^7.27.1", + "@babel/plugin-transform-template-literals": "^7.27.1", + "@babel/plugin-transform-typeof-symbol": "^7.27.1", + "@babel/plugin-transform-unicode-escapes": "^7.27.1", + "@babel/plugin-transform-unicode-property-regex": "^7.28.6", + "@babel/plugin-transform-unicode-regex": "^7.27.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.28.6", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.15", + "babel-plugin-polyfill-corejs3": "^0.14.0", + "babel-plugin-polyfill-regenerator": "^0.6.6", + "core-js-compat": "^3.48.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.2.tgz", + "integrity": "sha512-coWpDLJ410R781Npmn/SIBZEsAetR4xVi0SxLMXPaMO4lSf1MwnkGYMtkFxew0Dn8B3/CpbpYxN0JCgg8mn67g==", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.8", + "core-js-compat": "^3.48.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.28.5.tgz", + "integrity": "sha512-Z3J8vhRq7CeLjdC58jLv4lnZ5RKFUJWqH5emvxmv9Hv3BD1T9R/Im713R4MTKwvFaV74ejZ3sM01LyEKk4ugNQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-transform-react-display-name": "^7.28.0", + "@babel/plugin-transform-react-jsx": "^7.27.1", + "@babel/plugin-transform-react-jsx-development": "^7.27.1", + "@babel/plugin-transform-react-pure-annotations": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.28.5.tgz", + "integrity": "sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-typescript": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz", + "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@csstools/cascade-layer-name-parser": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.5.tgz", + "integrity": "sha512-p1ko5eHgV+MgXFVa4STPKpvPxr6ReS8oS2jzTukjR74i5zJNyWO1ZM1m8YKBXnzDKWfBN1ztLYlHxbVemDD88A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/color-helpers": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", + "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/css-calc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", + "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", + "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^5.1.0", + "@csstools/css-calc": "^2.1.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/media-query-list-parser": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.3.tgz", + "integrity": "sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/postcss-alpha-function": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-alpha-function/-/postcss-alpha-function-1.0.1.tgz", + "integrity": "sha512-isfLLwksH3yHkFXfCI2Gcaqg7wGGHZZwunoJzEZk0yKYIokgre6hYVFibKL3SYAoR1kBXova8LB+JoO5vZzi9w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-cascade-layers": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-5.0.2.tgz", + "integrity": "sha512-nWBE08nhO8uWl6kSAeCx4im7QfVko3zLrtgWZY4/bP87zrSPpSyN/3W3TDqz1jJuH+kbKOHXg5rJnK+ZVYcFFg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-cascade-layers/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/@csstools/postcss-cascade-layers/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@csstools/postcss-color-function": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-4.0.12.tgz", + "integrity": "sha512-yx3cljQKRaSBc2hfh8rMZFZzChaFgwmO2JfFgFr1vMcF3C/uyy5I4RFIBOIWGq1D+XbKCG789CGkG6zzkLpagA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-color-function-display-p3-linear": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function-display-p3-linear/-/postcss-color-function-display-p3-linear-1.0.1.tgz", + "integrity": "sha512-E5qusdzhlmO1TztYzDIi8XPdPoYOjoTY6HBYBCYSj+Gn4gQRBlvjgPQXzfzuPQqt8EhkC/SzPKObg4Mbn8/xMg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-color-mix-function": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-3.0.12.tgz", + "integrity": "sha512-4STERZfCP5Jcs13P1U5pTvI9SkgLgfMUMhdXW8IlJWkzOOOqhZIjcNhWtNJZes2nkBDsIKJ0CJtFtuaZ00moag==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-color-mix-variadic-function-arguments": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-variadic-function-arguments/-/postcss-color-mix-variadic-function-arguments-1.0.2.tgz", + "integrity": "sha512-rM67Gp9lRAkTo+X31DUqMEq+iK+EFqsidfecmhrteErxJZb6tUoJBVQca1Vn1GpDql1s1rD1pKcuYzMsg7Z1KQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-content-alt-text": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-content-alt-text/-/postcss-content-alt-text-2.0.8.tgz", + "integrity": "sha512-9SfEW9QCxEpTlNMnpSqFaHyzsiRpZ5J5+KqCu1u5/eEJAWsMhzT40qf0FIbeeglEvrGRMdDzAxMIz3wqoGSb+Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-contrast-color-function": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-contrast-color-function/-/postcss-contrast-color-function-2.0.12.tgz", + "integrity": "sha512-YbwWckjK3qwKjeYz/CijgcS7WDUCtKTd8ShLztm3/i5dhh4NaqzsbYnhm4bjrpFpnLZ31jVcbK8YL77z3GBPzA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-exponential-functions": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-2.0.9.tgz", + "integrity": "sha512-abg2W/PI3HXwS/CZshSa79kNWNZHdJPMBXeZNyPQFbbj8sKO3jXxOt/wF7juJVjyDTc6JrvaUZYFcSBZBhaxjw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-font-format-keywords": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-4.0.0.tgz", + "integrity": "sha512-usBzw9aCRDvchpok6C+4TXC57btc4bJtmKQWOHQxOVKen1ZfVqBUuCZ/wuqdX5GHsD0NRSr9XTP+5ID1ZZQBXw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-gamut-mapping": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-2.0.11.tgz", + "integrity": "sha512-fCpCUgZNE2piVJKC76zFsgVW1apF6dpYsqGyH8SIeCcM4pTEsRTWTLCaJIMKFEundsCKwY1rwfhtrio04RJ4Dw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-gradients-interpolation-method": { + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-5.0.12.tgz", + "integrity": "sha512-jugzjwkUY0wtNrZlFeyXzimUL3hN4xMvoPnIXxoZqxDvjZRiSh+itgHcVUWzJ2VwD/VAMEgCLvtaJHX+4Vj3Ow==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-hwb-function": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-4.0.12.tgz", + "integrity": "sha512-mL/+88Z53KrE4JdePYFJAQWFrcADEqsLprExCM04GDNgHIztwFzj0Mbhd/yxMBngq0NIlz58VVxjt5abNs1VhA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-ic-unit": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-4.0.4.tgz", + "integrity": "sha512-yQ4VmossuOAql65sCPppVO1yfb7hDscf4GseF0VCA/DTDaBc0Wtf8MTqVPfjGYlT5+2buokG0Gp7y0atYZpwjg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-initial": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-initial/-/postcss-initial-2.0.1.tgz", + "integrity": "sha512-L1wLVMSAZ4wovznquK0xmC7QSctzO4D0Is590bxpGqhqjboLXYA16dWZpfwImkdOgACdQ9PqXsuRroW6qPlEsg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-is-pseudo-class": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-5.0.3.tgz", + "integrity": "sha512-jS/TY4SpG4gszAtIg7Qnf3AS2pjcUM5SzxpApOrlndMeGhIbaTzWBzzP/IApXoNWEW7OhcjkRT48jnAUIFXhAQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-is-pseudo-class/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/@csstools/postcss-is-pseudo-class/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@csstools/postcss-light-dark-function": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-2.0.11.tgz", + "integrity": "sha512-fNJcKXJdPM3Lyrbmgw2OBbaioU7yuKZtiXClf4sGdQttitijYlZMD5K7HrC/eF83VRWRrYq6OZ0Lx92leV2LFA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-float-and-clear": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-float-and-clear/-/postcss-logical-float-and-clear-3.0.0.tgz", + "integrity": "sha512-SEmaHMszwakI2rqKRJgE+8rpotFfne1ZS6bZqBoQIicFyV+xT1UF42eORPxJkVJVrH9C0ctUgwMSn3BLOIZldQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-overflow": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overflow/-/postcss-logical-overflow-2.0.0.tgz", + "integrity": "sha512-spzR1MInxPuXKEX2csMamshR4LRaSZ3UXVaRGjeQxl70ySxOhMpP2252RAFsg8QyyBXBzuVOOdx1+bVO5bPIzA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-overscroll-behavior": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overscroll-behavior/-/postcss-logical-overscroll-behavior-2.0.0.tgz", + "integrity": "sha512-e/webMjoGOSYfqLunyzByZj5KKe5oyVg/YSbie99VEaSDE2kimFm0q1f6t/6Jo+VVCQ/jbe2Xy+uX+C4xzWs4w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-resize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-resize/-/postcss-logical-resize-3.0.0.tgz", + "integrity": "sha512-DFbHQOFW/+I+MY4Ycd/QN6Dg4Hcbb50elIJCfnwkRTCX05G11SwViI5BbBlg9iHRl4ytB7pmY5ieAFk3ws7yyg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-viewport-units": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-3.0.4.tgz", + "integrity": "sha512-q+eHV1haXA4w9xBwZLKjVKAWn3W2CMqmpNpZUk5kRprvSiBEGMgrNH3/sJZ8UA3JgyHaOt3jwT9uFa4wLX4EqQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-media-minmax": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-2.0.9.tgz", + "integrity": "sha512-af9Qw3uS3JhYLnCbqtZ9crTvvkR+0Se+bBqSr7ykAnl9yKhk6895z9rf+2F4dClIDJWxgn0iZZ1PSdkhrbs2ig==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-media-queries-aspect-ratio-number-values": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-3.0.5.tgz", + "integrity": "sha512-zhAe31xaaXOY2Px8IYfoVTB3wglbJUVigGphFLj6exb7cjZRH9A6adyE22XfFK3P2PzwRk0VDeTJmaxpluyrDg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-nested-calc": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-4.0.0.tgz", + "integrity": "sha512-jMYDdqrQQxE7k9+KjstC3NbsmC063n1FTPLCgCRS2/qHUbHM0mNy9pIn4QIiQGs9I/Bg98vMqw7mJXBxa0N88A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-normalize-display-values": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.1.tgz", + "integrity": "sha512-TQUGBuRvxdc7TgNSTevYqrL8oItxiwPDixk20qCB5me/W8uF7BPbhRrAvFuhEoywQp/woRsUZ6SJ+sU5idZAIA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-oklab-function": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.12.tgz", + "integrity": "sha512-HhlSmnE1NKBhXsTnNGjxvhryKtO7tJd1w42DKOGFD6jSHtYOrsJTQDKPMwvOfrzUAk8t7GcpIfRyM7ssqHpFjg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-position-area-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-position-area-property/-/postcss-position-area-property-1.0.0.tgz", + "integrity": "sha512-fUP6KR8qV2NuUZV3Cw8itx0Ep90aRjAZxAEzC3vrl6yjFv+pFsQbR18UuQctEKmA72K9O27CoYiKEgXxkqjg8Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-progressive-custom-properties": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.2.1.tgz", + "integrity": "sha512-uPiiXf7IEKtUQXsxu6uWtOlRMXd2QWWy5fhxHDnPdXKCQckPP3E34ZgDoZ62r2iT+UOgWsSbM4NvHE5m3mAEdw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-property-rule-prelude-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-property-rule-prelude-list/-/postcss-property-rule-prelude-list-1.0.0.tgz", + "integrity": "sha512-IxuQjUXq19fobgmSSvUDO7fVwijDJaZMvWQugxfEUxmjBeDCVaDuMpsZ31MsTm5xbnhA+ElDi0+rQ7sQQGisFA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-random-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-random-function/-/postcss-random-function-2.0.1.tgz", + "integrity": "sha512-q+FQaNiRBhnoSNo+GzqGOIBKoHQ43lYz0ICrV+UudfWnEF6ksS6DsBIJSISKQT2Bvu3g4k6r7t0zYrk5pDlo8w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-relative-color-syntax": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-3.0.12.tgz", + "integrity": "sha512-0RLIeONxu/mtxRtf3o41Lq2ghLimw0w9ByLWnnEVuy89exmEEq8bynveBxNW3nyHqLAFEeNtVEmC1QK9MZ8Huw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-scope-pseudo-class": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-scope-pseudo-class/-/postcss-scope-pseudo-class-4.0.1.tgz", + "integrity": "sha512-IMi9FwtH6LMNuLea1bjVMQAsUhFxJnyLSgOp/cpv5hrzWmrUYU5fm0EguNDIIOHUqzXode8F/1qkC/tEo/qN8Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-scope-pseudo-class/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@csstools/postcss-sign-functions": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-sign-functions/-/postcss-sign-functions-1.1.4.tgz", + "integrity": "sha512-P97h1XqRPcfcJndFdG95Gv/6ZzxUBBISem0IDqPZ7WMvc/wlO+yU0c5D/OCpZ5TJoTt63Ok3knGk64N+o6L2Pg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-stepped-value-functions": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-4.0.9.tgz", + "integrity": "sha512-h9btycWrsex4dNLeQfyU3y3w40LMQooJWFMm/SK9lrKguHDcFl4VMkncKKoXi2z5rM9YGWbUQABI8BT2UydIcA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-syntax-descriptor-syntax-production": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-syntax-descriptor-syntax-production/-/postcss-syntax-descriptor-syntax-production-1.0.1.tgz", + "integrity": "sha512-GneqQWefjM//f4hJ/Kbox0C6f2T7+pi4/fqTqOFGTL3EjnvOReTqO1qUQ30CaUjkwjYq9qZ41hzarrAxCc4gow==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-system-ui-font-family": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-system-ui-font-family/-/postcss-system-ui-font-family-1.0.0.tgz", + "integrity": "sha512-s3xdBvfWYfoPSBsikDXbuorcMG1nN1M6GdU0qBsGfcmNR0A/qhloQZpTxjA3Xsyrk1VJvwb2pOfiOT3at/DuIQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-text-decoration-shorthand": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-4.0.3.tgz", + "integrity": "sha512-KSkGgZfx0kQjRIYnpsD7X2Om9BUXX/Kii77VBifQW9Ih929hK0KNjVngHDH0bFB9GmfWcR9vJYJJRvw/NQjkrA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/color-helpers": "^5.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-trigonometric-functions": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-4.0.9.tgz", + "integrity": "sha512-Hnh5zJUdpNrJqK9v1/E3BbrQhaDTj5YiX7P61TOvUhoDHnUmsNNxcDAgkQ32RrcWx9GVUvfUNPcUkn8R3vIX6A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-unset-value": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-4.0.0.tgz", + "integrity": "sha512-cBz3tOCI5Fw6NIFEwU3RiwK6mn3nKegjpJuzCndoGq3BZPkUjnsq7uQmIeMNeMbMk7YD2MfKcgCpZwX5jyXqCA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/utilities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/utilities/-/utilities-2.0.0.tgz", + "integrity": "sha512-5VdOr0Z71u+Yp3ozOx8T11N703wIFGVRgOWbOZMKgglPJsWA54MRIoMNVMa7shUToIhx5J8vX4sOZgD2XiihiQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@docsearch/core": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/@docsearch/core/-/core-4.6.3.tgz", + "integrity": "sha512-rUOujwIpxJRgD7+kicVsI3D5sqBvdiRTquzWBpTEXZs8ZXfGbfzpus5HqumaNYTppN2HvH8E2yNuRwYdHJeOlA==", + "license": "MIT", + "peerDependencies": { + "@types/react": ">= 16.8.0 < 20.0.0", + "react": ">= 16.8.0 < 20.0.0", + "react-dom": ">= 16.8.0 < 20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@docsearch/css": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-4.6.3.tgz", + "integrity": "sha512-nlOwcXcsNAptQl4vlL4MA78qNJKO0Qlds5GuBjCoePgkebTXLSf8Qt1oyZ3YBshYupKXG9VRGEsk1zr23d+bzQ==", + "license": "MIT" + }, + "node_modules/@docsearch/react": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-4.6.3.tgz", + "integrity": "sha512-Bg2wdDsoQVlNCcEKuEJAU04tvHCqgx8rIu+uIoM4pRtcx3TBKJuXutJik3LTA8LRc9YEyHkrYUrmcC0D7BYf+g==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-core": "1.19.2", + "@docsearch/core": "4.6.3", + "@docsearch/css": "4.6.3" + }, + "peerDependencies": { + "@types/react": ">= 16.8.0 < 20.0.0", + "react": ">= 16.8.0 < 20.0.0", + "react-dom": ">= 16.8.0 < 20.0.0", + "search-insights": ">= 1 < 3" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "search-insights": { + "optional": true + } + } + }, + "node_modules/@docsearch/react/node_modules/@algolia/autocomplete-core": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.19.2.tgz", + "integrity": "sha512-mKv7RyuAzXvwmq+0XRK8HqZXt9iZ5Kkm2huLjgn5JoCPtDy+oh9yxUMfDDaVCw0oyzZ1isdJBc7l9nuCyyR7Nw==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-plugin-algolia-insights": "1.19.2", + "@algolia/autocomplete-shared": "1.19.2" + } + }, + "node_modules/@docsearch/react/node_modules/@algolia/autocomplete-plugin-algolia-insights": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.19.2.tgz", + "integrity": "sha512-TjxbcC/r4vwmnZaPwrHtkXNeqvlpdyR+oR9Wi2XyfORkiGkLTVhX2j+O9SaCCINbKoDfc+c2PB8NjfOnz7+oKg==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-shared": "1.19.2" + }, + "peerDependencies": { + "search-insights": ">= 1 < 3" + } + }, + "node_modules/@docsearch/react/node_modules/@algolia/autocomplete-shared": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.19.2.tgz", + "integrity": "sha512-jEazxZTVD2nLrC+wYlVHQgpBoBB5KPStrJxLzsIFl6Kqd1AlG9sIAGl39V5tECLpIQzB3Qa2T6ZPJ1ChkwMK/w==", + "license": "MIT", + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@docusaurus/babel": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/babel/-/babel-3.10.1.tgz", + "integrity": "sha512-DZzFO1K3v/GoEt1fx1DiYHF4en+PuhtQf1AkQJa5zu3CoeKSpr5cpQRUlz3jr0m44wyzmSXu9bVpfir+N4+8bg==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.25.9", + "@babel/generator": "^7.25.9", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.25.9", + "@babel/preset-env": "^7.25.9", + "@babel/preset-react": "^7.25.9", + "@babel/preset-typescript": "^7.25.9", + "@babel/runtime": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@docusaurus/logger": "3.10.1", + "@docusaurus/utils": "3.10.1", + "babel-plugin-dynamic-import-node": "^2.3.3", + "fs-extra": "^11.1.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/bundler": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/bundler/-/bundler-3.10.1.tgz", + "integrity": "sha512-HIqQPvbqnnQRe4NsBd1774KRarjXqS6wHsWELtyuSs1gCfvixJO2jUGH/OEBtr1Gvzpw+ze5CjGMvSJ8UE1KUw==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.25.9", + "@docusaurus/babel": "3.10.1", + "@docusaurus/cssnano-preset": "3.10.1", + "@docusaurus/logger": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils": "3.10.1", + "babel-loader": "^9.2.1", + "clean-css": "^5.3.3", + "copy-webpack-plugin": "^11.0.0", + "css-loader": "^6.11.0", + "css-minimizer-webpack-plugin": "^5.0.1", + "cssnano": "^6.1.2", + "file-loader": "^6.2.0", + "html-minifier-terser": "^7.2.0", + "mini-css-extract-plugin": "^2.9.2", + "null-loader": "^4.0.1", + "postcss": "^8.5.4", + "postcss-loader": "^7.3.4", + "postcss-preset-env": "^10.2.1", + "terser-webpack-plugin": "^5.3.9", + "tslib": "^2.6.0", + "url-loader": "^4.1.1", + "webpack": "^5.95.0", + "webpackbar": "^7.0.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "@docusaurus/faster": "*" + }, + "peerDependenciesMeta": { + "@docusaurus/faster": { + "optional": true + } + } + }, + "node_modules/@docusaurus/core": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.10.1.tgz", + "integrity": "sha512-3pf2fXXw0eVk8WnC3T4LIigRDupcpvngpKo9Vy7mYyBhuddc0klDUuZAIfzMoK6z05pdlk6EFC/vBSX43+1O5w==", + "license": "MIT", + "dependencies": { + "@docusaurus/babel": "3.10.1", + "@docusaurus/bundler": "3.10.1", + "@docusaurus/logger": "3.10.1", + "@docusaurus/mdx-loader": "3.10.1", + "@docusaurus/utils": "3.10.1", + "@docusaurus/utils-common": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", + "boxen": "^6.2.1", + "chalk": "^4.1.2", + "chokidar": "^3.5.3", + "cli-table3": "^0.6.3", + "combine-promises": "^1.1.0", + "commander": "^5.1.0", + "core-js": "^3.31.1", + "detect-port": "^1.5.1", + "escape-html": "^1.0.3", + "eta": "^2.2.0", + "eval": "^0.1.8", + "execa": "^5.1.1", + "fs-extra": "^11.1.1", + "html-tags": "^3.3.1", + "html-webpack-plugin": "^5.6.0", + "leven": "^3.1.0", + "lodash": "^4.17.21", + "open": "^8.4.0", + "p-map": "^4.0.0", + "prompts": "^2.4.2", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "react-loadable": "npm:@docusaurus/react-loadable@6.0.0", + "react-loadable-ssr-addon-v5-slorber": "^1.0.3", + "react-router": "^5.3.4", + "react-router-config": "^5.1.1", + "react-router-dom": "^5.3.4", + "semver": "^7.5.4", + "serve-handler": "^6.1.7", + "tinypool": "^1.0.2", + "tslib": "^2.6.0", + "update-notifier": "^6.0.2", + "webpack": "^5.95.0", + "webpack-bundle-analyzer": "^4.10.2", + "webpack-dev-server": "^5.2.2", + "webpack-merge": "^6.0.1" + }, + "bin": { + "docusaurus": "bin/docusaurus.mjs" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "@docusaurus/faster": "*", + "@mdx-js/react": "^3.0.0", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@docusaurus/faster": { + "optional": true + } + } + }, + "node_modules/@docusaurus/cssnano-preset": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.10.1.tgz", + "integrity": "sha512-eNfHGcTKCSq6xmcavAkX3RRclHaE2xRCMParlDXLdXVP01/a2e/jKXMj/0ULnLFQSNwwuI62L0Ge8J+nZsR7UQ==", + "license": "MIT", + "dependencies": { + "cssnano-preset-advanced": "^6.1.2", + "postcss": "^8.5.4", + "postcss-sort-media-queries": "^5.2.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/logger": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.10.1.tgz", + "integrity": "sha512-oPjNFnfJsRCkePVjkGrxWGq4MvJKRQT0r9jOP0eRBTZ7Wr9FAbzdP/Gjs0I2Ss6YRkPoEgygKG112OkE6skvJw==", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/mdx-loader": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.10.1.tgz", + "integrity": "sha512-GRmeb/wQ+iXRrFwcHBfgQhrJxGElgCsoTWZYDhccjsZVne1p8MK/EpQVIloXttz76TCe78kKD5AEG9n1xc1oxQ==", + "license": "MIT", + "dependencies": { + "@docusaurus/logger": "3.10.1", + "@docusaurus/utils": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", + "@mdx-js/mdx": "^3.0.0", + "@slorber/remark-comment": "^1.0.0", + "escape-html": "^1.0.3", + "estree-util-value-to-estree": "^3.0.1", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "image-size": "^2.0.2", + "mdast-util-mdx": "^3.0.0", + "mdast-util-to-string": "^4.0.0", + "rehype-raw": "^7.0.0", + "remark-directive": "^3.0.0", + "remark-emoji": "^4.0.0", + "remark-frontmatter": "^5.0.0", + "remark-gfm": "^4.0.0", + "stringify-object": "^3.3.0", + "tslib": "^2.6.0", + "unified": "^11.0.3", + "unist-util-visit": "^5.0.0", + "url-loader": "^4.1.1", + "vfile": "^6.0.1", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/module-type-aliases": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.10.1.tgz", + "integrity": "sha512-YoOZKUdGlp8xSYhuAkGdSo5Ydkbq4V4eK3sD8v0a2hloxCWdQbNBhkc+Ko9QyjpESc0BYcIGM5iHVAy5hdFV6w==", + "license": "MIT", + "dependencies": { + "@docusaurus/types": "3.10.1", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "@types/react-router-dom": "*", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "react-loadable": "npm:@docusaurus/react-loadable@6.0.0" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/@docusaurus/plugin-content-blog": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.10.1.tgz", + "integrity": "sha512-mmkgE6Q2+K74tnkou7tXlpDLvoCU/qkSa2GSQ3XUiHWvcebCoDQzS670RR3tO8PmaWlIyWWISYWzZLuMfxunRA==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.1", + "@docusaurus/logger": "3.10.1", + "@docusaurus/mdx-loader": "3.10.1", + "@docusaurus/theme-common": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils": "3.10.1", + "@docusaurus/utils-common": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", + "cheerio": "1.0.0-rc.12", + "combine-promises": "^1.1.0", + "feed": "^4.2.2", + "fs-extra": "^11.1.1", + "lodash": "^4.17.21", + "schema-dts": "^1.1.2", + "srcset": "^4.0.0", + "tslib": "^2.6.0", + "unist-util-visit": "^5.0.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "@docusaurus/plugin-content-docs": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-docs": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.10.1.tgz", + "integrity": "sha512-2jRVrtzjf8LClGTHQlwlwuD3wQXRx3WEoF7XUarJ8Ou+0onV+SLtejsyfY9JLpfUh9hPhXM4pbBGkyAY4Bi3HQ==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.1", + "@docusaurus/logger": "3.10.1", + "@docusaurus/mdx-loader": "3.10.1", + "@docusaurus/module-type-aliases": "3.10.1", + "@docusaurus/theme-common": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils": "3.10.1", + "@docusaurus/utils-common": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", + "@types/react-router-config": "^5.0.7", + "combine-promises": "^1.1.0", + "fs-extra": "^11.1.1", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "schema-dts": "^1.1.2", + "tslib": "^2.6.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-pages": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.10.1.tgz", + "integrity": "sha512-huJpaRPMl42nsFwuCXvV8bVDj2MazuwRJIUylI/RSlmZeJssVoZXeCjVf1y+1Drtpa9SKcdGn8yoJ76IRJijtw==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.1", + "@docusaurus/mdx-loader": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", + "fs-extra": "^11.1.1", + "tslib": "^2.6.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-css-cascade-layers": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-css-cascade-layers/-/plugin-css-cascade-layers-3.10.1.tgz", + "integrity": "sha512-r//fn+MNHkE1wCof8T29VAQezt1enGCpsFxoziBbvLgBM4JfXN2P3rxrBaavHmvLvm7lYkpJeitcDthwnmWCTw==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/plugin-debug": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.10.1.tgz", + "integrity": "sha512-9KqOpKNfAyqGZykRb9LhIT/vyRF6sm/ykhjj/39JvaJahDS+jZJE0Z1Wfz9q3DUNDTMNN0Q7u/kk4rKKU+IJuA==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils": "3.10.1", + "fs-extra": "^11.1.1", + "react-json-view-lite": "^2.3.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-analytics": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.10.1.tgz", + "integrity": "sha512-8o0P1KtmgdYQHH+oInitPpRWI0Of5XednAX4+DMhQNSmGSRNrsEEHg1ebv35m9AgRClfAytCJ5jA9KvcASTyuA==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-gtag": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.10.1.tgz", + "integrity": "sha512-pu3xIUo5o/zCMLfUY9BO5KOwSH0zIsAGyFRPvXHayFSA5XIhCU/SFuB0g0ZNjFn9niZLCaNvoeAuOGFJZq0fdw==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", + "@types/gtag.js": "^0.0.20", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-tag-manager": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.10.1.tgz", + "integrity": "sha512-f6fyGHiCm7kJHBtAisGQS5oNBnpnMTYQZxDXeVrnw/3zWU+LMA22pr6UHGYkBKDbN+qPC5QHG3NuOfzQLq3+Lw==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-sitemap": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.10.1.tgz", + "integrity": "sha512-C26MbmmqgdjkDq1htaZ3aD7LzEDKFWXfpyQpt0EOUThuq5nV77zDaedV20yHcVo9p+3ey9aZ4pbHA0D3QcZTzg==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.1", + "@docusaurus/logger": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils": "3.10.1", + "@docusaurus/utils-common": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", + "fs-extra": "^11.1.1", + "sitemap": "^7.1.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-svgr": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-svgr/-/plugin-svgr-3.10.1.tgz", + "integrity": "sha512-6SFxsmjWFkVLDmBUvFK6i72QjUwqyQFe4Ovz+SUJophJjOyVG3ZZG5IQpBC/kX/Gfv1yWeU9nWauH6F6Q7QX/Q==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", + "@svgr/core": "8.1.0", + "@svgr/webpack": "^8.1.0", + "tslib": "^2.6.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/preset-classic": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.10.1.tgz", + "integrity": "sha512-YO/FL8v1zmbxoTso6mjMz/RDjhaTJxb1UpFFTDdY5847LLDCeyYiYlrhyTbgN1RIN3xnkLKZ9Lj1x8hUzI4JOg==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.1", + "@docusaurus/plugin-content-blog": "3.10.1", + "@docusaurus/plugin-content-docs": "3.10.1", + "@docusaurus/plugin-content-pages": "3.10.1", + "@docusaurus/plugin-css-cascade-layers": "3.10.1", + "@docusaurus/plugin-debug": "3.10.1", + "@docusaurus/plugin-google-analytics": "3.10.1", + "@docusaurus/plugin-google-gtag": "3.10.1", + "@docusaurus/plugin-google-tag-manager": "3.10.1", + "@docusaurus/plugin-sitemap": "3.10.1", + "@docusaurus/plugin-svgr": "3.10.1", + "@docusaurus/theme-classic": "3.10.1", + "@docusaurus/theme-common": "3.10.1", + "@docusaurus/theme-search-algolia": "3.10.1", + "@docusaurus/types": "3.10.1" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/theme-classic": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.10.1.tgz", + "integrity": "sha512-VU1RK0qb2pab0si4r7HFK37cYco8VzqLj3u1PspVipSr/z/GPVKHO4/HXbnePqHoWDk8urjyGSeatH0NIMBM1A==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.1", + "@docusaurus/logger": "3.10.1", + "@docusaurus/mdx-loader": "3.10.1", + "@docusaurus/module-type-aliases": "3.10.1", + "@docusaurus/plugin-content-blog": "3.10.1", + "@docusaurus/plugin-content-docs": "3.10.1", + "@docusaurus/plugin-content-pages": "3.10.1", + "@docusaurus/theme-common": "3.10.1", + "@docusaurus/theme-translations": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils": "3.10.1", + "@docusaurus/utils-common": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", + "@mdx-js/react": "^3.0.0", + "clsx": "^2.0.0", + "copy-text-to-clipboard": "^3.2.0", + "infima": "0.2.0-alpha.45", + "lodash": "^4.17.21", + "nprogress": "^0.2.0", + "postcss": "^8.5.4", + "prism-react-renderer": "^2.3.0", + "prismjs": "^1.29.0", + "react-router-dom": "^5.3.4", + "rtlcss": "^4.1.0", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/theme-common": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.10.1.tgz", + "integrity": "sha512-0YtmIeoNo1fIw65LO8+/1dPgmDV86UmhMkow37gzjytuiCSQm9xob6PJy0L4kuQEMTLfUOGvkXvZr7GPrHquMA==", + "license": "MIT", + "dependencies": { + "@docusaurus/mdx-loader": "3.10.1", + "@docusaurus/module-type-aliases": "3.10.1", + "@docusaurus/utils": "3.10.1", + "@docusaurus/utils-common": "3.10.1", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "clsx": "^2.0.0", + "parse-numeric-range": "^1.3.0", + "prism-react-renderer": "^2.3.0", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "@docusaurus/plugin-content-docs": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/theme-search-algolia": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.10.1.tgz", + "integrity": "sha512-OTaARARVZj2GvkJQjB+1jOIxntRaXea+G+fMsNqrZBAU1O1vJKDW22R7kECOHW27oJCLFN9HKaZeRrfAUyviug==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-core": "^1.19.2", + "@docsearch/react": "^3.9.0 || ^4.3.2", + "@docusaurus/core": "3.10.1", + "@docusaurus/logger": "3.10.1", + "@docusaurus/plugin-content-docs": "3.10.1", + "@docusaurus/theme-common": "3.10.1", + "@docusaurus/theme-translations": "3.10.1", + "@docusaurus/utils": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", + "algoliasearch": "^5.37.0", + "algoliasearch-helper": "^3.26.0", + "clsx": "^2.0.0", + "eta": "^2.2.0", + "fs-extra": "^11.1.1", + "lodash": "^4.17.21", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/theme-translations": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.10.1.tgz", + "integrity": "sha512-cLMyaKivjBVWKMJuWqyFVVgtqe8DPJNPkog0bn8W1MDVAKcPdxRFycBfC1We1RaNp7Rdk513bmtW78RR6OBxBw==", + "license": "MIT", + "dependencies": { + "fs-extra": "^11.1.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/types": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.10.1.tgz", + "integrity": "sha512-XYMK8k1szDCFMw2V+Xyen0g7Kee1sP3dtFnl7vkGkZOkeAJ/oPDQPL8iz4HBKOo/cwU8QeV6onVjMqtP+tFzsw==", + "license": "MIT", + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/mdast": "^4.0.2", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.95.0", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/types/node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@docusaurus/utils": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.10.1.tgz", + "integrity": "sha512-3ojeJry9xBYdJO6qoyyzqeJFSJBVx2mXhyDzSdjwL2+URFQMf+h25gG38iswGImicK0ELjTd1EL2xzk8hf3QPw==", + "license": "MIT", + "dependencies": { + "@docusaurus/logger": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils-common": "3.10.1", + "escape-string-regexp": "^4.0.0", + "execa": "^5.1.1", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "github-slugger": "^1.5.0", + "globby": "^11.1.0", + "gray-matter": "^4.0.3", + "jiti": "^1.20.0", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "micromatch": "^4.0.5", + "p-queue": "^6.6.2", + "prompts": "^2.4.2", + "resolve-pathname": "^3.0.0", + "tslib": "^2.6.0", + "url-loader": "^4.1.1", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/utils-common": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.10.1.tgz", + "integrity": "sha512-5mFSgEADtnFxFH7RLw02QA5MpU5JVUCj0MPeIvi/aF4Fi45tQRIuTwXoXDqJ+1VfQJuYJGz3SI63wmGz4HvXzA==", + "license": "MIT", + "dependencies": { + "@docusaurus/types": "3.10.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/utils-validation": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.10.1.tgz", + "integrity": "sha512-cRv1X69jwaWv47waglllgZVWzeBFLhl53XT/XED/83BerVBTC5FTP8WTcVl8Z6sZOegDSwitu/wpCSPCDOT6lg==", + "license": "MIT", + "dependencies": { + "@docusaurus/logger": "3.10.1", + "@docusaurus/utils": "3.10.1", + "@docusaurus/utils-common": "3.10.1", + "fs-extra": "^11.2.0", + "joi": "^17.9.2", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "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==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jsonjoy.com/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/buffers": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-17.67.0.tgz", + "integrity": "sha512-tfExRpYxBvi32vPs9ZHaTjSP4fHAfzSmcahOfNxtvGHcyJel+aibkPlGeBB+7AoC6hL7lXIE++8okecBxx7lcw==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/codegen": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-1.0.0.tgz", + "integrity": "sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-core": { + "version": "4.57.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-core/-/fs-core-4.57.2.tgz", + "integrity": "sha512-SVjwklkpIV5wrynpYtuYnfYH1QF4/nDuLBX7VXdb+3miglcAgBVZb/5y0cOsehRV/9Vb+3UqhkMq3/NR3ztdkQ==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-node-builtins": "4.57.2", + "@jsonjoy.com/fs-node-utils": "4.57.2", + "thingies": "^2.5.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-fsa": { + "version": "4.57.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-fsa/-/fs-fsa-4.57.2.tgz", + "integrity": "sha512-fhO8+iR2I+OCw668ISDJdn1aArc9zx033sWejIyzQ8RBeXa9bDSaUeA3ix0poYOfrj1KdOzytmYNv2/uLDfV6g==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-core": "4.57.2", + "@jsonjoy.com/fs-node-builtins": "4.57.2", + "@jsonjoy.com/fs-node-utils": "4.57.2", + "thingies": "^2.5.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-node": { + "version": "4.57.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node/-/fs-node-4.57.2.tgz", + "integrity": "sha512-nX2AdL6cOFwLdju9G4/nbRnYevmCJbh7N7hvR3gGm97Cs60uEjyd0rpR+YBS7cTg175zzl22pGKXR5USaQMvKg==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-core": "4.57.2", + "@jsonjoy.com/fs-node-builtins": "4.57.2", + "@jsonjoy.com/fs-node-utils": "4.57.2", + "@jsonjoy.com/fs-print": "4.57.2", + "@jsonjoy.com/fs-snapshot": "4.57.2", + "glob-to-regex.js": "^1.0.0", + "thingies": "^2.5.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-node-builtins": { + "version": "4.57.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-builtins/-/fs-node-builtins-4.57.2.tgz", + "integrity": "sha512-xhiegylRmhw43Ki2HO1ZBL7DQ5ja/qpRsL29VtQ2xuUHiuDGbgf2uD4p9Qd8hJI5P6RCtGYD50IXHXVq/Ocjcg==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-node-to-fsa": { + "version": "4.57.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-to-fsa/-/fs-node-to-fsa-4.57.2.tgz", + "integrity": "sha512-18LmWTSONhoAPW+IWRuf8w/+zRolPFGPeGwMxlAhhfY11EKzX+5XHDBPAw67dBF5dxDErHJbl40U+3IXSDRXSQ==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-fsa": "4.57.2", + "@jsonjoy.com/fs-node-builtins": "4.57.2", + "@jsonjoy.com/fs-node-utils": "4.57.2" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-node-utils": { + "version": "4.57.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-utils/-/fs-node-utils-4.57.2.tgz", + "integrity": "sha512-rsPSJgekz43IlNbLyAM/Ab+ouYLWGp5DDBfYBNNEqDaSpsbXfthBn29Q4muFA9L0F+Z3mKo+CWlgSCXrf+mOyQ==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-node-builtins": "4.57.2" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-print": { + "version": "4.57.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-print/-/fs-print-4.57.2.tgz", + "integrity": "sha512-wK9NSow48i4DbDl9F1CQE5TqnyZOJ04elU3WFG5aJ76p+YxO/ulyBBQvKsessPxdo381Bc2pcEoyPujMOhcRqQ==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-node-utils": "4.57.2", + "tree-dump": "^1.1.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot": { + "version": "4.57.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-snapshot/-/fs-snapshot-4.57.2.tgz", + "integrity": "sha512-GdduDZuoP5V/QCgJkx9+BZ6SC0EZ/smXAdTS7PfMqgMTGXLlt/bH/FqMYaqB9JmLf05sJPtO0XRbAwwkEEPbVw==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/buffers": "^17.65.0", + "@jsonjoy.com/fs-node-utils": "4.57.2", + "@jsonjoy.com/json-pack": "^17.65.0", + "@jsonjoy.com/util": "^17.65.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/base64": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-17.67.0.tgz", + "integrity": "sha512-5SEsJGsm15aP8TQGkDfJvz9axgPwAEm98S5DxOuYe8e1EbfajcDmgeXXzccEjh+mLnjqEKrkBdjHWS5vFNwDdw==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/codegen": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-17.67.0.tgz", + "integrity": "sha512-idnkUplROpdBOV0HMcwhsCUS5TRUi9poagdGs70A6S4ux9+/aPuKbh8+UYRTLYQHtXvAdNfQWXDqZEx5k4Dj2Q==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/json-pack": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-17.67.0.tgz", + "integrity": "sha512-t0ejURcGaZsn1ClbJ/3kFqSOjlryd92eQY465IYrezsXmPcfHPE/av4twRSxf6WE+TkZgLY+71vCZbiIiFKA/w==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/base64": "17.67.0", + "@jsonjoy.com/buffers": "17.67.0", + "@jsonjoy.com/codegen": "17.67.0", + "@jsonjoy.com/json-pointer": "17.67.0", + "@jsonjoy.com/util": "17.67.0", + "hyperdyperid": "^1.2.0", + "thingies": "^2.5.0", + "tree-dump": "^1.1.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/json-pointer": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-17.67.0.tgz", + "integrity": "sha512-+iqOFInH+QZGmSuaybBUNdh7yvNrXvqR+h3wjXm0N/3JK1EyyFAeGJvqnmQL61d1ARLlk/wJdFKSL+LHJ1eaUA==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/util": "17.67.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/util": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-17.67.0.tgz", + "integrity": "sha512-6+8xBaz1rLSohlGh68D1pdw3AwDi9xydm8QNlAFkvnavCJYSze+pxoW2VKP8p308jtlMRLs5NTHfPlZLd4w7ew==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/buffers": "17.67.0", + "@jsonjoy.com/codegen": "17.67.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pack": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.21.0.tgz", + "integrity": "sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/base64": "^1.1.2", + "@jsonjoy.com/buffers": "^1.2.0", + "@jsonjoy.com/codegen": "^1.0.0", + "@jsonjoy.com/json-pointer": "^1.0.2", + "@jsonjoy.com/util": "^1.9.0", + "hyperdyperid": "^1.2.0", + "thingies": "^2.5.0", + "tree-dump": "^1.1.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pack/node_modules/@jsonjoy.com/buffers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz", + "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pointer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-1.0.2.tgz", + "integrity": "sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/codegen": "^1.0.0", + "@jsonjoy.com/util": "^1.9.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/util": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.9.0.tgz", + "integrity": "sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/buffers": "^1.0.0", + "@jsonjoy.com/codegen": "^1.0.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/util/node_modules/@jsonjoy.com/buffers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz", + "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", + "license": "MIT" + }, + "node_modules/@mdx-js/mdx": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.1.tgz", + "integrity": "sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdx": "^2.0.0", + "acorn": "^8.0.0", + "collapse-white-space": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-util-scope": "^1.0.0", + "estree-walker": "^3.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "markdown-extensions": "^2.0.0", + "recma-build-jsx": "^1.0.0", + "recma-jsx": "^1.0.0", + "recma-stringify": "^1.0.0", + "rehype-recma": "^1.0.0", + "remark-mdx": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "source-map": "^0.7.0", + "unified": "^11.0.0", + "unist-util-position-from-estree": "^2.0.0", + "unist-util-stringify-position": "^4.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/react": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", + "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", + "license": "MIT", + "dependencies": { + "@types/mdx": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=16", + "react": ">=16" + } + }, + "node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@peculiar/asn1-cms": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-cms/-/asn1-cms-2.7.0.tgz", + "integrity": "sha512-hew63shtzzvBcSHbhm+cyAmKe6AIfinT9hzEqSPjDC6opTTMKmTkQ0gHuN2KsWlvqiKw1S/fS94fhag/FJkioQ==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/asn1-x509": "^2.7.0", + "@peculiar/asn1-x509-attr": "^2.7.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-csr": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-csr/-/asn1-csr-2.7.0.tgz", + "integrity": "sha512-VVsAyGqErT9D1SY4aEqozThXMVI+ssVRiv2DDeYuvpBKLIgZ3hYs3Ay3u/VSoKq6ESFi9cf6rf3IOOzfwh7oMA==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/asn1-x509": "^2.7.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-ecc": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-ecc/-/asn1-ecc-2.7.0.tgz", + "integrity": "sha512-n7KEs/Q/wrB415cxy4fHOBhegp4NdJ15fkJPwcB/3/8iNBQC2L/N7SChJPKDJPZGYH0jD4Tg4/0vnHmwghnbKw==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/asn1-x509": "^2.7.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-pfx": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pfx/-/asn1-pfx-2.7.0.tgz", + "integrity": "sha512-V/nrlQVmhg7lYAsM7E13UDL5erAwFv6kCIVFqNaMIHSVi7dngcT839JkRTkQBqznMG98l2XjxYk74ZztAohZzA==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-cms": "^2.7.0", + "@peculiar/asn1-pkcs8": "^2.7.0", + "@peculiar/asn1-rsa": "^2.7.0", + "@peculiar/asn1-schema": "^2.7.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-pkcs8": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs8/-/asn1-pkcs8-2.7.0.tgz", + "integrity": "sha512-9GTl1nE8Mx1kTZ+7QyYatDyKsm34QcWRBFkY1iPvWC3X4Dona5s/tlLiQsx5WzVdZqiMBZNYT0buyw4/vbhnjw==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/asn1-x509": "^2.7.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-pkcs9": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs9/-/asn1-pkcs9-2.7.0.tgz", + "integrity": "sha512-Bh7m+OuIaSEllPQcSd9OSp93F4ROWH7sbITWV8MI+8dwsjE5111/87VxiWVvYFKyww3vp39geLv9ENqhwWHcew==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-cms": "^2.7.0", + "@peculiar/asn1-pfx": "^2.7.0", + "@peculiar/asn1-pkcs8": "^2.7.0", + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/asn1-x509": "^2.7.0", + "@peculiar/asn1-x509-attr": "^2.7.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-rsa": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-rsa/-/asn1-rsa-2.7.0.tgz", + "integrity": "sha512-/qvENQrXyTZURjMqSeofHul0JJt2sNSzSwk36pl2olkHbaioMQgrASDZAlHXl0xUlnVbHj0uGgOrBMTb5x2aJQ==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/asn1-x509": "^2.7.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-schema": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.7.0.tgz", + "integrity": "sha512-W8ZfWzLmQnrcky+eh3tni4IozMdqBDiHWU0N+vve/UGjMaUs8c0L7A2oEdkBXS8rTpWDpK/aoI3DG/L/hxmxPg==", + "license": "MIT", + "dependencies": { + "@peculiar/utils": "^2.0.2", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-x509": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509/-/asn1-x509-2.7.0.tgz", + "integrity": "sha512-mUn9RRrkGDnG4ALfunDmzyRW5dg+sWCj/pfnCCqEHYbkGxEpvUt6iVJv8Yw1cyp6SWZ26ZE5oSmI5SqEaen15g==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/utils": "^2.0.2", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-x509-attr": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509-attr/-/asn1-x509-attr-2.7.0.tgz", + "integrity": "sha512-NS8e7SOgXipkzUPLF/sce7ukpMpWjhxYsH0n6Y+bHYo4TTxOb95Zv7hqwSuL212mj5YxovjdOKQOgH1As3E94w==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/asn1-x509": "^2.7.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@peculiar/utils/-/utils-2.0.3.tgz", + "integrity": "sha512-+oL3HPFRIZ1St2K50lWCXiioIgSoxzz7R1J3uF6neO2yl1sgmpgY6XXJH4BdpoDkMWznQTeYF6oWNDZLCdQ4eQ==", + "license": "MIT", + "dependencies": { + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/x509": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/@peculiar/x509/-/x509-1.14.3.tgz", + "integrity": "sha512-C2Xj8FZ0uHWeCXXqX5B4/gVFQmtSkiuOolzAgutjTfseNOHT3pUjljDZsTSxXFGgio54bCzVFqmEOUrIVk8RDA==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-cms": "^2.6.0", + "@peculiar/asn1-csr": "^2.6.0", + "@peculiar/asn1-ecc": "^2.6.0", + "@peculiar/asn1-pkcs9": "^2.6.0", + "@peculiar/asn1-rsa": "^2.6.0", + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.0", + "pvtsutils": "^1.3.6", + "reflect-metadata": "^0.2.2", + "tslib": "^2.8.1", + "tsyringe": "^4.10.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@pnpm/config.env-replace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", + "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", + "license": "MIT", + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", + "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", + "license": "MIT", + "dependencies": { + "graceful-fs": "4.2.10" + }, + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file/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==", + "license": "ISC" + }, + "node_modules/@pnpm/npm-conf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-3.0.2.tgz", + "integrity": "sha512-h104Kh26rR8tm+a3Qkc5S4VLYint3FE48as7+/5oCEcKR2idC/pF1G6AhIXKI+eHPJa/3J9i5z0Al47IeGHPkA==", + "license": "MIT", + "dependencies": { + "@pnpm/config.env-replace": "^1.1.0", + "@pnpm/network.ca-file": "^1.0.1", + "config-chain": "^1.1.11" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "license": "MIT" + }, + "node_modules/@sideway/address": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", + "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", + "license": "BSD-3-Clause" + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.10", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", + "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", + "license": "MIT" + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@slorber/remark-comment": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@slorber/remark-comment/-/remark-comment-1.0.0.tgz", + "integrity": "sha512-RCE24n7jsOj1M0UPvIQCHTe7fI0sFL4S2nwKVWwHyVr/wI/H8GosgsJGyhnsZoGFnD/P2hLf1mSbrrgSLN93NA==", + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.1.0", + "micromark-util-symbol": "^1.0.1" + } + }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", + "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", + "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", + "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", + "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", + "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", + "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", + "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", + "license": "MIT", + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", + "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", + "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", + "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", + "@svgr/babel-plugin-transform-svg-component": "8.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/core": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", + "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^8.1.3", + "snake-case": "^3.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", + "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.21.3", + "entities": "^4.4.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", + "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "@svgr/hast-util-to-babel-ast": "8.0.0", + "svg-parser": "^2.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@svgr/plugin-svgo": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz", + "integrity": "sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==", + "license": "MIT", + "dependencies": { + "cosmiconfig": "^8.1.3", + "deepmerge": "^4.3.1", + "svgo": "^3.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@svgr/webpack": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-8.1.0.tgz", + "integrity": "sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@babel/plugin-transform-react-constant-elements": "^7.21.3", + "@babel/preset-env": "^7.20.2", + "@babel/preset-react": "^7.18.6", + "@babel/preset-typescript": "^7.21.0", + "@svgr/core": "8.1.0", + "@svgr/plugin-jsx": "8.1.0", + "@svgr/plugin-svgo": "8.1.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.1" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "license": "MIT", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/debug": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", + "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "license": "MIT", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.25", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz", + "integrity": "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==", + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "^1" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.19.8", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.8.tgz", + "integrity": "sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/gtag.js": { + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/@types/gtag.js/-/gtag.js-0.0.20.tgz", + "integrity": "sha512-wwAbk3SA2QeU67unN7zPxjEHmPmlXwZXZvQEpbEUQuMCRGgKyE1m6XDuTUA9b6pCGb/GqJmdfMOY5LuDjJSbbg==", + "license": "MIT" + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/history": { + "version": "4.7.11", + "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", + "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==", + "license": "MIT" + }, + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "license": "MIT" + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==", + "license": "MIT" + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "license": "MIT" + }, + "node_modules/@types/http-proxy": { + "version": "1.17.17", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.17.tgz", + "integrity": "sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdx": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", + "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==", + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "25.6.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.6.0.tgz", + "integrity": "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.19.0" + } + }, + "node_modules/@types/prismjs": { + "version": "1.26.6", + "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.6.tgz", + "integrity": "sha512-vqlvI7qlMvcCBbVe0AKAb4f97//Hy0EBTaiW8AalRnG/xAN5zOiWWyrNqNXeq8+KAuvRewjCVY1+IPxk4RdNYw==", + "license": "MIT" + }, + "node_modules/@types/qs": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.15.0.tgz", + "integrity": "sha512-JawvT8iBVWpzTrz3EGw9BTQFg3BQNmwERdKE22vlTxawwtbyUSlMppvZYKLZzB5zgACXdXxbD3m1bXaMqP/9ow==", + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.2.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", + "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-router": { + "version": "5.1.20", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", + "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*" + } + }, + "node_modules/@types/react-router-config": { + "version": "5.0.11", + "resolved": "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.11.tgz", + "integrity": "sha512-WmSAg7WgqW7m4x8Mt4N6ZyKz0BubSj/2tVUMsAHp+Yd2AMwcSbeFq9WympT19p5heCFmF97R9eD5uUR/t4HEqw==", + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "^5.1.0" + } + }, + "node_modules/@types/react-router-dom": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", + "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "*" + } + }, + "node_modules/@types/retry": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", + "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", + "license": "MIT" + }, + "node_modules/@types/sax": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", + "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", + "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", + "license": "MIT", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.10.tgz", + "integrity": "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==", + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "<1" + } + }, + "node_modules/@types/serve-static/node_modules/@types/send": { + "version": "0.17.6", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz", + "integrity": "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==", + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.35", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", + "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "license": "MIT" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "license": "ISC" + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "license": "Apache-2.0" + }, + "node_modules/a-sync-waterfall": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz", + "integrity": "sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==", + "license": "MIT" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "acorn": "^8.14.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", + "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/address": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", + "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/algoliasearch": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.52.0.tgz", + "integrity": "sha512-0ZzY9mjqV7gop/AH8pIBiAS8giXP7WcSiUfoFYIzYAK9QC5c37E4SIVtJVBMwlURc0/uNt2o4RcNRvdHa4CJ5w==", + "license": "MIT", + "dependencies": { + "@algolia/abtesting": "1.18.0", + "@algolia/client-abtesting": "5.52.0", + "@algolia/client-analytics": "5.52.0", + "@algolia/client-common": "5.52.0", + "@algolia/client-insights": "5.52.0", + "@algolia/client-personalization": "5.52.0", + "@algolia/client-query-suggestions": "5.52.0", + "@algolia/client-search": "5.52.0", + "@algolia/ingestion": "1.52.0", + "@algolia/monitoring": "1.52.0", + "@algolia/recommend": "5.52.0", + "@algolia/requester-browser-xhr": "5.52.0", + "@algolia/requester-fetch": "5.52.0", + "@algolia/requester-node-http": "5.52.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/algoliasearch-helper": { + "version": "3.28.2", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.28.2.tgz", + "integrity": "sha512-sexVcXLHrJN54+S0wXD52xV3ySeGZA5T6HMDkb84wT+3UcXCd8af/k2vU5qJTbHv7DoBb4mISJHdyQ2JOo3Aig==", + "license": "MIT", + "dependencies": { + "@algolia/events": "^4.0.1" + }, + "peerDependencies": { + "algoliasearch": ">= 3.1 < 6" + } + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "license": "ISC", + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-align/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==", + "license": "MIT" + }, + "node_modules/ansi-align/node_modules/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==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "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" + } + }, + "node_modules/ansi-styles": { + "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" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ansis": { + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/ansis/-/ansis-3.17.0.tgz", + "integrity": "sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg==", + "license": "ISC", + "engines": { + "node": ">=14" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "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==", + "license": "Python-2.0" + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "license": "MIT" + }, + "node_modules/asn1js": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.10.tgz", + "integrity": "sha512-S2s3aOytiKdFRdulw2qPE51MzjzVOisppcVv7jVFR+Kw0kxwvFrDcYA0h7Ndqbmj0HkMIXYWaoj7fli8kgx1eg==", + "license": "BSD-3-Clause", + "dependencies": { + "pvtsutils": "^1.3.6", + "pvutils": "^1.1.5", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/astring": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", + "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", + "license": "MIT", + "bin": { + "astring": "bin/astring" + } + }, + "node_modules/autoprefixer": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.5.0.tgz", + "integrity": "sha512-FMhOoZV4+qR6aTUALKX2rEqGG+oyATvwBt9IIzVR5rMa2HRWPkxf+P+PAJLD1I/H5/II+HuZcBJYEFBpq39ong==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.2", + "caniuse-lite": "^1.0.30001787", + "fraction.js": "^5.3.4", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/babel-loader": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz", + "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==", + "license": "MIT", + "dependencies": { + "find-cache-dir": "^4.0.0", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5" + } + }, + "node_modules/babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "license": "MIT", + "dependencies": { + "object.assign": "^4.1.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.17", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.17.tgz", + "integrity": "sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-define-polyfill-provider": "^0.6.8", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", + "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.5", + "core-js-compat": "^3.43.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.8.tgz", + "integrity": "sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg==", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.8" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.25", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.25.tgz", + "integrity": "sha512-QO/VHsXCQdnzADMfmkeOPvHdIAkoB7i0/rGjINPJEetLx75hNttVWGQ/jycHUDP9zZ9rupbm60WRxcwViB0MiA==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "license": "MIT" + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/body-parser": { + "version": "1.20.5", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.5.tgz", + "integrity": "sha512-3grm+/2tUOvu2cjJkvsIxrv/wVpfXQW4PsQHYm7yk4vfpu7Ekl6nEsYBoJUL6qDwZUx8wUhQ8tR2qz+ad9c9OA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.15.1", + "raw-body": "~2.5.3", + "type-is": "~1.6.18", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.15.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.1.tgz", + "integrity": "sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/bonjour-service": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", + "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "license": "ISC" + }, + "node_modules/boxen": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-6.2.1.tgz", + "integrity": "sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==", + "license": "MIT", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^6.2.0", + "chalk": "^4.1.2", + "cli-boxes": "^3.0.0", + "string-width": "^5.0.1", + "type-fest": "^2.5.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.0.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/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==", + "license": "MIT" + }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/bytestreamjs": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/bytestreamjs/-/bytestreamjs-2.0.1.tgz", + "integrity": "sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/cacheable-lookup": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", + "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", + "license": "MIT", + "engines": { + "node": ">=14.16" + } + }, + "node_modules/cacheable-request": { + "version": "10.2.14", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", + "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "^4.0.2", + "get-stream": "^6.0.1", + "http-cache-semantics": "^4.1.1", + "keyv": "^4.5.3", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/call-bind": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "get-intrinsic": "^1.3.0", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "license": "MIT", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001791", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001791.tgz", + "integrity": "sha512-yk0l/YSrOnFZk3UROpDLQD9+kC1l4meK/wed583AXrzoarMGJcbRi2Q4RaUYbKxYAsZ8sWmaSa/DsLmdBeI1vQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "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/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/cheerio": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "license": "MIT", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + }, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.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" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/clean-css": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", + "license": "MIT", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/clean-css/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==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-table3": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", + "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", + "license": "MIT", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/cli-table3/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==", + "license": "MIT" + }, + "node_modules/cli-table3/node_modules/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==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/collapse-white-space": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", + "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/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==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "license": "MIT" + }, + "node_modules/combine-promises": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/combine-promises/-/combine-promises-1.2.0.tgz", + "integrity": "sha512-VcQB1ziGD0NXrhKxiwyNbCDmRzs/OShMs2GqW2DlU2A/Sd0nQxE1oWDAE5O0ygSx5mgQOn9eIFh7yKPgFRVkPQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", + "license": "ISC" + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compressible/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", + "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "compressible": "~2.0.18", + "debug": "2.6.9", + "negotiator": "~0.6.4", + "on-headers": "~1.1.0", + "safe-buffer": "5.2.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "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==", + "license": "MIT" + }, + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "license": "MIT", + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "node_modules/config-chain/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, + "node_modules/configstore": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", + "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", + "license": "BSD-2-Clause", + "dependencies": { + "dot-prop": "^6.0.1", + "graceful-fs": "^4.2.6", + "unique-string": "^3.0.0", + "write-file-atomic": "^3.0.3", + "xdg-basedir": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/yeoman/configstore?sponsor=1" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/consola": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", + "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", + "license": "MIT" + }, + "node_modules/copy-text-to-clipboard": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.2.2.tgz", + "integrity": "sha512-T6SqyLd1iLuqPA90J5N4cTalrtovCySh58iiZDGJ6FGznbclKh4UI+FGacQSgFzwKG77W7XT5gwbVEbd9cIH1A==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", + "license": "MIT", + "dependencies": { + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "license": "MIT", + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/core-js": { + "version": "3.49.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.49.0.tgz", + "integrity": "sha512-es1U2+YTtzpwkxVLwAFdSpaIMyQaq0PBgm3YD1W3Qpsn1NAmO3KSgZfu+oGSWVu6NvLHoHCV/aYcsE5wiB7ALg==", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.49.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.49.0.tgz", + "integrity": "sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "license": "MIT", + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-random-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", + "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", + "license": "MIT", + "dependencies": { + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/crypto-random-string/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/css-blank-pseudo": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-7.0.1.tgz", + "integrity": "sha512-jf+twWGDf6LDoXDUode+nc7ZlrqfaNphrBIBrcmeP3D8yw1uPaix1gCC8LUQUGQ6CycuK2opkbFFWFuq/a94ag==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-blank-pseudo/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/css-declaration-sorter": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.4.0.tgz", + "integrity": "sha512-LTuzjPoyA2vMGKKcaOqKSp7Ub2eGrNfKiZH4LpezxpNrsICGCSFvsQOI29psISxNZtaXibkC2CXzrQ5enMeGGw==", + "license": "ISC", + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/css-has-pseudo": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-7.0.3.tgz", + "integrity": "sha512-oG+vKuGyqe/xvEMoxAQrhi7uY16deJR3i7wwhBerVrGQKSqUC5GiOVxTpM9F9B9hw0J+eKeOWLH7E9gZ1Dr5rA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-has-pseudo/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/css-has-pseudo/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/css-loader": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", + "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", + "license": "MIT", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/css-minimizer-webpack-plugin": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-5.0.1.tgz", + "integrity": "sha512-3caImjKFQkS+ws1TGcFn0V1HyDJFq1Euy589JlD6/3rV2kj+w7r5G9WDMgSHvpvXHNZ2calVypZWuEDQd9wfLg==", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "cssnano": "^6.0.1", + "jest-worker": "^29.4.3", + "postcss": "^8.4.24", + "schema-utils": "^4.0.1", + "serialize-javascript": "^6.0.1" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@parcel/css": { + "optional": true + }, + "@swc/css": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "lightningcss": { + "optional": true + } + } + }, + "node_modules/css-prefers-color-scheme": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-10.0.0.tgz", + "integrity": "sha512-VCtXZAWivRglTZditUfB4StnsWr6YVZ2PRtuxQLKTNRdtAf8tpzaVPE9zXIF3VaSc7O70iK/j1+NXxyQCqdPjQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-select": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssdb": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-8.8.0.tgz", + "integrity": "sha512-QbLeyz2Bgso1iRlh7IpWk6OKa3lLNGXsujVjDMPl9rOZpxKeiG69icLpbLCFxeURwmcdIfZqQyhlooKJYM4f8Q==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + } + ], + "license": "MIT-0" + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.1.2.tgz", + "integrity": "sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA==", + "license": "MIT", + "dependencies": { + "cssnano-preset-default": "^6.1.2", + "lilconfig": "^3.1.1" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/cssnano-preset-advanced": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-6.1.2.tgz", + "integrity": "sha512-Nhao7eD8ph2DoHolEzQs5CfRpiEP0xa1HBdnFZ82kvqdmbwVBUr2r1QuQ4t1pi+D1ZpqpcO4T+wy/7RxzJ/WPQ==", + "license": "MIT", + "dependencies": { + "autoprefixer": "^10.4.19", + "browserslist": "^4.23.0", + "cssnano-preset-default": "^6.1.2", + "postcss-discard-unused": "^6.0.5", + "postcss-merge-idents": "^6.0.3", + "postcss-reduce-idents": "^6.0.3", + "postcss-zindex": "^6.0.2" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/cssnano-preset-default": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.1.2.tgz", + "integrity": "sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "css-declaration-sorter": "^7.2.0", + "cssnano-utils": "^4.0.2", + "postcss-calc": "^9.0.1", + "postcss-colormin": "^6.1.0", + "postcss-convert-values": "^6.1.0", + "postcss-discard-comments": "^6.0.2", + "postcss-discard-duplicates": "^6.0.3", + "postcss-discard-empty": "^6.0.3", + "postcss-discard-overridden": "^6.0.2", + "postcss-merge-longhand": "^6.0.5", + "postcss-merge-rules": "^6.1.1", + "postcss-minify-font-values": "^6.1.0", + "postcss-minify-gradients": "^6.0.3", + "postcss-minify-params": "^6.1.0", + "postcss-minify-selectors": "^6.0.4", + "postcss-normalize-charset": "^6.0.2", + "postcss-normalize-display-values": "^6.0.2", + "postcss-normalize-positions": "^6.0.2", + "postcss-normalize-repeat-style": "^6.0.2", + "postcss-normalize-string": "^6.0.2", + "postcss-normalize-timing-functions": "^6.0.2", + "postcss-normalize-unicode": "^6.1.0", + "postcss-normalize-url": "^6.0.2", + "postcss-normalize-whitespace": "^6.0.2", + "postcss-ordered-values": "^6.0.2", + "postcss-reduce-initial": "^6.1.0", + "postcss-reduce-transforms": "^6.0.2", + "postcss-svgo": "^6.0.3", + "postcss-unique-selectors": "^6.0.4" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/cssnano-utils": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-4.0.2.tgz", + "integrity": "sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "license": "MIT", + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "license": "CC0-1.0" + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", + "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.0.tgz", + "integrity": "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==", + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", + "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/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==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "license": "MIT" + }, + "node_modules/detect-port": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.6.1.tgz", + "integrity": "sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q==", + "license": "MIT", + "dependencies": { + "address": "^1.0.1", + "debug": "4" + }, + "bin": { + "detect": "bin/detect-port.js", + "detect-port": "bin/detect-port.js" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "license": "MIT", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "license": "MIT", + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dot-prop": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", + "license": "MIT", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dot-prop/node_modules/is-obj": { + "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" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "license": "MIT" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.348", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.348.tgz", + "integrity": "sha512-QC2X59nRlycQQMc4ZXjSVBX+tSgJfgRtcrYHbIZLgOV2dCvefoQGegLR7lLXKgpPpSuVmJU19LMzGrSa2C7k3Q==", + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, + "node_modules/emojilib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", + "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==", + "license": "MIT" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/emoticon": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-4.1.0.tgz", + "integrity": "sha512-VWZfnxqwNcc51hIy/sbOdEem6D+cVtpPzEEtVAFdaas30+1dgkyaOQ4sQ6Bp0tOMqWO1v+HQfYaoodOkdhK6SQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.0.tgz", + "integrity": "sha512-otxSQPw4lkOZWkHpB3zaEQs6gWYEsmX4xQF68ElXC/TWvGxGMSGOvoNbaLXm6/cS/fSfHtsEdw90y20PCd+sCA==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/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==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", + "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==", + "license": "MIT" + }, + "node_modules/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==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esast-util-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz", + "integrity": "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/esast-util-from-js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esast-util-from-js/-/esast-util-from-js-2.0.1.tgz", + "integrity": "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "acorn": "^8.0.0", + "esast-util-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/escalade": { + "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" + } + }, + "node_modules/escape-goat": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", + "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/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==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "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==", + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "license": "BSD-2-Clause", + "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==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-util-attach-comments": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", + "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-build-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz", + "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-walker": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-scope": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/estree-util-scope/-/estree-util-scope-1.0.0.tgz", + "integrity": "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-to-js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", + "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "astring": "^1.8.0", + "source-map": "^0.7.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-value-to-estree": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.5.0.tgz", + "integrity": "sha512-aMV56R27Gv3QmfmF1MY12GWkGzzeAezAX+UplqHVASfjc9wNzI/X6hC0S9oxq61WT4aQesLGslWP9tKk6ghRZQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/remcohaszing" + } + }, + "node_modules/estree-util-visit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", + "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eta": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/eta/-/eta-2.2.0.tgz", + "integrity": "sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "url": "https://github.com/eta-dev/eta?sponsor=1" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eval": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eval/-/eval-0.1.8.tgz", + "integrity": "sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==", + "dependencies": { + "@types/node": "*", + "require-like": ">= 0.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/express": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", + "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "~1.20.3", + "content-disposition": "~0.5.4", + "content-type": "~1.0.4", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "~0.1.12", + "proxy-addr": "~2.0.7", + "qs": "~6.14.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "~0.19.0", + "serve-static": "~1.16.2", + "setprototypeof": "1.2.0", + "statuses": "~2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/express/node_modules/path-to-regexp": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz", + "integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==", + "license": "MIT" + }, + "node_modules/express/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "license": "MIT", + "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.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fault": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz", + "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==", + "license": "MIT", + "dependencies": { + "format": "^0.2.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "license": "Apache-2.0", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/feed": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz", + "integrity": "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==", + "license": "MIT", + "dependencies": { + "xml-js": "^1.6.11" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/file-loader/node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/file-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/file-loader/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==", + "license": "MIT" + }, + "node_modules/file-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", + "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "statuses": "~2.0.2", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/find-cache-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", + "license": "MIT", + "dependencies": { + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "license": "MIT", + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "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==", + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/follow-redirects": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data-encoder": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", + "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", + "license": "MIT", + "engines": { + "node": ">= 14.17" + } + }, + "node_modules/format": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", + "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "11.3.4", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", + "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "license": "ISC" + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/github-slugger": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", + "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==", + "license": "ISC" + }, + "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==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regex.js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/glob-to-regex.js/-/glob-to-regex.js-1.2.0.tgz", + "integrity": "sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "license": "BSD-2-Clause" + }, + "node_modules/global-dirs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", + "license": "MIT", + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "license": "MIT", + "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/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "12.6.1", + "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", + "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^5.2.0", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.8", + "decompress-response": "^6.0.0", + "form-data-encoder": "^2.1.2", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/got/node_modules/@sindresorhus/is": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", + "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "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/gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "license": "MIT", + "dependencies": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/gray-matter/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/gray-matter/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==", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "license": "MIT", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/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==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-yarn": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz", + "integrity": "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hasown": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", + "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", + "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^9.0.0", + "property-information": "^7.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz", + "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-from-parse5": "^8.0.0", + "hast-util-to-parse5": "^8.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "parse5": "^7.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-estree": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.3.tgz", + "integrity": "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-attach-comments": "^3.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", + "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.1.tgz", + "integrity": "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", + "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/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==", + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "license": "MIT" + }, + "node_modules/html-minifier-terser": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz", + "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==", + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "~5.3.2", + "commander": "^10.0.0", + "entities": "^4.4.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.15.1" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": "^14.13.1 || >=16.0.0" + } + }, + "node_modules/html-minifier-terser/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/html-tags": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/html-webpack-plugin": { + "version": "5.6.7", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.7.tgz", + "integrity": "sha512-md+vXtdCAe60s1k6AU3dUyMJnDxUyQAwfwPKoLisvgUF1IXjtlLsk2se54+qfL9Mdm26bbwvjJybpNx48NKRLw==", + "license": "MIT", + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.20.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/html-webpack-plugin/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/html-webpack-plugin/node_modules/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "license": "BSD-2-Clause" + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", + "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", + "license": "MIT" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", + "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==", + "license": "MIT", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/http2-wrapper": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", + "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", + "license": "MIT", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/hyperdyperid": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", + "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", + "license": "MIT", + "engines": { + "node": ">=10.18" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/image-size": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-2.0.2.tgz", + "integrity": "sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==", + "license": "MIT", + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=16.x" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/infima": { + "version": "0.2.0-alpha.45", + "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.45.tgz", + "integrity": "sha512-uyH0zfr1erU1OohLk0fT4Rrb94AOhguWNOcD9uGrSpRvNB+6gZXUoJX5J0NtvzBO10YZ9PgvA4NFgt+fYg8ojw==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "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" + } + }, + "node_modules/inline-style-parser": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz", + "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==", + "license": "MIT" + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/ipaddr.js": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.3.0.tgz", + "integrity": "sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, + "node_modules/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==", + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "license": "MIT", + "dependencies": { + "ci-info": "^3.2.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/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==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container/node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "license": "MIT", + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-network-error": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.3.1.tgz", + "integrity": "sha512-6QCxa49rQbmUWLfk0nuGqzql9U8uaV2H6279bRErPBHe/109hCzsLUBUHfbEtvLIHBd6hyXbgedBSHevm43Edw==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-npm": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.1.0.tgz", + "integrity": "sha512-O2z4/kNgyjhQwVR1Wpkbfc19JIhggF97NZNCpWTnjH7kVcZMUrnut9XSN7txI7VdyIYk5ZatOq3zvSuWpU8hoA==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "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" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "license": "MIT" + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-yarn-global": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz", + "integrity": "sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/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==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/joi": { + "version": "17.13.3", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", + "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.5", + "@sideway/formula": "^3.0.1", + "@sideway/pinpoint": "^2.0.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "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" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "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==", + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/latest-version": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", + "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==", + "license": "MIT", + "dependencies": { + "package-json": "^8.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/launch-editor": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.13.2.tgz", + "integrity": "sha512-4VVDnbOpLXy/s8rdRCSXb+zfMeFR0WlJWpET1iA9CQdlZDfwyLjUuGQzXU4VeOoey6AicSAluWan7Etga6Kcmg==", + "license": "MIT", + "dependencies": { + "picocolors": "^1.1.1", + "shell-quote": "^1.8.3" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, + "node_modules/loader-runner": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.2.tgz", + "integrity": "sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==", + "license": "MIT", + "engines": { + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "license": "MIT", + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "license": "MIT" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "license": "MIT" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "license": "MIT" + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lowercase-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/markdown-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", + "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/markdown-table": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdast-util-directive": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.1.0.tgz", + "integrity": "sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz", + "integrity": "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-from-markdown/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mdast-util-frontmatter": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz", + "integrity": "sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "escape-string-regexp": "^5.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-extension-frontmatter": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-frontmatter/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", + "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", + "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", + "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "license": "CC0-1.0" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "4.57.2", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.57.2.tgz", + "integrity": "sha512-2nWzSsJzrukurSDna4Z0WywuScK4Id3tSKejgu74u8KCdW4uNrseKRSIDg75C6Yw5ZRqBe0F0EtMNlTbUq8bAQ==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-core": "4.57.2", + "@jsonjoy.com/fs-fsa": "4.57.2", + "@jsonjoy.com/fs-node": "4.57.2", + "@jsonjoy.com/fs-node-builtins": "4.57.2", + "@jsonjoy.com/fs-node-to-fsa": "4.57.2", + "@jsonjoy.com/fs-node-utils": "4.57.2", + "@jsonjoy.com/fs-print": "4.57.2", + "@jsonjoy.com/fs-snapshot": "4.57.2", + "@jsonjoy.com/json-pack": "^1.11.0", + "@jsonjoy.com/util": "^1.9.0", + "glob-to-regex.js": "^1.0.1", + "thingies": "^2.5.0", + "tree-dump": "^1.0.3", + "tslib": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/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==", + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-directive": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-3.0.2.tgz", + "integrity": "sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "parse-entities": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-directive/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-directive/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-directive/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-frontmatter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz", + "integrity": "sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==", + "license": "MIT", + "dependencies": { + "fault": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "license": "MIT", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-mdx-expression": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.1.tgz", + "integrity": "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-expression/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-mdx-jsx": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.2.tgz", + "integrity": "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-mdx-md": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", + "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", + "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", + "license": "MIT", + "dependencies": { + "acorn": "^8.0.0", + "acorn-jsx": "^5.0.0", + "micromark-extension-mdx-expression": "^3.0.0", + "micromark-extension-mdx-jsx": "^3.0.0", + "micromark-extension-mdx-md": "^2.0.0", + "micromark-extension-mdxjs-esm": "^3.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", + "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-destination/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-destination/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-mdx-expression": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.3.tgz", + "integrity": "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-space": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", + "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-space/node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-character": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", + "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-character/node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-events-to-acorn": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.3.tgz", + "integrity": "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-util-events-to-acorn/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-normalize-identifier/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-symbol": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", + "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "license": "MIT", + "dependencies": { + "mime-db": "~1.33.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", + "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.10.2.tgz", + "integrity": "sha512-AOSS0IdEB95ayVkxn5oGzNQwqAi2J0Jb/kKm43t7H73s8+f5873g0yuj0PNvK4dO75mu5DHg4nlgp4k6Kga8eg==", + "license": "MIT", + "dependencies": { + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "license": "ISC" + }, + "node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "license": "MIT", + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/nanoid": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "license": "MIT" + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-emoji": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.2.0.tgz", + "integrity": "sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==", + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^4.6.0", + "char-regex": "^1.0.2", + "emojilib": "^2.4.0", + "skin-tone": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/node-releases": { + "version": "2.0.38", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.38.tgz", + "integrity": "sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==", + "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==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.1.1.tgz", + "integrity": "sha512-JYc0DPlpGWB40kH5g07gGTrYuMqV653k3uBKY6uITPWds3M0ov3GaWGp9lbE3Bzngx8+XkfzgvASb9vk9JDFXQ==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/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==", + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nprogress": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", + "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==", + "license": "MIT" + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/null-loader": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/null-loader/-/null-loader-4.0.1.tgz", + "integrity": "sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg==", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/null-loader/node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/null-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/null-loader/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==", + "license": "MIT" + }, + "node_modules/null-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/nunjucks": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.2.4.tgz", + "integrity": "sha512-26XRV6BhkgK0VOxfbU5cQI+ICFUtMLixv1noZn1tGU38kQH5A5nmmbk/O45xdyBhD1esk47nKrY0mvQpZIhRjQ==", + "license": "BSD-2-Clause", + "dependencies": { + "a-sync-waterfall": "^1.0.0", + "asap": "^2.0.3", + "commander": "^5.1.0" + }, + "bin": { + "nunjucks-precompile": "bin/precompile" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "chokidar": "^3.3.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/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==", + "license": "MIT", + "dependencies": { + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "license": "MIT" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "license": "(WTFPL OR MIT)", + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/p-cancelable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", + "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "license": "MIT", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "license": "MIT", + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-queue": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", + "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.4", + "p-timeout": "^3.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz", + "integrity": "sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==", + "license": "MIT", + "dependencies": { + "@types/retry": "0.12.2", + "is-network-error": "^1.0.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "license": "MIT", + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.1.tgz", + "integrity": "sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==", + "license": "MIT", + "dependencies": { + "got": "^12.1.0", + "registry-auth-token": "^5.0.1", + "registry-url": "^6.0.0", + "semver": "^7.3.7" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/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==", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-numeric-range": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", + "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==", + "license": "ISC" + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", + "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", + "license": "MIT", + "dependencies": { + "domhandler": "^5.0.3", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", + "license": "(WTFPL OR MIT)" + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/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==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "dependencies": { + "isarray": "0.0.1" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "license": "MIT", + "dependencies": { + "find-up": "^6.3.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkijs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/pkijs/-/pkijs-3.4.0.tgz", + "integrity": "sha512-emEcLuomt2j03vxD54giVB4SxTjnsqkU692xZOZXHDVoYyypEm+b3jpiTcc+Cf+myooc+/Ly0z01jqeNHVgJGw==", + "license": "BSD-3-Clause", + "dependencies": { + "@noble/hashes": "1.4.0", + "asn1js": "^3.0.6", + "bytestreamjs": "^2.0.1", + "pvtsutils": "^1.3.6", + "pvutils": "^1.1.3", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/postcss": { + "version": "8.5.13", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.13.tgz", + "integrity": "sha512-qif0+jGGZoLWdHey3UFHHWP0H7Gbmsk8T5VEqyYFbWqPr1XqvLGBbk/sl8V5exGmcYJklJOhOQq1pV9IcsiFag==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-attribute-case-insensitive": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-7.0.1.tgz", + "integrity": "sha512-Uai+SupNSqzlschRyNx3kbCTWgY/2hcwtHEI/ej2LJWc9JJ77qKgGptd8DHwY1mXtZ7Aoh4z4yxfwMBue9eNgw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-attribute-case-insensitive/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-calc": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-9.0.1.tgz", + "integrity": "sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.11", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.2.2" + } + }, + "node_modules/postcss-clamp": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", + "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=7.6.0" + }, + "peerDependencies": { + "postcss": "^8.4.6" + } + }, + "node_modules/postcss-color-functional-notation": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-7.0.12.tgz", + "integrity": "sha512-TLCW9fN5kvO/u38/uesdpbx3e8AkTYhMvDZYa9JpmImWuTE99bDQ7GU7hdOADIZsiI9/zuxfAJxny/khknp1Zw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-color-hex-alpha": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-10.0.0.tgz", + "integrity": "sha512-1kervM2cnlgPs2a8Vt/Qbe5cQ++N7rkYo/2rz2BkqJZIHQwaVuJgQH38REHrAi4uM0b1fqxMkWYmese94iMp3w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-color-rebeccapurple": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-10.0.0.tgz", + "integrity": "sha512-JFta737jSP+hdAIEhk1Vs0q0YF5P8fFcj+09pweS8ktuGuZ8pPlykHsk6mPxZ8awDl4TrcxUqJo9l1IhVr/OjQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-colormin": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-6.1.0.tgz", + "integrity": "sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0", + "colord": "^2.9.3", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-convert-values": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-6.1.0.tgz", + "integrity": "sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-custom-media": { + "version": "11.0.6", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-11.0.6.tgz", + "integrity": "sha512-C4lD4b7mUIw+RZhtY7qUbf4eADmb7Ey8BFA2px9jUbwg7pjTZDl4KY4bvlUV+/vXQvzQRfiGEVJyAbtOsCMInw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/cascade-layer-name-parser": "^2.0.5", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-custom-properties": { + "version": "14.0.6", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-14.0.6.tgz", + "integrity": "sha512-fTYSp3xuk4BUeVhxCSJdIPhDLpJfNakZKoiTDx7yRGCdlZrSJR7mWKVOBS4sBF+5poPQFMj2YdXx1VHItBGihQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/cascade-layer-name-parser": "^2.0.5", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-custom-selectors": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-8.0.5.tgz", + "integrity": "sha512-9PGmckHQswiB2usSO6XMSswO2yFWVoCAuih1yl9FVcwkscLjRKjwsjM3t+NIWpSU2Jx3eOiK2+t4vVTQaoCHHg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/cascade-layer-name-parser": "^2.0.5", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-custom-selectors/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-dir-pseudo-class": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-9.0.1.tgz", + "integrity": "sha512-tRBEK0MHYvcMUrAuYMEOa0zg9APqirBcgzi6P21OhxtJyJADo/SWBwY1CAwEohQ/6HDaa9jCjLRG7K3PVQYHEA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-dir-pseudo-class/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-discard-comments": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.2.tgz", + "integrity": "sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.3.tgz", + "integrity": "sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-empty": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-6.0.3.tgz", + "integrity": "sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-6.0.2.tgz", + "integrity": "sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-unused": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-6.0.5.tgz", + "integrity": "sha512-wHalBlRHkaNnNwfC8z+ppX57VhvS+HWgjW508esjdaEYr3Mx7Gnn2xA4R/CKf5+Z9S5qsqC+Uzh4ueENWwCVUA==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-double-position-gradients": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-6.0.4.tgz", + "integrity": "sha512-m6IKmxo7FxSP5nF2l63QbCC3r+bWpFUWmZXZf096WxG0m7Vl1Q1+ruFOhpdDRmKrRS+S3Jtk+TVk/7z0+BVK6g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-visible": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-10.0.1.tgz", + "integrity": "sha512-U58wyjS/I1GZgjRok33aE8juW9qQgQUNwTSdxQGuShHzwuYdcklnvK/+qOWX1Q9kr7ysbraQ6ht6r+udansalA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-visible/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-focus-within": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-9.0.1.tgz", + "integrity": "sha512-fzNUyS1yOYa7mOjpci/bR+u+ESvdar6hk8XNK/TRR0fiGTp2QT5N+ducP0n3rfH/m9I7H/EQU6lsa2BrgxkEjw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-within/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-font-variant": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", + "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-gap-properties": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-6.0.0.tgz", + "integrity": "sha512-Om0WPjEwiM9Ru+VhfEDPZJAKWUd0mV1HmNXqp2C29z80aQ2uP9UVhLc7e3aYMIor/S5cVhoPgYQ7RtfeZpYTRw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-image-set-function": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-7.0.0.tgz", + "integrity": "sha512-QL7W7QNlZuzOwBTeXEmbVckNt1FSmhQtbMRvGGqqU4Nf4xk6KUEQhAoWuMzwbSv5jxiRiSZ5Tv7eiDB9U87znA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-lab-function": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-7.0.12.tgz", + "integrity": "sha512-tUcyRk1ZTPec3OuKFsqtRzW2Go5lehW29XA21lZ65XmzQkz43VY2tyWEC202F7W3mILOjw0voOiuxRGTsN+J9w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-loader": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.4.tgz", + "integrity": "sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A==", + "license": "MIT", + "dependencies": { + "cosmiconfig": "^8.3.5", + "jiti": "^1.20.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + } + }, + "node_modules/postcss-logical": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-8.1.0.tgz", + "integrity": "sha512-pL1hXFQ2fEXNKiNiAgtfA005T9FBxky5zkX6s4GZM2D8RkVgRqz3f4g1JUoq925zXv495qk8UNldDwh8uGEDoA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-merge-idents": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-6.0.3.tgz", + "integrity": "sha512-1oIoAsODUs6IHQZkLQGO15uGEbK3EAl5wi9SS8hs45VgsxQfMnxvt+L+zIr7ifZFIH14cfAeVe2uCTa+SPRa3g==", + "license": "MIT", + "dependencies": { + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-merge-longhand": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-6.0.5.tgz", + "integrity": "sha512-5LOiordeTfi64QhICp07nzzuTDjNSO8g5Ksdibt44d+uvIIAE1oZdRn8y/W5ZtYgRH/lnLDlvi9F8btZcVzu3w==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^6.1.1" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-merge-rules": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.1.1.tgz", + "integrity": "sha512-KOdWF0gju31AQPZiD+2Ar9Qjowz1LTChSjFFbS+e2sFgc4uHOp3ZvVX4sNeTlk0w2O31ecFGgrFzhO0RSWbWwQ==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^4.0.2", + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-6.1.0.tgz", + "integrity": "sha512-gklfI/n+9rTh8nYaSJXlCo3nOKqMNkxuGpTn/Qm0gstL3ywTr9/WRKznE+oy6fvfolH6dF+QM4nCo8yPLdvGJg==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-6.0.3.tgz", + "integrity": "sha512-4KXAHrYlzF0Rr7uc4VrfwDJ2ajrtNEpNEuLxFgwkhFZ56/7gaE4Nr49nLsQDZyUe+ds+kEhf+YAUolJiYXF8+Q==", + "license": "MIT", + "dependencies": { + "colord": "^2.9.3", + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-params": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-6.1.0.tgz", + "integrity": "sha512-bmSKnDtyyE8ujHQK0RQJDIKhQ20Jq1LYiez54WiaOoBtcSuflfK3Nm596LvbtlFcpipMjgClQGyGr7GAs+H1uA==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-6.0.4.tgz", + "integrity": "sha512-L8dZSwNLgK7pjTto9PzWRoMbnLq5vsZSTu8+j1P/2GB8qdtGQfn+K1uSvFgYvgh83cbyxT5m43ZZhUMTJDSClQ==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", + "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", + "license": "MIT", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", + "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "license": "ISC", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-nesting": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-13.0.2.tgz", + "integrity": "sha512-1YCI290TX+VP0U/K/aFxzHzQWHWURL+CtHMSbex1lCdpXD1SoR2sYuxDu5aNI9lPoXpKTCggFZiDJbwylU0LEQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/selector-resolve-nested": "^3.1.0", + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-nesting/node_modules/@csstools/selector-resolve-nested": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-3.1.0.tgz", + "integrity": "sha512-mf1LEW0tJLKfWyvn5KdDrhpxHyuxpbNwTIwOYLIvsTffeyOf85j5oIzfG0yosxDgx/sswlqBnESYUcQH0vgZ0g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/postcss-nesting/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/postcss-nesting/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-6.0.2.tgz", + "integrity": "sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.2.tgz", + "integrity": "sha512-8H04Mxsb82ON/aAkPeq8kcBbAtI5Q2a64X/mnRRfPXBq7XeogoQvReqxEfc0B4WPq1KimjezNC8flUtC3Qz6jg==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-positions": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-6.0.2.tgz", + "integrity": "sha512-/JFzI441OAB9O7VnLA+RtSNZvQ0NCFZDOtp6QPFo1iIyawyXg0YI3CYM9HBy1WvwCRHnPep/BvI1+dGPKoXx/Q==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.2.tgz", + "integrity": "sha512-YdCgsfHkJ2jEXwR4RR3Tm/iOxSfdRt7jplS6XRh9Js9PyCR/aka/FCb6TuHT2U8gQubbm/mPmF6L7FY9d79VwQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-string": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-6.0.2.tgz", + "integrity": "sha512-vQZIivlxlfqqMp4L9PZsFE4YUkWniziKjQWUtsxUiVsSSPelQydwS8Wwcuw0+83ZjPWNTl02oxlIvXsmmG+CiQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.2.tgz", + "integrity": "sha512-a+YrtMox4TBtId/AEwbA03VcJgtyW4dGBizPl7e88cTFULYsprgHWTbfyjSLyHeBcK/Q9JhXkt2ZXiwaVHoMzA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-unicode": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-6.1.0.tgz", + "integrity": "sha512-QVC5TQHsVj33otj8/JD869Ndr5Xcc/+fwRh4HAsFsAeygQQXm+0PySrKbr/8tkDKzW+EVT3QkqZMfFrGiossDg==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-url": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-6.0.2.tgz", + "integrity": "sha512-kVNcWhCeKAzZ8B4pv/DnrU1wNh458zBNp8dh4y5hhxih5RZQ12QWMuQrDgPRw3LRl8mN9vOVfHl7uhvHYMoXsQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-whitespace": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.2.tgz", + "integrity": "sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-opacity-percentage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-3.0.0.tgz", + "integrity": "sha512-K6HGVzyxUxd/VgZdX04DCtdwWJ4NGLG212US4/LA1TLAbHgmAsTWVR86o+gGIbFtnTkfOpb9sCRBx8K7HO66qQ==", + "funding": [ + { + "type": "kofi", + "url": "https://ko-fi.com/mrcgrtz" + }, + { + "type": "liberapay", + "url": "https://liberapay.com/mrcgrtz" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-ordered-values": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-6.0.2.tgz", + "integrity": "sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q==", + "license": "MIT", + "dependencies": { + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-overflow-shorthand": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-6.0.0.tgz", + "integrity": "sha512-BdDl/AbVkDjoTofzDQnwDdm/Ym6oS9KgmO7Gr+LHYjNWJ6ExORe4+3pcLQsLA9gIROMkiGVjjwZNoL/mpXHd5Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-page-break": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", + "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8" + } + }, + "node_modules/postcss-place": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-10.0.0.tgz", + "integrity": "sha512-5EBrMzat2pPAxQNWYavwAfoKfYcTADJ8AXGVPcUZ2UkNloUTWzJQExgrzrDkh3EKzmAx1evfTAzF9I8NGcc+qw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-preset-env": { + "version": "10.6.1", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.6.1.tgz", + "integrity": "sha512-yrk74d9EvY+W7+lO9Aj1QmjWY9q5NsKjK2V9drkOPZB/X6KZ0B3igKsHUYakb7oYVhnioWypQX3xGuePf89f3g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/postcss-alpha-function": "^1.0.1", + "@csstools/postcss-cascade-layers": "^5.0.2", + "@csstools/postcss-color-function": "^4.0.12", + "@csstools/postcss-color-function-display-p3-linear": "^1.0.1", + "@csstools/postcss-color-mix-function": "^3.0.12", + "@csstools/postcss-color-mix-variadic-function-arguments": "^1.0.2", + "@csstools/postcss-content-alt-text": "^2.0.8", + "@csstools/postcss-contrast-color-function": "^2.0.12", + "@csstools/postcss-exponential-functions": "^2.0.9", + "@csstools/postcss-font-format-keywords": "^4.0.0", + "@csstools/postcss-gamut-mapping": "^2.0.11", + "@csstools/postcss-gradients-interpolation-method": "^5.0.12", + "@csstools/postcss-hwb-function": "^4.0.12", + "@csstools/postcss-ic-unit": "^4.0.4", + "@csstools/postcss-initial": "^2.0.1", + "@csstools/postcss-is-pseudo-class": "^5.0.3", + "@csstools/postcss-light-dark-function": "^2.0.11", + "@csstools/postcss-logical-float-and-clear": "^3.0.0", + "@csstools/postcss-logical-overflow": "^2.0.0", + "@csstools/postcss-logical-overscroll-behavior": "^2.0.0", + "@csstools/postcss-logical-resize": "^3.0.0", + "@csstools/postcss-logical-viewport-units": "^3.0.4", + "@csstools/postcss-media-minmax": "^2.0.9", + "@csstools/postcss-media-queries-aspect-ratio-number-values": "^3.0.5", + "@csstools/postcss-nested-calc": "^4.0.0", + "@csstools/postcss-normalize-display-values": "^4.0.1", + "@csstools/postcss-oklab-function": "^4.0.12", + "@csstools/postcss-position-area-property": "^1.0.0", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/postcss-property-rule-prelude-list": "^1.0.0", + "@csstools/postcss-random-function": "^2.0.1", + "@csstools/postcss-relative-color-syntax": "^3.0.12", + "@csstools/postcss-scope-pseudo-class": "^4.0.1", + "@csstools/postcss-sign-functions": "^1.1.4", + "@csstools/postcss-stepped-value-functions": "^4.0.9", + "@csstools/postcss-syntax-descriptor-syntax-production": "^1.0.1", + "@csstools/postcss-system-ui-font-family": "^1.0.0", + "@csstools/postcss-text-decoration-shorthand": "^4.0.3", + "@csstools/postcss-trigonometric-functions": "^4.0.9", + "@csstools/postcss-unset-value": "^4.0.0", + "autoprefixer": "^10.4.23", + "browserslist": "^4.28.1", + "css-blank-pseudo": "^7.0.1", + "css-has-pseudo": "^7.0.3", + "css-prefers-color-scheme": "^10.0.0", + "cssdb": "^8.6.0", + "postcss-attribute-case-insensitive": "^7.0.1", + "postcss-clamp": "^4.1.0", + "postcss-color-functional-notation": "^7.0.12", + "postcss-color-hex-alpha": "^10.0.0", + "postcss-color-rebeccapurple": "^10.0.0", + "postcss-custom-media": "^11.0.6", + "postcss-custom-properties": "^14.0.6", + "postcss-custom-selectors": "^8.0.5", + "postcss-dir-pseudo-class": "^9.0.1", + "postcss-double-position-gradients": "^6.0.4", + "postcss-focus-visible": "^10.0.1", + "postcss-focus-within": "^9.0.1", + "postcss-font-variant": "^5.0.0", + "postcss-gap-properties": "^6.0.0", + "postcss-image-set-function": "^7.0.0", + "postcss-lab-function": "^7.0.12", + "postcss-logical": "^8.1.0", + "postcss-nesting": "^13.0.2", + "postcss-opacity-percentage": "^3.0.0", + "postcss-overflow-shorthand": "^6.0.0", + "postcss-page-break": "^3.0.4", + "postcss-place": "^10.0.0", + "postcss-pseudo-class-any-link": "^10.0.1", + "postcss-replace-overflow-wrap": "^4.0.0", + "postcss-selector-not": "^8.0.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-pseudo-class-any-link": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-10.0.1.tgz", + "integrity": "sha512-3el9rXlBOqTFaMFkWDOkHUTQekFIYnaQY55Rsp8As8QQkpiSgIYEcF/6Ond93oHiDsGb4kad8zjt+NPlOC1H0Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-pseudo-class-any-link/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-reduce-idents": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-6.0.3.tgz", + "integrity": "sha512-G3yCqZDpsNPoQgbDUy3T0E6hqOQ5xigUtBQyrmq3tn2GxlyiL0yyl7H+T8ulQR6kOcHJ9t7/9H4/R2tv8tJbMA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-6.1.0.tgz", + "integrity": "sha512-RarLgBK/CrL1qZags04oKbVbrrVK2wcxhvta3GCxrZO4zveibqbRPmm2VI8sSgCXwoUHEliRSbOfpR0b/VIoiw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.2.tgz", + "integrity": "sha512-sB+Ya++3Xj1WaT9+5LOOdirAxP7dJZms3GRcYheSPi1PiTMigsxHAdkrbItHxwYHr4kt1zL7mmcHstgMYT+aiA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-replace-overflow-wrap": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", + "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8.0.3" + } + }, + "node_modules/postcss-selector-not": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-8.0.1.tgz", + "integrity": "sha512-kmVy/5PYVb2UOhy0+LqUYAhKj7DUGDpSWa5LZqlkWJaaAV+dxxsOG3+St0yNLu6vsKD7Dmqx+nWQt0iil89+WA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-selector-not/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-sort-media-queries": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-5.2.0.tgz", + "integrity": "sha512-AZ5fDMLD8SldlAYlvi8NIqo0+Z8xnXU2ia0jxmuhxAU+Lqt9K+AlmLNJ/zWEnE9x+Zx3qL3+1K20ATgNOr3fAA==", + "license": "MIT", + "dependencies": { + "sort-css-media-queries": "2.2.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.4.23" + } + }, + "node_modules/postcss-svgo": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-6.0.3.tgz", + "integrity": "sha512-dlrahRmxP22bX6iKEjOM+c8/1p+81asjKT+V5lrgOH944ryx/OHpclnIbGsKVd3uWOXFLYJwCVf0eEkJGvO96g==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "svgo": "^3.2.0" + }, + "engines": { + "node": "^14 || ^16 || >= 18" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-unique-selectors": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-6.0.4.tgz", + "integrity": "sha512-K38OCaIrO8+PzpArzkLKB42dSARtC2tmG6PvD4b1o1Q2E9Os8jzfWFfSy/rixsHwohtsDdFtAWGjFVFUdwYaMg==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "license": "MIT" + }, + "node_modules/postcss-zindex": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-6.0.2.tgz", + "integrity": "sha512-5BxW9l1evPB/4ZIc+2GobEBoKC+h8gPGCMi+jxsYvd2x0mjq7wazk6DrP71pStqxE9Foxh5TVnonbWpFZzXaYg==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "node_modules/pretty-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", + "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/prism-react-renderer": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-2.4.1.tgz", + "integrity": "sha512-ey8Ls/+Di31eqzUxC46h8MksNuGx/n0AAC8uKpwFau4RPDYLuE3EXTp8N8G2vX2N7UC/+IXeNUnlWBGGcAG+Ig==", + "license": "MIT", + "dependencies": { + "@types/prismjs": "^1.26.0", + "clsx": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.0.0" + } + }, + "node_modules/prismjs": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", + "license": "ISC" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/punycode": { + "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/pupa": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.3.0.tgz", + "integrity": "sha512-LjgDO2zPtoXP2wJpDjZrGdojii1uqO0cnwKoIoUzkfS98HDmbeiGmYiXo3lXeFlq2xvne1QFQhwYXSUCLKtEuA==", + "license": "MIT", + "dependencies": { + "escape-goat": "^4.0.0" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pvtsutils": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.6.tgz", + "integrity": "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.8.1" + } + }, + "node_modules/pvutils": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.1.5.tgz", + "integrity": "sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==", + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/qs": { + "version": "6.14.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz", + "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "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": "MIT" + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-fast-compare": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", + "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==", + "license": "MIT" + }, + "node_modules/react-helmet-async": { + "name": "@slorber/react-helmet-async", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@slorber/react-helmet-async/-/react-helmet-async-1.3.0.tgz", + "integrity": "sha512-e9/OK8VhwUSc67diWI8Rb3I0YgI9/SBQtnhe9aEuK6MhZm7ntZZimXgwXnd8W96YTmSOb9M4d8LwhRZyhWr/1A==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.12.5", + "invariant": "^2.2.4", + "prop-types": "^15.7.2", + "react-fast-compare": "^3.2.0", + "shallowequal": "^1.1.0" + }, + "peerDependencies": { + "react": "^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/react-json-view-lite": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/react-json-view-lite/-/react-json-view-lite-2.5.0.tgz", + "integrity": "sha512-tk7o7QG9oYyELWHL8xiMQ8x4WzjCzbWNyig3uexmkLb54r8jO0yH3WCWx8UZS0c49eSA4QUmG5caiRJ8fAn58g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-loadable": { + "name": "@docusaurus/react-loadable", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", + "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", + "license": "MIT", + "dependencies": { + "@types/react": "*" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-loadable-ssr-addon-v5-slorber": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.3.tgz", + "integrity": "sha512-GXfh9VLwB5ERaCsU6RULh7tkemeX15aNh6wuMEBtfdyMa7fFG8TXrhXlx1SoEK2Ty/l6XIkzzYIQmyaWW3JgdQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.3" + }, + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "react-loadable": "*", + "webpack": ">=4.41.1 || 5.x" + } + }, + "node_modules/react-router": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", + "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "hoist-non-react-statics": "^3.1.0", + "loose-envify": "^1.3.1", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.2", + "react-is": "^16.6.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/react-router-config": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz", + "integrity": "sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.1.2" + }, + "peerDependencies": { + "react": ">=15", + "react-router": ">=5" + } + }, + "node_modules/react-router-dom": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz", + "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.2", + "react-router": "5.3.4", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/recma-build-jsx": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-build-jsx/-/recma-build-jsx-1.0.0.tgz", + "integrity": "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-util-build-jsx": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-jsx": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/recma-jsx/-/recma-jsx-1.0.1.tgz", + "integrity": "sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==", + "license": "MIT", + "dependencies": { + "acorn-jsx": "^5.0.0", + "estree-util-to-js": "^2.0.0", + "recma-parse": "^1.0.0", + "recma-stringify": "^1.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/recma-parse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-parse/-/recma-parse-1.0.0.tgz", + "integrity": "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "esast-util-from-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-stringify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-stringify/-/recma-stringify-1.0.0.tgz", + "integrity": "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-util-to-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/reflect-metadata": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", + "license": "Apache-2.0" + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", + "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regexpu-core": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", + "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.2", + "regjsgen": "^0.8.0", + "regjsparser": "^0.13.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.2.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/registry-auth-token": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.1.1.tgz", + "integrity": "sha512-P7B4+jq8DeD2nMsAcdfaqHbssgHtZ7Z5+++a5ask90fvmJ8p5je4mOa+wzu+DB4vQ5tdJV/xywY+UnVFeQLV5Q==", + "license": "MIT", + "dependencies": { + "@pnpm/npm-conf": "^3.0.2" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/registry-url": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", + "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", + "license": "MIT", + "dependencies": { + "rc": "1.2.8" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.1.tgz", + "integrity": "sha512-dLsljMd9sqwRkby8zhO1gSg3PnJIBFid8f4CQj/sXx+7cKx+E7u0PKhZ+U4wmhx7EfmtvnA318oVaIkAB1lRJw==", + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.1.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/rehype-raw": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", + "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-raw": "^9.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-recma": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rehype-recma/-/rehype-recma-1.0.0.tgz", + "integrity": "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "hast-util-to-estree": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remark-directive": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-3.0.1.tgz", + "integrity": "sha512-gwglrEQEZcZYgVyG1tQuA+h58EZfq5CSULw7J90AFuCTyib1thgHPoqQ+h9iFvU6R+vnZ5oNFQR5QKgGpk741A==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-directive": "^3.0.0", + "micromark-extension-directive": "^3.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-emoji": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-4.0.1.tgz", + "integrity": "sha512-fHdvsTR1dHkWKev9eNyhTo4EFwbUvJ8ka9SgeWkMPYFX4WoI7ViVBms3PjlQYgw5TLvNQso3GUB/b/8t3yo+dg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.2", + "emoticon": "^4.0.1", + "mdast-util-find-and-replace": "^3.0.1", + "node-emoji": "^2.1.0", + "unified": "^11.0.4" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/remark-frontmatter": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-5.0.0.tgz", + "integrity": "sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-frontmatter": "^2.0.0", + "micromark-extension-frontmatter": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", + "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.1.1.tgz", + "integrity": "sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==", + "license": "MIT", + "dependencies": { + "mdast-util-mdx": "^3.0.0", + "micromark-extension-mdxjs": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "license": "MIT", + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "node_modules/renderkid/node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/renderkid/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.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==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-like": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz", + "integrity": "sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==", + "engines": { + "node": "*" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.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" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "license": "MIT" + }, + "node_modules/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==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pathname": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==", + "license": "MIT" + }, + "node_modules/responselike": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", + "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", + "license": "MIT", + "dependencies": { + "lowercase-keys": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rtlcss": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.3.0.tgz", + "integrity": "sha512-FI+pHEn7Wc4NqKXMXFM+VAYKEj/mRIcW4h24YVwVtyjI+EqGrLc2Hx/Ny0lrZ21cBWU2goLy36eqMcNj3AQJig==", + "license": "MIT", + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0", + "postcss": "^8.4.21", + "strip-json-comments": "^3.1.1" + }, + "bin": { + "rtlcss": "bin/rtlcss.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/run-applescript": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", + "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "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": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/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==", + "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": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/sax": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", + "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/schema-dts": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/schema-dts/-/schema-dts-1.1.5.tgz", + "integrity": "sha512-RJr9EaCmsLzBX2NDiO5Z3ux2BVosNZN5jo0gWgsyKvxKIUL5R3swNvoorulAeL9kLB0iTSX7V6aokhla2m7xbg==", + "license": "Apache-2.0" + }, + "node_modules/schema-utils": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/search-insights": { + "version": "2.17.3", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz", + "integrity": "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==", + "license": "MIT", + "peer": true + }, + "node_modules/section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "license": "MIT" + }, + "node_modules/selfsigned": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-5.5.0.tgz", + "integrity": "sha512-ftnu3TW4+3eBfLRFnDEkzGxSF/10BJBkaLJuBHZX0kiPS7bRdlpZGu6YGt4KngMkdTwJE6MbjavFpqHvqVt+Ew==", + "license": "MIT", + "dependencies": { + "@peculiar/x509": "^1.14.2", + "pkijs": "^3.3.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", + "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/send": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.4.1", + "range-parser": "~1.2.1", + "statuses": "~2.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/send/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "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==", + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-handler": { + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.7.tgz", + "integrity": "sha512-CinAq1xWb0vR3twAv9evEU8cNWkXCb9kd5ePAHUKJBkOsUpR1wt/CvGdeca7vqumL1U5cSaeVQ6zZMxiJ3yWsg==", + "license": "MIT", + "dependencies": { + "bytes": "3.0.0", + "content-disposition": "0.5.2", + "mime-types": "2.1.18", + "minimatch": "3.1.5", + "path-is-inside": "1.0.2", + "path-to-regexp": "3.3.0", + "range-parser": "1.2.0" + } + }, + "node_modules/serve-handler/node_modules/path-to-regexp": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz", + "integrity": "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==", + "license": "MIT" + }, + "node_modules/serve-index": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.2.tgz", + "integrity": "sha512-KDj11HScOaLmrPxl70KYNW1PksP4Nb/CLL2yvC+Qd2kHMPEEpfc4Re2e4FOay+bC/+XQl/7zAcWON3JVo5v3KQ==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.8.0", + "mime-types": "~2.1.35", + "parseurl": "~1.3.3" + }, + "engines": { + "node": ">= 0.8.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "license": "MIT", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "~0.19.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "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" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", + "license": "MIT" + }, + "node_modules/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==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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==", + "license": "MIT", + "dependencies": { + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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==", + "license": "MIT", + "dependencies": { + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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==", + "license": "ISC" + }, + "node_modules/sirv": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", + "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "license": "MIT" + }, + "node_modules/sitemap": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.3.tgz", + "integrity": "sha512-tAjEd+wt/YwnEbfNB2ht51ybBJxbEWwe5ki/Z//Wh0rpBFTCUSj46GnxUKEWzhfuJTsee8x3lybHxFgUMig2hw==", + "license": "MIT", + "dependencies": { + "@types/node": "^17.0.5", + "@types/sax": "^1.2.1", + "arg": "^5.0.0", + "sax": "^1.2.4" + }, + "bin": { + "sitemap": "dist/cli.js" + }, + "engines": { + "node": ">=12.0.0", + "npm": ">=5.6.0" + } + }, + "node_modules/sitemap/node_modules/@types/node": { + "version": "17.0.45", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", + "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==", + "license": "MIT" + }, + "node_modules/skin-tone": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", + "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", + "license": "MIT", + "dependencies": { + "unicode-emoji-modifier-base": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "license": "MIT", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/sort-css-media-queries": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.2.0.tgz", + "integrity": "sha512-0xtkGhWCC9MGt/EzgnvbbbKhqWjl1+/rncmhTh5qCpbYguXh6S/qwePfv/JQ8jePXXmqingylxoC49pCkSPIbA==", + "license": "MIT", + "engines": { + "node": ">= 6.3.0" + } + }, + "node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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==", + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/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==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "license": "BSD-3-Clause" + }, + "node_modules/srcset": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/srcset/-/srcset-4.0.0.tgz", + "integrity": "sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/std-env": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", + "license": "MIT" + }, + "node_modules/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==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "license": "BSD-2-Clause", + "dependencies": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-ansi": { + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/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==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-to-js": { + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz", + "integrity": "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==", + "license": "MIT", + "dependencies": { + "style-to-object": "1.0.14" + } + }, + "node_modules/style-to-object": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz", + "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.2.7" + } + }, + "node_modules/stylehacks": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.1.1.tgz", + "integrity": "sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/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==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", + "license": "MIT" + }, + "node_modules/svgo": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.3.tgz", + "integrity": "sha512-+wn7I4p7YgJhHs38k2TNjy1vCfPIfLIJWR5MnCStsN8WuuTcBnRKcMHQLMM2ijxGZmDoZwNv8ipl5aTTen62ng==", + "license": "MIT", + "dependencies": { + "commander": "^7.2.0", + "css-select": "^5.1.0", + "css-tree": "^2.3.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.0.0", + "sax": "^1.5.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/tapable": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser": { + "version": "5.46.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.2.tgz", + "integrity": "sha512-uxfo9fPcSgLDYob/w1FuL0c99MWiJDnv+5qXSQc5+Ki5NjVNsYi66INnMFBjf6uFz6OnX12piJQPF4IpjJTNTw==", + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.5.0.tgz", + "integrity": "sha512-UYhptBwhWvfIjKd/UuFo6D8uq9xpGLDK+z8EDsj/zWhrTaH34cKEbrkMKfV5YWqGBvAYA3tlzZbs2R+qYrbQJA==", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "terser": "^5.31.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/terser-webpack-plugin/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==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "license": "MIT" + }, + "node_modules/thingies": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/thingies/-/thingies-2.6.0.tgz", + "integrity": "sha512-rMHRjmlFLM1R96UYPvpmnc3LYtdFrT33JIB7L9hetGue1qAPfn1N2LJeEjxUSidu1Iku+haLZXDuEXUHNGO/lg==", + "license": "MIT", + "engines": { + "node": ">=10.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "^2" + } + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "license": "MIT" + }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "license": "MIT" + }, + "node_modules/tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==", + "license": "MIT" + }, + "node_modules/tinypool": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", + "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tree-dump": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.1.0.tgz", + "integrity": "sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/tsyringe": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/tsyringe/-/tsyringe-4.10.0.tgz", + "integrity": "sha512-axr3IdNuVIxnaK5XGEUFTu3YmAQ6lllgrvqfEoR16g/HGnYY/6We4oWENtAnzK6/LpJ2ur9PAb80RBt7/U4ugw==", + "license": "MIT", + "dependencies": { + "tslib": "^1.9.3" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/tsyringe/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" + }, + "node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/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==", + "license": "MIT", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/undici-types": { + "version": "7.19.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.19.2.tgz", + "integrity": "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==", + "license": "MIT" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-emoji-modifier-base": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", + "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", + "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", + "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unique-string": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", + "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", + "license": "MIT", + "dependencies": { + "crypto-random-string": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz", + "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/universalify": { + "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/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/update-notifier": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-6.0.2.tgz", + "integrity": "sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==", + "license": "BSD-2-Clause", + "dependencies": { + "boxen": "^7.0.0", + "chalk": "^5.0.1", + "configstore": "^6.0.0", + "has-yarn": "^3.0.0", + "import-lazy": "^4.0.0", + "is-ci": "^3.0.1", + "is-installed-globally": "^0.4.0", + "is-npm": "^6.0.0", + "is-yarn-global": "^0.4.0", + "latest-version": "^7.0.0", + "pupa": "^3.1.0", + "semver": "^7.3.7", + "semver-diff": "^4.0.0", + "xdg-basedir": "^5.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/yeoman/update-notifier?sponsor=1" + } + }, + "node_modules/update-notifier/node_modules/boxen": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz", + "integrity": "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==", + "license": "MIT", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^7.0.1", + "chalk": "^5.2.0", + "cli-boxes": "^3.0.0", + "string-width": "^5.1.2", + "type-fest": "^2.13.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/camelcase": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", + "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/uri-js": { + "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/url-loader": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", + "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "mime-types": "^2.1.27", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "file-loader": "*", + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "file-loader": { + "optional": true + } + } + }, + "node_modules/url-loader/node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/url-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/url-loader/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==", + "license": "MIT" + }, + "node_modules/url-loader/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/url-loader/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/url-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", + "license": "MIT" + }, + "node_modules/utility-types": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", + "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "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==", + "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/value-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", + "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==", + "license": "MIT" + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", + "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/watchpack": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz", + "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==", + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "license": "MIT", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/webpack": { + "version": "5.106.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.106.2.tgz", + "integrity": "sha512-wGN3qcrBQIFmQ/c0AiOAQBvrZ5lmY8vbbMv4Mxfgzqd/B6+9pXtLo73WuS1dSGXM5QYY3hZnIbvx+K1xxe6FyA==", + "license": "MIT", + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.16.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.28.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.20.0", + "es-module-lexer": "^2.0.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "loader-runner": "^4.3.1", + "mime-db": "^1.54.0", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "terser-webpack-plugin": "^5.3.17", + "watchpack": "^2.5.1", + "webpack-sources": "^3.3.4" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-bundle-analyzer": { + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz", + "integrity": "sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw==", + "license": "MIT", + "dependencies": { + "@discoveryjs/json-ext": "0.5.7", + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "commander": "^7.2.0", + "debounce": "^1.2.1", + "escape-string-regexp": "^4.0.0", + "gzip-size": "^6.0.0", + "html-escaper": "^2.0.2", + "opener": "^1.5.2", + "picocolors": "^1.0.0", + "sirv": "^2.0.3", + "ws": "^7.3.1" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.5.tgz", + "integrity": "sha512-uxQ6YqGdE4hgDKNf7hUiPXOdtkXvBJXrfEGYSx7P7LC8hnUYGK70X6xQXUvXeNyBDDcsiQXpG2m3G9vxowaEuA==", + "license": "MIT", + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^4.43.1", + "mime-types": "^3.0.1", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + } + } + }, + "node_modules/webpack-dev-middleware/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-middleware/node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/webpack-dev-middleware/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-server": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.3.tgz", + "integrity": "sha512-9Gyu2F7+bg4Vv+pjbovuYDhHX+mqdqITykfzdM9UyKqKHlsE5aAjRhR+oOEfXW5vBeu8tarzlJFIZva4ZjAdrQ==", + "license": "MIT", + "dependencies": { + "@types/bonjour": "^3.5.13", + "@types/connect-history-api-fallback": "^1.5.4", + "@types/express": "^4.17.25", + "@types/express-serve-static-core": "^4.17.21", + "@types/serve-index": "^1.9.4", + "@types/serve-static": "^1.15.5", + "@types/sockjs": "^0.3.36", + "@types/ws": "^8.5.10", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.2.1", + "chokidar": "^3.6.0", + "colorette": "^2.0.10", + "compression": "^1.8.1", + "connect-history-api-fallback": "^2.0.0", + "express": "^4.22.1", + "graceful-fs": "^4.2.6", + "http-proxy-middleware": "^2.0.9", + "ipaddr.js": "^2.1.0", + "launch-editor": "^2.6.1", + "open": "^10.0.3", + "p-retry": "^6.2.0", + "schema-utils": "^4.2.0", + "selfsigned": "^5.5.0", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^7.4.2", + "ws": "^8.18.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webpack-dev-server/node_modules/open": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", + "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", + "license": "MIT", + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "wsl-utils": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.0.tgz", + "integrity": "sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/webpack-merge": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", + "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.4.1.tgz", + "integrity": "sha512-eACpxRN02yaawnt+uUNIF7Qje6A9zArxBbcAJjK1PK3S9Ycg5jIuJ8pW4q8EMnwNZCEGltcjkRx1QzOxOkKD8A==", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpackbar": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-7.0.0.tgz", + "integrity": "sha512-aS9soqSO2iCHgqHoCrj4LbfGQUboDCYJPSFOAchEK+9psIjNrfSWW4Y0YEz67MKURNvMmfo0ycOg9d/+OOf9/Q==", + "license": "MIT", + "dependencies": { + "ansis": "^3.2.0", + "consola": "^3.2.3", + "pretty-time": "^1.1.0", + "std-env": "^3.7.0" + }, + "engines": { + "node": ">=14.21.3" + }, + "peerDependencies": { + "@rspack/core": "*", + "webpack": "3 || 4 || 5" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "license": "Apache-2.0", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/widest-line": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", + "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", + "license": "MIT", + "dependencies": { + "string-width": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "license": "MIT" + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "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==", + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/wsl-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", + "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", + "license": "MIT", + "dependencies": { + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wsl-utils/node_modules/is-wsl": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", + "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/xdg-basedir": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", + "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/xml-js": { + "version": "1.6.11", + "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", + "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", + "license": "MIT", + "dependencies": { + "sax": "^1.2.4" + }, + "bin": { + "xml-js": "bin/cli.js" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", + "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/docusaurus-asgardeo/package.json b/docusaurus-asgardeo/package.json new file mode 100644 index 0000000000..8db1bb2901 --- /dev/null +++ b/docusaurus-asgardeo/package.json @@ -0,0 +1,35 @@ +{ + "name": "asgardeo-docs-docusaurus", + "version": "0.1.0", + "private": true, + "scripts": { + "docusaurus": "docusaurus", + "prebuild": "node scripts/preprocess.js", + "build": "docusaurus build", + "start": "ulimit -n 4096 && CHOKIDAR_USEPOLLING=1000 npm run prebuild && docusaurus start --no-open", + "dev": "ulimit -n 4096 && CHOKIDAR_USEPOLLING=1000 npm run prebuild && docusaurus start --no-open --poll 1000", + "swizzle": "docusaurus swizzle", + "deploy": "docusaurus deploy", + "clear": "docusaurus clear && rm -rf .generated-docs" + }, + "dependencies": { + "@docusaurus/core": "^3.10.1", + "@docusaurus/preset-classic": "^3.10.1", + "clsx": "^2.1.1", + "nunjucks": "^3.2.4", + "prism-react-renderer": "^2.4.1", + "react": "^18.3.1", + "react-dom": "^18.3.1" + }, + "devDependencies": { + "@docusaurus/module-type-aliases": "^3.10.1", + "@docusaurus/types": "^3.10.1" + }, + "browserslist": { + "production": [">0.5%", "not dead", "not op_mini all"], + "development": ["last 3 chrome version", "last 3 firefox version", "last 5 safari version"] + }, + "engines": { + "node": ">=18.0" + } +} diff --git a/docusaurus-asgardeo/scripts/preprocess.js b/docusaurus-asgardeo/scripts/preprocess.js new file mode 100644 index 0000000000..c8ae1f7920 --- /dev/null +++ b/docusaurus-asgardeo/scripts/preprocess.js @@ -0,0 +1,451 @@ +#!/usr/bin/env node + +const nunjucks = require('nunjucks'); +const fs = require('fs'); +const path = require('path'); + +const REPO_ROOT = path.resolve(__dirname, '..', '..'); +const DOCS_SRC = path.join(REPO_ROOT, 'en', 'asgardeo', 'docs'); +const INCLUDES_DIR = path.join(REPO_ROOT, 'en', 'includes'); +const GENERATED_DIR = path.join(__dirname, '..', '.generated-docs'); + +const templateVars = { + product_name: 'Asgardeo', + base_path: '', + product: 'asgardeo', + product_url_format: 'https://api.asgardeo.io', + is_version: '99.0.0', + content: { + sdkconfig: { + baseUrl: 'https://api.asgardeo.io/t/', + }, + }, +}; + +const env = nunjucks.configure(REPO_ROOT, { + autoescape: false, + trimBlocks: true, + lstripBlocks: true, + throwOnUndefined: false, +}); + +const SKIP_DIRS = new Set(['assets', '__pycache__', '.venv', '.DS_Store', 'node_modules']); + +function renderTemplate(filePath) { + try { + const relativePath = path.relative(REPO_ROOT, filePath); + return env.render(relativePath, templateVars); + } catch (err) { + console.error(` ERROR rendering ${filePath}: ${err.message}`); + return fs.readFileSync(filePath, 'utf-8'); + } +} + +function stripFrontmatter(content) { + return content.replace(/^---\s*\n[\s\S]*?^---\s*\n/gm, (match) => { + if (match.includes('template:')) return ''; + return match; + }); +} + +function stripPageNotFound(content) { + if (content.includes('') && content.includes('page-not-found')) { + return '# Page Not Found\n\nThe page you are looking for does not exist.\n'; + } + return content; +} + +function stripScriptBlocks(content) { + return content.replace(/]*>[\s\S]*?<\/script>/gi, ''); +} + +function convertImageSyntax(content) { + return content.replace( + /!\[([^\]]*)\]\(([^)]+)\)\{:\s*([^}]+)\}/g, + (match, alt, src, attrs) => { + const widthMatch = attrs.match(/width=["']?([^"'\s]+)/); + const styleMatch = attrs.match(/style=["']([^"']+)["']/); + let htmlAttrs = ''; + if (widthMatch) htmlAttrs += ` width="${widthMatch[1]}"`; + if (styleMatch) htmlAttrs += ` style="${styleMatch[1]}"`; + if (htmlAttrs) { + return `${alt}`; + } + return `![${alt}](${src})`; + } + ); +} + +function convertLinkSyntax(content) { + return content + .replace(/\[([^\]]*)\]\(([^)]+)\)\{:\s*target=["']_blank["']\s*\}/g, (m, t, u) => `[${t}](${u})`) + .replace(/\{:target="_blank"\}/g, ''); +} + +function resolveRelativePaths(content, sourceFilePath) { + const sourceDir = path.dirname(sourceFilePath); + + content = content.replace(/!\[([^\]]*)\]\(([^)]+)\)/g, (match, alt, src) => { + if (src.startsWith('http://') || src.startsWith('https://') || src.startsWith('/')) return match; + const resolved = path.resolve(sourceDir, src); + const relToDocs = path.relative(DOCS_SRC, resolved); + if (!relToDocs.startsWith('..')) return `![${alt}](/${relToDocs})`; + return `![${alt}](/${path.relative(REPO_ROOT, resolved)})`; + }); + + content = content.replace(/]*src=["']([^"']+)["'][^>]*>/g, (match, src) => { + if (src.startsWith('http://') || src.startsWith('https://') || src.startsWith('/')) return match; + const resolved = path.resolve(sourceDir, src); + const relToDocs = path.relative(DOCS_SRC, resolved); + if (!relToDocs.startsWith('..')) return match.replace(src, `/${relToDocs}`); + return match.replace(src, `/${path.relative(REPO_ROOT, resolved)}`); + }); + + return content; +} + +function stripAttrLists(content) { + return content.replace(/\{:([^}]+)\}/g, (match, attrs) => { + if (attrs.includes('target=')) return ''; + if (attrs.includes('width=') || attrs.includes('style=')) return ''; + return ''; + }); +} + +function fixHtmlTags(content) { + content = content.replace(//gi, '
'); + content = content.replace(/<\/br>/gi, ''); + content = content.replace(//gi, '
'); + return content; +} + +function escapeMdxBraces(content) { + const lines = content.split('\n'); + let inFence = false; + const result = []; + + for (const line of lines) { + const trimmed = line.trimStart(); + if (trimmed.startsWith('```') || trimmed.startsWith('~~~')) { + inFence = !inFence; + result.push(line); + continue; + } + if (inFence) { + result.push(line); + continue; + } + result.push(line.replace(/\{/g, '{').replace(/\}/g, '}')); + } + return result.join('\n'); +} + +function convertAdmonitions(content) { + // Map custom mkdocs admonition types to Docusaurus-supported types + const typeMap = { + example: 'info', + abstract: 'note', + prerequisite: 'info', + question: 'info', + quote: 'info', + bug: 'warning', + failure: 'danger', + important: 'warning', + success: 'tip', + }; + + return content + .replace(/^!{3}\+?\s*(\w+)\s*"(.*?)"\s*$/gm, (_, type, title) => { + const mapped = typeMap[type.toLowerCase()] || type.toLowerCase(); + return `:::${mapped} ${title}`; + }) + .replace(/^!{3}\+?\s*(\w+)\s*$/gm, (_, type) => { + const mapped = typeMap[type.toLowerCase()] || type.toLowerCase(); + return `:::${mapped}`; + }) + .replace(/^!{3}\s*$/gm, ':::note') + .replace(/^\?{3}\+?\s*(\w+)\s*"(.*?)"\s*$/gm, (_, type, title) => `
${title}`) + .replace(/^\?{3}\+?\s*(\w+)\s*$/gm, '
Details') + .replace(/^\?{3}\s*$/gm, '
Details'); +} + +function postProcess(content, sourceFilePath) { + let processed = content; + processed = stripFrontmatter(processed); + processed = stripPageNotFound(processed); + processed = stripScriptBlocks(processed); + processed = convertAdmonitions(processed); + processed = convertImageSyntax(processed); + processed = convertLinkSyntax(processed); + processed = resolveRelativePaths(processed, sourceFilePath); + processed = fixRedocSpecUrls(processed); + processed = stripAttrLists(processed); + processed = fixHtmlTags(processed); + processed = escapeMdxBraces(processed); + return processed; +} + +function fixRedocSpecUrls(content) { + // Fix absolute spec-url paths to include baseUrl + content = content.replace( + /(]*spec-url=")(\/[^"]+)("[^>]*>)/g, + '$1/asgardeo/docs$2$3' + ); + // Fix relative spec-url paths (e.g. ../../apis/...) + content = content.replace( + /(]*spec-url=")(\.\.\/[^"]+)("[^>]*>)/g, + (match, prefix, path, suffix) => { + // Resolve relative path to absolute and add baseUrl + const resolved = path.replace(/\.\.\/+/g, ''); + return `${prefix}/asgardeo/docs/${resolved}${suffix}`; + } + ); + // Inject Asgardeo redoc theme (orange primary color) + content = content.replace( + /theme=''/g, + `theme='{"colors":{"primary":{"main":"#ff7300"}}}'` + ); + return content; +} + +function shouldProcess(file) { + return fs.statSync(file).isFile() && file.endsWith('.md'); +} + +function processDirectory(srcDir, destDir) { + if (!fs.existsSync(destDir)) fs.mkdirSync(destDir, { recursive: true }); + + for (const entry of fs.readdirSync(srcDir, { withFileTypes: true })) { + if (entry.name.startsWith('.') || SKIP_DIRS.has(entry.name)) continue; + + const srcPath = path.join(srcDir, entry.name); + const destPath = path.join(destDir, entry.name); + + if (entry.isDirectory()) { + processDirectory(srcPath, destPath); + } else if (shouldProcess(srcPath)) { + const rendered = renderTemplate(srcPath); + const processed = postProcess(rendered, srcPath); + const destDirPath = path.dirname(destPath); + if (!fs.existsSync(destDirPath)) fs.mkdirSync(destDirPath, { recursive: true }); + fs.writeFileSync(destPath, processed, 'utf-8'); + console.log(` Processed: ${path.relative(REPO_ROOT, srcPath)}`); + } + } +} + +function main() { + console.log('Preprocessing MkDocs content for Docusaurus...\n'); + if (fs.existsSync(GENERATED_DIR)) fs.rmSync(GENERATED_DIR, { recursive: true }); + + console.log(`Source: ${DOCS_SRC}`); + console.log(`Output: ${GENERATED_DIR}`); + console.log(`Includes: ${INCLUDES_DIR}\n`); + + processDirectory(DOCS_SRC, GENERATED_DIR); + + deduplicateIndexPages(GENERATED_DIR); + + // Remove source index.md since we create our own index.mdx + const oldIndexPath = path.join(GENERATED_DIR, 'index.md'); + if (fs.existsSync(oldIndexPath)) fs.rmSync(oldIndexPath); + + createHomePage(); + createSDKsPage(); + + const fileCount = fs.readdirSync(GENERATED_DIR, { recursive: true }).filter(f => f.endsWith('.md')).length; + console.log(`\nPreprocessing complete. ${fileCount} files generated.`); +} + +function deduplicateIndexPages(dir) { + const entries = fs.readdirSync(dir, { withFileTypes: true }); + for (const entry of entries) { + if (entry.isDirectory()) { + deduplicateIndexPages(path.join(dir, entry.name)); + } + } + + const dirEntries = fs.readdirSync(dir, { withFileTypes: true }); + const dirName = path.basename(dir); + const hasIndexMd = fs.existsSync(path.join(dir, 'index.md')); + const hasDirNamedMd = fs.existsSync(path.join(dir, `${dirName}.md`)); + + // Case 1: foo.md + foo/index.md at sibling level -> remove foo.md + for (const entry of dirEntries) { + if (!entry.isFile() || !entry.name.endsWith('.md') || entry.name === 'index.md') continue; + const baseName = entry.name.replace(/\.md$/, ''); + const subDir = dirEntries.find(e => e.isDirectory() && e.name === baseName); + if (subDir && fs.existsSync(path.join(dir, subDir.name, 'index.md'))) { + console.log(` Removing duplicate: ${path.relative(GENERATED_DIR, path.join(dir, entry.name))}`); + fs.rmSync(path.join(dir, entry.name)); + } + } + + // Case 2: foo/index.md + foo/foo.md -> rename foo/foo.md to avoid Docusaurus folder-index conflict + if (hasIndexMd && hasDirNamedMd) { + const newName = `${dirName}-guide.md`; + console.log(` Renaming to avoid conflict: ${path.relative(GENERATED_DIR, path.join(dir, `${dirName}.md`))} -> ${path.relative(GENERATED_DIR, path.join(dir, newName))}`); + fs.renameSync(path.join(dir, `${dirName}.md`), path.join(dir, newName)); + } +} + +function createHomePage() { + const homePath = path.join(GENERATED_DIR, 'index.mdx'); + const homeContent = `--- +sidebar_label: Home +--- + +import HomePageCards from '@site/src/components/HomePageCards'; + + +`; + fs.writeFileSync(homePath, homeContent, 'utf-8'); +} + +function createSDKsPage() { + const sdkPath = path.join(GENERATED_DIR, 'sdks', 'index.md'); + const sdkContent = `--- +sidebar_label: SDKs +--- + +import Card from '@site/src/components/Card'; + +# SDKs + +Explore our official and community SDKs to integrate with Asgardeo easily. + +## Official SDKs + +Official SDKs developed and maintained by the Asgardeo team for seamless integration. + +
+ + + + + + + + + + + + + + + +
+ +## Community SDKs + +Third-party SDKs built by the community to support OIDC and OAuth integration with any provider. + +
+ + + + + + + + + + + + + +
+`; + const sdkDir = path.join(GENERATED_DIR, 'sdks'); + if (!fs.existsSync(sdkDir)) fs.mkdirSync(sdkDir, { recursive: true }); + fs.writeFileSync(sdkPath, sdkContent, 'utf-8'); +} + +main(); diff --git a/docusaurus-asgardeo/sidebars.js b/docusaurus-asgardeo/sidebars.js new file mode 100644 index 0000000000..4b330b60df --- /dev/null +++ b/docusaurus-asgardeo/sidebars.js @@ -0,0 +1,1589 @@ +// Curated sidebar matching en/asgardeo mkdocs.yml nav structure. +// Paths are relative to .generated-docs, without the .md extension. + +/** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */ +const sidebars = { + docs: [ + { type: 'doc', id: 'index', label: 'Home', className: 'sidebar-icon-home' }, + { + type: 'category', + label: 'Get started', + className: 'sidebar-icon-rocket', + link: { type: 'doc', id: 'get-started/index' }, + items: [ + { type: 'doc', id: 'get-started/create-asgardeo-account', label: 'Create Account' }, + { + type: 'category', + label: 'Connect App', + items: [ + { + type: 'category', + label: 'React', + className: 'sidebar-icon-ca-react', + items: [ + { type: 'doc', id: 'quick-starts/react', label: 'Quickstart' }, + { type: 'doc', id: 'complete-guides/react/introduction', label: 'Complete Guide' }, + ], + }, + { + type: 'category', + label: 'Vue', + className: 'sidebar-icon-ca-vue', + items: [ + { type: 'doc', id: 'quick-starts/vue', label: 'Quickstart' }, + ], + }, + { + type: 'category', + label: 'Nuxt', + items: [ + { type: 'doc', id: 'quick-starts/nuxt', label: 'Quickstart' }, + ], + }, + { + type: 'category', + label: 'Angular', + className: 'sidebar-icon-ca-angular', + items: [ + { type: 'doc', id: 'quick-starts/angular', label: 'Quickstart' }, + { type: 'doc', id: 'complete-guides/angular/introduction', label: 'Complete Guide' }, + ], + }, + { + type: 'category', + label: 'Javascript', + className: 'sidebar-icon-ca-js', + items: [ + { type: 'doc', id: 'quick-starts/javascript', label: 'Quickstart' }, + { type: 'doc', id: 'complete-guides/javascript/introduction', label: 'Complete Guide' }, + ], + }, + { + type: 'category', + label: 'Next.js', + items: [ + { type: 'doc', id: 'quick-starts/nextjs', label: 'Quickstart' }, + { type: 'doc', id: 'complete-guides/nextjs/introduction', label: 'Complete Guide (Redirect)' }, + { type: 'doc', id: 'complete-guides/app-native/introduction', label: 'Complete Guide (App-Native)' }, + { type: 'doc', id: 'complete-guides/nextjs-b2b/introduction', label: 'Complete Guide (B2B)' }, + ], + }, + { + type: 'category', + label: 'Express.js', + items: [ + { type: 'doc', id: 'complete-guides/expressjs/introduction', label: 'Complete Guide' }, + ], + }, + { + type: 'category', + label: '.NET', + items: [ + { type: 'doc', id: 'complete-guides/dotnet/introduction', label: 'Complete Guide' }, + ], + }, + { + type: 'category', + label: 'Spring Boot', + items: [ + { type: 'doc', id: 'quick-starts/springboot', label: 'Quickstart' }, + ], + }, + ], + }, + { + type: 'category', + label: 'Try for a sample app', + items: [ + { type: 'doc', id: 'get-started/try-samples/index', label: 'Try for a sample app' }, + { + type: 'category', + label: 'Single Page apps', + items: [ + { type: 'doc', id: 'get-started/try-samples/qsg-spa-react', label: 'React' }, + { type: 'doc', id: 'get-started/try-samples/qsg-spa-javascript', label: 'JavaScript' }, + ], + }, + { + type: 'category', + label: 'Web apps', + items: [ + { type: 'doc', id: 'get-started/try-samples/qsg-oidc-webapp-java-ee', label: 'OIDC Java EE' }, + { type: 'doc', id: 'get-started/try-samples/qsg-saml-webapp-java-ee', label: 'SAML Java EE' }, + { type: 'doc', id: 'get-started/try-samples/ws-federation-webapp', label: 'WS-Federation' }, + ], + }, + ], + }, + { + type: 'category', + label: 'Secure MCP Servers', + items: [ + { type: 'doc', id: 'quick-starts/mcp-auth-server', label: 'TypeScript' }, + { type: 'doc', id: 'quick-starts/mcp-auth-server-py', label: 'Python' }, + { type: 'doc', id: 'quick-starts/cloudflare-mcp-server', label: 'Cloudflare Quickstart' }, + ], + }, + { + type: 'category', + label: 'Secure Your AI Agents', + items: [ + { type: 'doc', id: 'quick-starts/agent-auth-py', label: 'Python' }, + { type: 'doc', id: 'quick-starts/agent-auth-ts', label: 'TypeScript' }, + ], + }, + ], + }, + { type: 'html', value: '' }, + { + type: 'category', + label: 'Guides', + className: 'sidebar-icon-book', + items: [ + { type: 'doc', id: 'guides/index', label: 'Guides - Overview' }, + { + type: 'category', + label: 'Applications', + items: [ + { type: 'doc', id: 'guides/applications/index', label: 'Applications' }, + { type: 'doc', id: 'guides/applications/register-single-page-app', label: 'Register an SPA' }, + { type: 'doc', id: 'guides/applications/register-oidc-web-app', label: 'Register web app with OIDC' }, + { type: 'doc', id: 'guides/applications/register-saml-web-app', label: 'Register web app with SAML' }, + { type: 'doc', id: 'guides/applications/register-standard-based-app', label: 'Register a standard-based app' }, + { type: 'doc', id: 'guides/applications/register-mobile-app', label: 'Register a mobile app' }, + { type: 'doc', id: 'guides/applications/register-machine-to-machine-app', label: 'Register a machine-to-machine app' }, + { type: 'doc', id: 'guides/applications/register-a-fapi-compliant-app', label: 'Register a FAPI-compliant app' }, + { type: 'doc', id: 'guides/applications/register-react-app', label: 'Register a React app' }, + { type: 'doc', id: 'guides/applications/register-nextjs-app', label: 'Register a Next.js app' }, + ], + }, + { + type: 'category', + label: 'Authentication', + items: [ + { type: 'doc', id: 'guides/authentication/index', label: 'Authentication' }, + { + type: 'category', + label: 'Add login to apps', + items: [ + { type: 'doc', id: 'guides/authentication/add-login-to-apps', label: 'Add login to apps' }, + { type: 'doc', id: 'guides/authentication/add-login-to-single-page-app', label: 'Add login to an SPA' }, + { type: 'doc', id: 'guides/authentication/add-login-to-web-app', label: 'Add login to a web app' }, + { type: 'doc', id: 'guides/authentication/add-login-to-mobile-app', label: 'Add login to a mobile app' }, + ], + }, + { + type: 'category', + label: 'Add login to SaaS apps', + items: [ + { type: 'doc', id: 'guides/authentication/sso-integrations/index', label: 'Add SSO login to SaaS apps' }, + { type: 'doc', id: 'guides/authentication/sso-integrations/add-google-workspace-template', label: 'Google Workspace' }, + { type: 'doc', id: 'guides/authentication/sso-integrations/add-salesforce-template', label: 'Salesforce' }, + { type: 'doc', id: 'guides/authentication/sso-integrations/add-microsoft-365-template', label: 'Microsoft 365' }, + { type: 'doc', id: 'guides/authentication/sso-integrations/add-zoom-template', label: 'Zoom' }, + { type: 'doc', id: 'guides/authentication/sso-integrations/add-slack-template', label: 'Slack' }, + ], + }, + { + type: 'category', + label: 'Add passwordless login', + items: [ + { type: 'doc', id: 'guides/authentication/passwordless-login/index', label: 'Add passwordless login' }, + { type: 'doc', id: 'guides/authentication/passwordless-login/add-passwordless-login-with-magic-link', label: 'Add login with Magic link' }, + { type: 'doc', id: 'guides/authentication/passwordless-login/add-passwordless-login-with-passkey', label: 'Add login with Passkey' }, + { type: 'doc', id: 'guides/authentication/passwordless-login/add-passwordless-login-with-hypr', label: 'Add login with HYPR' }, + { type: 'doc', id: 'guides/authentication/passwordless-login/add-passwordless-login-with-email-otp', label: 'Add login with Email OTP' }, + { type: 'doc', id: 'guides/authentication/passwordless-login/add-passwordless-login-with-sms-otp', label: 'Add login with SMS OTP' }, + { type: 'doc', id: 'guides/authentication/passwordless-login/add-passwordless-login-with-push-notification', label: 'Add login with Push Notification' }, + ], + }, + { + type: 'category', + label: 'Enable user attributes', + items: [ + { type: 'doc', id: 'guides/authentication/user-attributes/index', label: 'Enable user attributes' }, + { type: 'doc', id: 'guides/authentication/user-attributes/enable-attributes-for-oidc-app', label: 'Enable attributes for OIDC apps' }, + { type: 'doc', id: 'guides/authentication/user-attributes/enable-attributes-for-saml-app', label: 'Enable attributes for SAML apps' }, + ], + }, + { type: 'doc', id: 'guides/authentication/manage-consent-for-attributes', label: 'Manage consent for user attributes' }, + { + type: 'category', + label: 'Add federated login', + items: [ + { type: 'doc', id: 'guides/authentication/federated-login/index', label: 'Add federated login' }, + { + type: 'category', + label: 'Add social login', + items: [ + { type: 'doc', id: 'guides/authentication/social-login/index', label: 'Add social login' }, + { type: 'doc', id: 'guides/authentication/social-login/add-facebook-login', label: 'Add Facebook login' }, + { type: 'doc', id: 'guides/authentication/social-login/add-github-login', label: 'Add GitHub login' }, + { type: 'doc', id: 'guides/authentication/social-login/add-google-login', label: 'Add Google login' }, + { type: 'doc', id: 'guides/authentication/social-login/add-microsoft-login', label: 'Add Microsoft login' }, + { type: 'doc', id: 'guides/authentication/social-login/add-apple-login', label: 'Add Apple login' }, + { type: 'doc', id: 'guides/authentication/social-login/add-linkedin-login', label: 'Add LinkedIn login' }, + ], + }, + { + type: 'category', + label: 'Add decentralized login', + items: [ + { type: 'doc', id: 'guides/authentication/decentralized-login/index', label: 'Add decentralized login' }, + { type: 'doc', id: 'guides/authentication/decentralized-login/sign-in-with-ethereum', label: 'Sign-in with Ethereum' }, + ], + }, + { + type: 'category', + label: 'Add eID login', + items: [ + { type: 'doc', id: 'guides/authentication/eid-login/add-signicat-login', label: 'Add Signicat login' }, + { type: 'doc', id: 'guides/authentication/eid-login/add-france-connect-login', label: 'Add FranceConnect login' }, + { type: 'doc', id: 'guides/authentication/eid-login/add-swiss-id-login', label: 'Add SwissID login' }, + ], + }, + { + type: 'category', + label: 'Add standard-based login', + items: [ + { type: 'doc', id: 'guides/authentication/standard-based-login/index', label: 'Add standard-based login' }, + { type: 'doc', id: 'guides/authentication/standard-based-login/add-oidc-idp-login', label: 'Add login with OIDC IdP' }, + { type: 'doc', id: 'guides/authentication/standard-based-login/add-saml-idp-login', label: 'Add login with SAML IdP' }, + ], + }, + ], + }, + { type: 'doc', id: 'guides/authentication/add-identifier-first-login', label: 'Add identifier first login' }, + { + type: 'category', + label: 'Add multi-factor authentication', + items: [ + { type: 'doc', id: 'guides/authentication/mfa/index', label: 'Add multi-factor authentication' }, + { type: 'doc', id: 'guides/authentication/mfa/add-totp-login', label: 'Add TOTP' }, + { type: 'doc', id: 'guides/authentication/mfa/add-emailotp-login', label: 'Add Email OTP' }, + { type: 'doc', id: 'guides/authentication/mfa/add-smsotp-login', label: 'Add SMS OTP' }, + { type: 'doc', id: 'guides/authentication/mfa/add-push-auth-login', label: 'Add Push Notification' }, + { type: 'doc', id: 'guides/authentication/mfa/add-passkey-login', label: 'Add Passkey' }, + { type: 'doc', id: 'guides/authentication/mfa/add-iproov-login', label: 'Add iProov' }, + { type: 'doc', id: 'guides/authentication/mfa/add-duo-login', label: 'Add Duo' }, + { type: 'doc', id: 'guides/authentication/mfa/user-preferred-mfa-login', label: 'Add user-preferred MFA' }, + ], + }, + { + type: 'category', + label: 'Add conditional authentication', + items: [ + { type: 'doc', id: 'guides/authentication/conditional-auth/index', label: 'Add conditional authentication' }, + { type: 'doc', id: 'guides/authentication/conditional-auth/configure-conditional-auth', label: 'Set up conditional authentication' }, + { + type: 'category', + label: 'Add access control', + items: [ + { type: 'doc', id: 'guides/authentication/conditional-auth/access-control', label: 'Add access control' }, + { type: 'doc', id: 'guides/authentication/conditional-auth/user-age-based-template', label: 'User Age-based access' }, + { type: 'doc', id: 'guides/authentication/conditional-auth/group-based-template-access-control', label: 'Group-based access' }, + { type: 'doc', id: 'guides/authentication/conditional-auth/concurrent-session-based-template', label: 'Concurrent session-based access' }, + ], + }, + { + type: 'category', + label: 'Add adaptive MFA', + items: [ + { type: 'doc', id: 'guides/authentication/conditional-auth/adaptive-mfa', label: 'Add adaptive MFA' }, + { type: 'doc', id: 'guides/authentication/conditional-auth/group-based-template', label: 'MFA based on user group' }, + { type: 'doc', id: 'guides/authentication/conditional-auth/sign-in-option-based-template', label: 'MFA based on sign-in option' }, + { type: 'doc', id: 'guides/authentication/conditional-auth/new-device-based-template', label: 'MFA based on user device' }, + { type: 'doc', id: 'guides/authentication/conditional-auth/ip-based-template', label: 'MFA based on IP address' }, + { type: 'doc', id: 'guides/authentication/conditional-auth/add-authentications-based-on-api-calls', label: 'MFA based on advanced conditions (using WSO2 Choreo)' }, + ], + }, + { + type: 'category', + label: 'Specialized scenarios', + items: [ + { type: 'doc', id: 'guides/authentication/conditional-auth/passkey-progressive-enrollment-based-template', label: 'Add passkey progressive enrollment' }, + { type: 'doc', id: 'guides/authentication/conditional-auth/push-device-progressive-enrollment-based-template', label: 'Add push notification device progressive enrollment' }, + { type: 'doc', id: 'guides/authentication/conditional-auth/on-demand-silent-password-migration-template', label: 'Add on-demand silent password migration' }, + { type: 'doc', id: 'guides/authentication/conditional-auth/otp-retry-resend-limits', label: 'OTP Retry and Resend Limits' }, + ], + }, + { type: 'doc', id: 'guides/authentication/conditional-auth/write-your-first-script', label: 'Write a custom authentication script' }, + ], + }, + { + type: 'category', + label: 'App-native authentication', + items: [ + { type: 'doc', id: 'guides/authentication/app-native-authentication/index', label: 'App-native authentication' }, + { type: 'doc', id: 'guides/authentication/app-native-authentication/add-app-native-authentication', label: 'Add app-native authentication' }, + { type: 'doc', id: 'guides/authentication/app-native-authentication/secure-app-native-authentication-flows', label: 'Secure app-native authentication flows' }, + { type: 'doc', id: 'guides/authentication/app-native-authentication/handle-advanced-login-scenarios', label: 'Handle advanced login scenarios' }, + ], + }, + { type: 'doc', id: 'guides/authentication/login-flow-ai', label: 'Login Flow AI' }, + { + type: 'category', + label: 'Configure OIDC flows', + items: [ + { type: 'doc', id: 'guides/authentication/oidc/index', label: 'Configure OIDC flows' }, + { type: 'doc', id: 'guides/authentication/oidc/discover-oidc-configs', label: 'Discover OIDC endpoints' }, + { type: 'doc', id: 'guides/authentication/oidc/oauth-dynamic-client-registration', label: 'Dynamic Client Registration (DCR)' }, + { + type: 'category', + label: 'Login flows', + items: [ + { type: 'doc', id: 'guides/authentication/oidc/implement-auth-code', label: 'Authorization code flow' }, + { type: 'doc', id: 'guides/authentication/oidc/implement-auth-code-with-pkce', label: 'Authorization code flow and PKCE' }, + { type: 'doc', id: 'guides/authentication/oidc/implement-oidc-hybrid-flow', label: 'Hybrid flow' }, + { type: 'doc', id: 'guides/authentication/oidc/implement-login-with-par', label: 'Pushed Authorization Requests (PAR)' }, + { type: 'doc', id: 'guides/authentication/oidc/jarm', label: 'JWT Secured Authorization Response Mode (JARM) for OAuth 2.0' }, + ], + }, + { + type: 'category', + label: 'Grant types', + items: [ + { type: 'doc', id: 'guides/authentication/configure-jwt-bearer-grant', label: 'JWT Bearer Grant' }, + { type: 'doc', id: 'guides/authentication/configure-ciba-grant', label: 'CIBA Grant' }, + ], + }, + { + type: 'category', + label: 'Client authentication methods', + items: [ + { type: 'doc', id: 'guides/authentication/oidc/private-key-jwt-client-auth', label: 'Private key JWT' }, + ], + }, + { + type: 'category', + label: 'Tokens and validation', + items: [ + { type: 'doc', id: 'guides/authentication/oidc/token-validation-resource-server', label: 'Validate tokens at a resource server' }, + { type: 'doc', id: 'guides/authentication/oidc/validate-jwt-with-jwks', label: 'Validate JWT with JWKS' }, + { type: 'doc', id: 'guides/authentication/oidc/validate-id-tokens', label: 'Validate ID tokens' }, + { + type: 'category', + label: 'Encrypt ID tokens', + items: [ + { type: 'doc', id: 'guides/authentication/oidc/encrypt-decrypt-id-tokens', label: 'Encrypt and decrypt ID tokens' }, + { type: 'doc', id: 'guides/authentication/oidc/id-token-encryption-reference', label: 'ID token encryption reference' }, + ], + }, + { type: 'doc', id: 'guides/authentication/oidc/request-user-info', label: 'Request user information' }, + { type: 'doc', id: 'guides/authentication/oidc/revoke-tokens', label: 'Revoke tokens' }, + { type: 'doc', id: 'guides/authentication/configure-token-exchange', label: 'Configure token exchange' }, + ], + }, + { + type: 'category', + label: 'Logout', + items: [ + { type: 'doc', id: 'guides/authentication/oidc/add-logout', label: 'Front-channel logout' }, + { type: 'doc', id: 'guides/authentication/oidc/add-back-channel-logout', label: 'Back-channel logout' }, + ], + }, + ], + }, + { + type: 'category', + label: 'Configure SAML flows', + items: [ + { type: 'doc', id: 'guides/authentication/saml/index', label: 'Configure SAML flows' }, + { type: 'doc', id: 'guides/authentication/saml/discover-saml-configs', label: 'Discover SAML endpoints and settings' }, + { type: 'doc', id: 'guides/authentication/saml/saml-federated-idp-initiated-sso', label: 'Implement SAML federated IdP-initiated SSO' }, + { type: 'doc', id: 'guides/authentication/saml/saml-back-channel-logout', label: 'SAML back-channel logout' }, + ], + }, + { type: 'doc', id: 'guides/authentication/jit-user-provisioning', label: 'Configure Just-in-Time user provisioning' }, + ], + }, + { + type: 'category', + label: 'Authorization', + items: [ + { type: 'doc', id: 'guides/authorization/index', label: 'Authorization' }, + { + type: 'category', + label: 'API authorization', + items: [ + { type: 'doc', id: 'guides/authorization/api-authorization/api-authorization', label: 'Role-based access control' }, + ], + }, + { + type: 'category', + label: 'User impersonation', + items: [ + { type: 'doc', id: 'guides/authorization/user-impersonation/index', label: 'User impersonation' }, + { type: 'doc', id: 'guides/authorization/user-impersonation/via-console', label: 'via Console' }, + { type: 'doc', id: 'guides/authorization/user-impersonation/via-business-application', label: 'via business application (advanced)' }, + ], + }, + ], + }, + { + type: 'category', + label: 'Identity Verification', + items: [ + { type: 'doc', id: 'guides/identity-verification/index', label: 'Identity Verification' }, + { type: 'doc', id: 'guides/identity-verification/configure-identity-verification-provider', label: 'Configure an Identity Verification Provider' }, + { type: 'doc', id: 'guides/identity-verification/add-identity-verification-with-onfido', label: 'Identity Verification with Onfido' }, + ], + }, + { + type: 'category', + label: 'User management', + items: [ + { type: 'doc', id: 'guides/users/index', label: 'User management' }, + { type: 'doc', id: 'guides/users/manage-administrators', label: 'Manage administrators' }, + { + type: 'category', + label: 'Users', + items: [ + { type: 'doc', id: 'guides/users/onboard-users', label: 'Onboard users' }, + { type: 'doc', id: 'guides/users/manage-users', label: 'Manage users' }, + ], + }, + { type: 'doc', id: 'guides/users/manage-groups', label: 'Manage groups' }, + { type: 'doc', id: 'guides/users/manage-roles', label: 'Manage roles' }, + { type: 'doc', id: 'guides/users/manage-sessions', label: 'Manage active sessions' }, + { + type: 'category', + label: 'Outbound provisioning', + items: [ + { type: 'doc', id: 'guides/users/outbound-provisioning/outbound-provisioning-overview', label: 'Overview' }, + { type: 'doc', id: 'guides/users/outbound-provisioning/setup-outbound-provisioning', label: 'Set up outbound provisioning' }, + { type: 'doc', id: 'guides/users/outbound-provisioning/group-based-provisioning', label: 'Group-based provisioning' }, + { + type: 'category', + label: 'Configure an outbound connector', + items: [ + { type: 'doc', id: 'guides/users/outbound-provisioning/outbound-connectors/scim2', label: 'SCIM2' }, + ], + }, + ], + }, + { + type: 'category', + label: 'Migrate users to Asgardeo', + items: [ + { type: 'doc', id: 'guides/users/migrate-users/index', label: 'Migrate users to Asgardeo' }, + { type: 'doc', id: 'guides/users/migrate-users/migrate-users-guide', label: 'Migrate user accounts' }, + { type: 'doc', id: 'guides/users/migrate-users/migrate-passwords', label: 'Migrate user passwords' }, + ], + }, + { + type: 'category', + label: 'Manage attributes and mappings', + items: [ + { type: 'doc', id: 'guides/users/attributes/index', label: 'Manage attributes and mappings' }, + { + type: 'category', + label: 'User attributes', + items: [ + { type: 'doc', id: 'guides/users/attributes/user-attributes/manage-attributes', label: 'Manage attributes' }, + { type: 'doc', id: 'guides/users/attributes/user-attributes/configure-attributes', label: 'Configure attributes' }, + { type: 'doc', id: 'guides/users/attributes/user-attributes/attribute-configurations-reference', label: 'Configurations reference' }, + ], + }, + { type: 'doc', id: 'guides/users/attributes/manage-oidc-attribute-mappings', label: 'OIDC attribute mappings' }, + { type: 'doc', id: 'guides/users/attributes/manage-scopes', label: 'OIDC scopes' }, + { type: 'doc', id: 'guides/users/attributes/manage-scim2-attribute-mappings', label: 'SCIM2 attribute mappings' }, + { type: 'doc', id: 'guides/users/attributes/configure-unique-attributes', label: 'Configure unique attributes' }, + { type: 'doc', id: 'guides/users/attributes/configure-multi-valued-contact-attributes', label: 'Configure multi-valued contact attributes' }, + { + type: 'category', + label: 'Verification and notification settings for attribute updates', + items: [ + { type: 'doc', id: 'guides/users/attributes/user-attribute-change-verification', label: 'Configure settings' }, + { + type: 'category', + label: 'Try it out', + items: [ + { type: 'doc', id: 'guides/users/attributes/email-verification-on-update', label: 'Email address update verification' }, + { type: 'doc', id: 'guides/users/attributes/mobile-verification-on-update', label: 'Mobile number update verification' }, + ], + }, + ], + }, + ], + }, + { + type: 'category', + label: 'Manage user stores', + items: [ + { type: 'doc', id: 'guides/users/user-stores/index', label: 'Manage user stores' }, + { type: 'doc', id: 'guides/users/user-stores/configure-a-user-store', label: 'Connect a remote user store' }, + { type: 'doc', id: 'guides/users/user-stores/configure-high-availability', label: 'Configure high availability' }, + { type: 'doc', id: 'guides/users/user-stores/update-user-stores', label: 'Manage remote user stores' }, + { type: 'doc', id: 'guides/users/user-stores/deployment-best-practices', label: 'Deployment best practices' }, + { type: 'doc', id: 'guides/users/user-stores/advanced-configurations-for-the-agent', label: 'Advanced configuration for the agent' }, + ], + }, + ], + }, + { + type: 'category', + label: 'Workflows', + items: [ + { type: 'doc', id: 'guides/workflows/index', label: 'Workflows' }, + { type: 'doc', id: 'guides/workflows/approval-workflows', label: 'Approval workflows' }, + { type: 'doc', id: 'guides/workflows/workflow-rules', label: 'Approval workflow rules' }, + { type: 'doc', id: 'guides/workflows/workflow-requests', label: 'Workflow requests' }, + ], + }, + { + type: 'category', + label: 'Account configurations', + items: [ + { type: 'doc', id: 'guides/account-configurations/index', label: 'Account configurations' }, + { + type: 'category', + label: 'Login security', + items: [ + { type: 'doc', id: 'guides/account-configurations/login-security/login-attempts', label: 'Login attempts' }, + { type: 'doc', id: 'guides/account-configurations/login-security/password-validation', label: 'Password validation' }, + { type: 'doc', id: 'guides/account-configurations/login-security/bot-detection', label: 'Bot detection' }, + { type: 'doc', id: 'guides/account-configurations/login-security/sift-fraud-detection', label: 'Fraud detection' }, + { type: 'doc', id: 'guides/account-configurations/login-security/session-management', label: 'Session management' }, + ], + }, + { + type: 'category', + label: 'Account recovery', + items: [ + { type: 'doc', id: 'guides/account-configurations/account-recovery/password-recovery', label: 'Password recovery' }, + { type: 'doc', id: 'guides/account-configurations/account-recovery/admin-initiated-password-reset', label: 'Admin Initiated Password Reset' }, + ], + }, + { + type: 'category', + label: 'User onboarding', + items: [ + { type: 'doc', id: 'guides/account-configurations/user-onboarding/self-registration', label: 'Self-registration' }, + { type: 'doc', id: 'guides/account-configurations/user-onboarding/self-registration-flow', label: 'Self-registration flow' }, + { type: 'doc', id: 'guides/account-configurations/user-onboarding/invite-user-to-set-password', label: 'Invite user to set password' }, + ], + }, + { + type: 'category', + label: 'Manage login identifiers', + items: [ + { type: 'doc', id: 'guides/account-configurations/account-login/username-validation', label: 'Configure username validation' }, + { type: 'doc', id: 'guides/user-accounts/account-login/configure-login-identifiers', label: 'Configure alternative login identifiers' }, + ], + }, + { type: 'doc', id: 'guides/account-configurations/account-disabling', label: 'Account disabling' }, + ], + }, + { + type: 'category', + label: 'Flows', + items: [ + { type: 'doc', id: 'guides/flows/index', label: 'Flows' }, + { type: 'doc', id: 'guides/flows/build-a-flow', label: 'Get Started' }, + { type: 'doc', id: 'guides/flows/self-registration', label: 'Self Registration' }, + { type: 'doc', id: 'guides/flows/password-recovery', label: 'Password Recovery' }, + { type: 'doc', id: 'guides/flows/invited-user-registration', label: 'Invited User Registration' }, + { type: 'doc', id: 'guides/flows/flow-ai', label: 'Flow AI' }, + { type: 'doc', id: 'guides/flows/flow-execution-api', label: 'Use the Flow Execution API' }, + { type: 'doc', id: 'guides/flows/flow-execution-components', label: 'Understand Flow Execution Components' }, + { type: 'doc', id: 'guides/flows/troubleshooting', label: 'Troubleshooting' }, + ], + }, + { + type: 'category', + label: 'User self-service', + items: [ + { type: 'doc', id: 'guides/user-self-service/index', label: 'User self-service' }, + { + type: 'category', + label: 'Self-service portal', + items: [ + { type: 'doc', id: 'guides/user-self-service/configure-self-service-portal', label: 'Configure the self-service portal' }, + { type: 'doc', id: 'guides/user-self-service/update-profile-info', label: 'Update profile information' }, + { type: 'doc', id: 'guides/user-self-service/change-password', label: 'Change password' }, + { type: 'doc', id: 'guides/user-self-service/manage-linked-accounts', label: 'Manage linked social accounts' }, + { type: 'doc', id: 'guides/user-self-service/export-profile-information', label: 'Export profile information' }, + { type: 'doc', id: 'guides/user-self-service/manage-consents', label: 'Manage consents' }, + { type: 'doc', id: 'guides/user-self-service/manage-login-sessions', label: 'Manage login sessions' }, + { type: 'doc', id: 'guides/user-self-service/self-register', label: 'Self-register' }, + { type: 'doc', id: 'guides/user-self-service/register-passkey', label: 'Register passkeys' }, + { type: 'doc', id: 'guides/user-self-service/register-push-notification-device', label: 'Register Push Notification Device' }, + { type: 'doc', id: 'guides/user-self-service/user-password-recovery', label: 'Password recovery' }, + { type: 'doc', id: 'guides/user-self-service/enable-totp', label: 'Enroll TOTP' }, + { type: 'doc', id: 'guides/user-self-service/manage-backup-codes', label: 'Manage backup codes' }, + { type: 'doc', id: 'guides/user-self-service/discover-applications', label: 'Discover applications' }, + { type: 'doc', id: 'guides/user-self-service/manage-approvals', label: 'Manage approvals' }, + ], + }, + { type: 'doc', id: 'guides/user-self-service/build-self-service-capabilities', label: 'Build self-service capabilities' }, + ], + }, + { + type: 'category', + label: 'Organizations', + items: [ + { type: 'doc', id: 'guides/organization-management/index', label: 'Organizations' }, + { + type: 'category', + label: 'Getting started', + items: [ + { type: 'doc', id: 'guides/organization-management/organizations-overview', label: 'Overview' }, + ], + }, + { type: 'doc', id: 'guides/organization-management/manage-organizations', label: 'Set up organizations' }, + { + type: 'category', + label: 'Delegate administration', + items: [ + { type: 'doc', id: 'guides/organization-management/manage-b2b-administration', label: 'Set up administration portal' }, + { + type: 'category', + label: 'Onboard administrators', + items: [ + { type: 'doc', id: 'guides/organization-management/onboard-org-admins/index', label: 'Onboard administrators' }, + { type: 'doc', id: 'guides/organization-management/onboard-org-admins/sales-led-approach', label: 'Sales-led approach' }, + { type: 'doc', id: 'guides/organization-management/onboard-org-admins/self-service-approach', label: 'Self-service approach' }, + ], + }, + ], + }, + { + type: 'category', + label: 'Configure organization applications', + items: [ + { type: 'doc', id: 'guides/organization-management/share-applications', label: 'Share applications' }, + { + type: 'category', + label: 'Organization applications', + items: [ + { type: 'doc', id: 'guides/organization-management/organization-applications', label: 'Create applications' }, + { type: 'doc', id: 'guides/organization-management/select-token-issuer-for-organization-apps', label: 'Select token issuer' }, + ], + }, + { type: 'doc', id: 'guides/organization-management/manage-conflicts-in-organizations', label: 'Manage conflicts in organizations' }, + ], + }, + { + type: 'category', + label: 'Authorize API resources', + items: [ + { type: 'doc', id: 'guides/organization-management/api-authorization-overview', label: 'Overview' }, + { type: 'doc', id: 'guides/organization-management/api-authorization-for-b2b', label: 'Authorize applications to API resources' }, + { type: 'doc', id: 'guides/organization-management/organization-roles', label: 'Configure roles to consume authorized APIs' }, + { type: 'doc', id: 'guides/organization-management/generate-tokens-for-organization-apps', label: 'Generate tokens for organization applications' }, + ], + }, + { + type: 'category', + label: 'Manage organization users', + items: [ + { type: 'doc', id: 'guides/organization-management/onboard-users', label: 'Onboard users' }, + { type: 'doc', id: 'guides/organization-management/share-user-profiles', label: 'Share users' }, + ], + }, + { + type: 'category', + label: 'Customize organizations', + items: [ + { + type: 'category', + label: 'Organization settings', + items: [ + { type: 'doc', id: 'guides/organization-management/inheritance-in-organizations/index', label: 'Organization settings' }, + { type: 'doc', id: 'guides/organization-management/inheritance-in-organizations/login-registration-inheritance', label: 'Login and registration settings' }, + { type: 'doc', id: 'guides/organization-management/inheritance-in-organizations/ui-branding-inheritance', label: 'UI branding' }, + { type: 'doc', id: 'guides/organization-management/inheritance-in-organizations/email-sms-templates-inheritance', label: 'Email and SMS templates' }, + { type: 'doc', id: 'guides/organization-management/inheritance-in-organizations/attribute-inheritance', label: 'User attributes' }, + { type: 'doc', id: 'guides/organization-management/inheritance-in-organizations/oidc-scope-inheritance', label: 'OIDC scopes' }, + { type: 'doc', id: 'guides/organization-management/inheritance-in-organizations/flow-inheritance', label: 'Flows' }, + ], + }, + { type: 'doc', id: 'guides/organization-management/service-extensions/service-extensions', label: 'Extend with service extensions' }, + ], + }, + { + type: 'category', + label: 'Offboard organizations', + items: [ + { type: 'doc', id: 'guides/organization-management/disable-delete-organizations', label: 'Disable or delete an organization' }, + ], + }, + { type: 'doc', id: 'guides/organization-management/try-a-b2b-use-case', label: 'Try a B2B use case' }, + ], + }, + { + type: 'category', + label: 'Notification Channels', + items: [ + { type: 'doc', id: 'guides/notification-channels/configure-email-provider', label: 'Configure Email Provider' }, + { type: 'doc', id: 'guides/notification-channels/configure-sms-provider', label: 'Configure SMS Provider' }, + { type: 'doc', id: 'guides/notification-channels/configure-push-provider', label: 'Configure Push Provider' }, + ], + }, + { + type: 'category', + label: 'Customizations', + items: [ + { + type: 'category', + label: 'Customize branding', + items: [ + { type: 'doc', id: 'guides/branding/index', label: 'Customize branding' }, + { type: 'doc', id: 'guides/branding/configure-ui-branding', label: 'Configure UI branding' }, + { type: 'doc', id: 'guides/branding/customize-layouts-with-editor', label: 'Customize layouts' }, + { type: 'doc', id: 'guides/branding/branding-ai', label: 'Branding AI' }, + { type: 'doc', id: 'guides/branding/configure-custom-domains', label: 'Configure custom domains' }, + { type: 'doc', id: 'guides/branding/customize-email-templates', label: 'Customize email templates' }, + { type: 'doc', id: 'guides/branding/customize-sms-templates', label: 'Customize SMS templates' }, + { type: 'doc', id: 'guides/branding/localization', label: 'Localization in Asgardeo' }, + ], + }, + { + type: 'category', + label: 'Extend with service extensions', + items: [ + { type: 'doc', id: 'guides/service-extensions/understanding-service-extensions', label: 'Understanding service extensions' }, + { + type: 'category', + label: 'In-flow extensions', + items: [ + { type: 'doc', id: 'guides/service-extensions/in-flow-extensions/custom-authentication', label: 'Custom authentication' }, + ], + }, + { + type: 'category', + label: 'Pre-flow extensions (Actions)', + items: [ + { type: 'doc', id: 'guides/service-extensions/pre-flow-extensions/setting-up-actions', label: 'Setting up an action' }, + { type: 'doc', id: 'guides/service-extensions/pre-flow-extensions/pre-issue-access-token-action', label: 'Pre issue access token action' }, + { type: 'doc', id: 'guides/service-extensions/pre-flow-extensions/pre-issue-id-token-action', label: 'Pre issue ID token action' }, + { type: 'doc', id: 'guides/service-extensions/pre-flow-extensions/pre-update-password-action', label: 'Pre update password action' }, + { type: 'doc', id: 'guides/service-extensions/pre-flow-extensions/pre-update-profile-action', label: 'Pre update profile action' }, + ], + }, + ], + }, + { + type: 'category', + label: 'Integrate with webhooks', + items: [ + { type: 'doc', id: 'guides/webhooks/understanding-webhooks', label: 'Understanding webhooks' }, + { type: 'doc', id: 'guides/webhooks/setup-webhooks', label: 'Setup webhooks' }, + { type: 'doc', id: 'guides/webhooks/webhook-events-and-payloads', label: 'Webhook events and payloads' }, + ], + }, + ], + }, + { + type: 'category', + label: 'Your Asgardeo', + items: [ + { type: 'doc', id: 'guides/your-asgardeo/index', label: 'Your Asgardeo' }, + { type: 'doc', id: 'guides/your-asgardeo/manage-root-organizations', label: 'Manage root organizations' }, + { + type: 'category', + label: 'Manage environments', + items: [ + { type: 'doc', id: 'guides/your-asgardeo/manage-environments/index', label: 'Manage environments' }, + { type: 'doc', id: 'guides/your-asgardeo/manage-environments/promote-configurations', label: 'Promote configurations across environments' }, + ], + }, + { type: 'doc', id: 'guides/your-asgardeo/asgardeo-self-service', label: 'Self-service' }, + { type: 'doc', id: 'guides/your-asgardeo/recover-password', label: 'Recover your password' }, + { type: 'doc', id: 'guides/your-asgardeo/delete-your-user-account', label: 'Delete your user account' }, + { + type: 'category', + label: 'Subscribe to Asgardeo', + items: [ + { type: 'doc', id: 'guides/your-asgardeo/subscribe-to-asgardeo/index', label: 'Subscribe to Asgardeo' }, + { type: 'doc', id: 'guides/your-asgardeo/subscribe-to-asgardeo/subscribe-via-billing-portal', label: 'via Billing Portal' }, + { type: 'doc', id: 'guides/your-asgardeo/subscribe-to-asgardeo/subscribe-via-azure-marketplace', label: 'via Azure Marketplace' }, + ], + }, + ], + }, + { + type: 'category', + label: 'Asgardeo logs', + items: [ + { type: 'doc', id: 'guides/asgardeo-logs/index', label: 'Asgardeo logs' }, + { type: 'doc', id: 'guides/asgardeo-logs/diagnostic-logs', label: 'Diagnostic logs' }, + { + type: 'category', + label: 'Audit logs', + items: [ + { type: 'doc', id: 'guides/asgardeo-logs/audit-logs/index', label: 'Audit logs' }, + { type: 'doc', id: 'guides/asgardeo-logs/audit-logs/audit-log-catalog', label: 'Audit log catalog' }, + ], + }, + { type: 'doc', id: 'guides/asgardeo-logs/remote-log-publish', label: 'Remote log publish' }, + ], + }, + { + type: 'category', + label: 'Monitoring', + items: [ + { type: 'doc', id: 'guides/monitoring/index', label: 'Monitoring' }, + { type: 'doc', id: 'guides/monitoring/pii-in-asgardeo-logs', label: 'PII in Asgardeo logs' }, + { type: 'doc', id: 'guides/monitoring/asgardeo-events', label: 'Asgardeo events' }, + { type: 'doc', id: 'guides/organization-insights', label: 'Organization insights' }, + ], + }, + { + type: 'category', + label: 'Agentic AI', + items: [ + { + type: 'category', + label: 'MCP Authorization', + items: [ + { type: 'doc', id: 'guides/agentic-ai/mcp/index', label: 'MCP Authorization' }, + { type: 'doc', id: 'guides/agentic-ai/mcp/mcp-server-authorization', label: 'Securing MCP Servers' }, + { type: 'doc', id: 'guides/agentic-ai/mcp/register-mcp-client-app', label: 'Setting up MCP Clients' }, + ], + }, + { + type: 'category', + label: 'Identity for AI Agents', + items: [ + { type: 'doc', id: 'guides/agentic-ai/ai-agents/index', label: 'Identity for AI agents' }, + { type: 'doc', id: 'guides/agentic-ai/ai-agents/register-and-manage-agents', label: 'Register and manage agents' }, + { type: 'doc', id: 'guides/agentic-ai/ai-agents/agent-credentials', label: 'Agent credentials' }, + { type: 'doc', id: 'guides/agentic-ai/ai-agents/access-control-for-agents', label: 'Access control for agents' }, + { type: 'doc', id: 'guides/agentic-ai/ai-agents/agent-authentication', label: 'Agent authentication' }, + ], + }, + ], + }, + { + type: 'category', + label: 'Verifiable Credentials', + items: [ + { type: 'doc', id: 'guides/verifiable-credentials/index', label: 'Overview' }, + { type: 'doc', id: 'guides/verifiable-credentials/issue-vc', label: 'Issue verifiable credentials to a digital wallet' }, + ], + }, + ], + }, + { + type: 'category', + label: 'Tutorials', + className: 'sidebar-icon-graduation', + link: { type: 'doc', id: 'tutorials/index' }, + items: [ + { type: 'doc', id: 'tutorials/auth-users-into-android-apps', label: 'Authenticate users into Android applications' }, + { type: 'doc', id: 'tutorials/auth-users-into-flutter-apps', label: 'Authenticate users into Flutter applications' }, + { type: 'doc', id: 'tutorials/connect-asgardeo-with-ms-entra', label: 'Connect Asgardeo as an OIDC attribute provider (with Microsoft Entra Verified ID)' }, + { type: 'doc', id: 'tutorials/connect-asgardeo-with-mattr', label: 'Connect Asgardeo as an OIDC attribute provider (with MATTR)' }, + { type: 'doc', id: 'tutorials/secure-spring-boot-api', label: 'Secure Spring Boot API with Asgardeo' }, + { type: 'doc', id: 'tutorials/smart-on-fhir', label: 'Integrate Asgardeo with Smart on FHIR healthcare apps' }, + { type: 'doc', id: 'tutorials/secure-agentic-ai-systems', label: 'Secure Agentic AI Systems with Asgardeo' }, + { type: 'doc', id: 'tutorials/end-to-end-mcp-authorization-with-asgardeo', label: 'Implement End-to-End Authorization for MCP servers' }, + ], + }, + { + type: 'category', + label: 'SDKs', + className: 'sidebar-icon-cube', + link: { type: 'doc', id: 'sdks/index' }, + items: [ + { + type: 'category', + label: 'React SDK', + items: [ + { type: 'doc', id: 'sdks/react/overview', label: 'Overview' }, + { + type: 'category', + label: 'APIs', + items: [ + { + type: 'category', + label: 'Contexts', + items: [ + { type: 'doc', id: 'sdks/react/contexts/asgardeo-provider', label: '' }, + ], + }, + { + type: 'category', + label: 'Components', + items: [ + { + type: 'category', + label: 'Action Components', + items: [ + { type: 'doc', id: 'sdks/react/components/action-components/sign-in-button', label: '' }, + { type: 'doc', id: 'sdks/react/components/action-components/sign-out-button', label: '' }, + { type: 'doc', id: 'sdks/react/components/action-components/sign-up-button', label: '' }, + ], + }, + { + type: 'category', + label: 'Control Components', + items: [ + { type: 'doc', id: 'sdks/react/components/control-components/signed-in', label: '' }, + { type: 'doc', id: 'sdks/react/components/control-components/signed-out', label: '' }, + { type: 'doc', id: 'sdks/react/components/control-components/loading', label: '' }, + ], + }, + { + type: 'category', + label: 'User Self-care Components', + items: [ + { type: 'doc', id: 'sdks/react/components/user-selfcare-components/user-dropdown', label: '' }, + { type: 'doc', id: 'sdks/react/components/user-selfcare-components/user-profile', label: '' }, + { type: 'doc', id: 'sdks/react/components/user-selfcare-components/user', label: '' }, + ], + }, + { + type: 'category', + label: 'Organization Components (B2B)', + items: [ + { type: 'doc', id: 'sdks/react/components/organization-components/create-organization', label: '' }, + { type: 'doc', id: 'sdks/react/components/organization-components/organization-profile', label: '' }, + { type: 'doc', id: 'sdks/react/components/organization-components/organization-switcher', label: '' }, + { type: 'doc', id: 'sdks/react/components/organization-components/organization-list', label: '' }, + { type: 'doc', id: 'sdks/react/components/organization-components/organization', label: '' }, + { type: 'doc', id: 'sdks/react/components/organization-components/organization-context', label: '' }, + ], + }, + ], + }, + { + type: 'category', + label: 'hooks', + items: [ + { type: 'doc', id: 'sdks/react/hooks/use-asgardeo', label: 'useAsgardeo()' }, + ], + }, + ], + }, + { + type: 'category', + label: 'Guides', + items: [ + { type: 'doc', id: 'sdks/react/guides/accessing-protected-apis', label: 'Accessing Protected APIs' }, + { type: 'doc', id: 'sdks/react/guides/protecting-routes', label: 'Protecting Routes' }, + ], + }, + ], + }, + { + type: 'category', + label: 'Next.js SDK', + items: [ + { type: 'doc', id: 'sdks/nextjs/overview', label: 'Overview' }, + { + type: 'category', + label: 'APIs', + items: [ + { + type: 'category', + label: 'Contexts', + items: [ + { type: 'doc', id: 'sdks/nextjs/contexts/asgardeo-provider', label: '' }, + ], + }, + { + type: 'category', + label: 'Middleware', + items: [ + { type: 'doc', id: 'sdks/nextjs/middleware/asgardeo-middleware', label: 'asgardeoMiddleware()' }, + ], + }, + { + type: 'category', + label: 'Components', + items: [ + { + type: 'category', + label: 'Action Components', + items: [ + { type: 'doc', id: 'sdks/nextjs/components/action-components/sign-in-button', label: '' }, + { type: 'doc', id: 'sdks/nextjs/components/action-components/sign-out-button', label: '' }, + { type: 'doc', id: 'sdks/nextjs/components/action-components/sign-up-button', label: '' }, + ], + }, + { + type: 'category', + label: 'Control Components', + items: [ + { type: 'doc', id: 'sdks/nextjs/components/control-components/signed-in', label: '' }, + { type: 'doc', id: 'sdks/nextjs/components/control-components/signed-out', label: '' }, + { type: 'doc', id: 'sdks/nextjs/components/control-components/loading', label: '' }, + ], + }, + { + type: 'category', + label: 'Authentication Components', + items: [ + { type: 'doc', id: 'sdks/nextjs/components/authentication/sign-in', label: '' }, + { type: 'doc', id: 'sdks/nextjs/components/authentication/sign-up', label: '' }, + ], + }, + { + type: 'category', + label: 'User Self-care Components', + items: [ + { type: 'doc', id: 'sdks/nextjs/components/user-selfcare-components/user-dropdown', label: '' }, + { type: 'doc', id: 'sdks/nextjs/components/user-selfcare-components/user-profile', label: '' }, + { type: 'doc', id: 'sdks/nextjs/components/user-selfcare-components/user', label: '' }, + ], + }, + { + type: 'category', + label: 'Organization Components (B2B)', + items: [ + { type: 'doc', id: 'sdks/nextjs/components/organization-components/create-organization', label: '' }, + { type: 'doc', id: 'sdks/nextjs/components/organization-components/organization-profile', label: '' }, + { type: 'doc', id: 'sdks/nextjs/components/organization-components/organization-switcher', label: '' }, + { type: 'doc', id: 'sdks/nextjs/components/organization-components/organization-list', label: '' }, + { type: 'doc', id: 'sdks/nextjs/components/organization-components/organization', label: '' }, + ], + }, + ], + }, + { + type: 'category', + label: 'hooks', + items: [ + { type: 'doc', id: 'sdks/nextjs/hooks/use-asgardeo', label: 'useAsgardeo()' }, + ], + }, + ], + }, + { + type: 'category', + label: 'Guides', + items: [ + { type: 'doc', id: 'sdks/nextjs/guides/accessing-protected-apis', label: 'Accessing Protected APIs' }, + { type: 'doc', id: 'sdks/nextjs/guides/protecting-routes', label: 'Protecting Routes' }, + ], + }, + ], + }, + ], + }, + { type: 'doc', id: 'sdks/asgardeo-mcp-server', label: 'Asgardeo MCP Server' }, + { + type: 'category', + label: 'APIs', + className: 'sidebar-icon-code', + link: { type: 'doc', id: 'apis/index' }, + items: [ + { + type: 'category', + label: 'Management APIs', + items: [ + { type: 'doc', id: 'apis/action-management-rest-api', label: 'Action Management API' }, + { type: 'doc', id: 'apis/scim2-agents-rest-apis', label: 'Agent Management API' }, + { type: 'doc', id: 'apis/api-resource-management-rest-api', label: 'API resource management API' }, + { type: 'doc', id: 'apis/application-management', label: 'Application management API' }, + { type: 'doc', id: 'apis/app-native-authentication-api', label: 'App-native authentication API' }, + { type: 'doc', id: 'apis/attribute-management', label: 'Attribute management API' }, + { type: 'doc', id: 'apis/authenticators', label: 'Authenticators API' }, + { type: 'doc', id: 'apis/branding-preference-rest-api', label: 'Branding Preferences API' }, + { type: 'doc', id: 'apis/consent-management', label: 'Consent management API' }, + { type: 'doc', id: 'apis/email-template', label: 'Email templates API' }, + { type: 'doc', id: 'apis/event-configuration', label: 'Event configuration API' }, + { type: 'doc', id: 'apis/identity-governance', label: 'Identity governance API' }, + { type: 'doc', id: 'apis/idp', label: 'Identity provider API' }, + { type: 'doc', id: 'apis/identity-verification-providers', label: 'Identity verification provider API' }, + { type: 'doc', id: 'apis/idle-account-identification', label: 'Idle account identification API' }, + { type: 'doc', id: 'apis/notification-sender-v2-rest-api', label: 'Notification sender API' }, + { type: 'doc', id: 'apis/notification-templates', label: 'Notification templates management API' }, + { type: 'doc', id: 'apis/dynamic-client-registration-rest-api', label: 'OAuth Dynamic Client Registration API' }, + { type: 'doc', id: 'apis/organization-discovery', label: 'Organization discovery API' }, + { type: 'doc', id: 'apis/organization-discovery-config-mgt-rest-api', label: 'Organization discovery configuration management API' }, + { type: 'doc', id: 'apis/organization-management', label: 'Organization management API' }, + { + type: 'category', + label: 'Role management', + items: [ + { type: 'doc', id: 'apis/role-management/roles', label: 'Role management (SCIM 2.0) API' }, + ], + }, + { type: 'doc', id: 'apis/rule-metadata-rest-api', label: 'Rule Metadata API' }, + { type: 'doc', id: 'apis/end-user-credential-management-rest-api', label: 'User credential management API' }, + { type: 'doc', id: 'apis/vc-template-management-rest-api', label: 'Verifiable Credential Template Management API' }, + { + type: 'category', + label: 'User management', + items: [ + { + type: 'category', + label: 'SCIM 2.0 API', + items: [ + { type: 'doc', id: 'apis/scim2/index', label: 'SCIM 2.0 API' }, + { type: 'doc', id: 'apis/scim2/scim2-users-rest-api', label: 'SCIM 2.0 Users API' }, + { type: 'doc', id: 'apis/scim2/scim2-groups-rest-api', label: 'SCIM 2.0 Groups API' }, + { type: 'doc', id: 'apis/scim2/scim2-patch-operations', label: 'SCIM 2.0 Patch operations' }, + { type: 'doc', id: 'apis/scim2/scim2-bulk-rest-api', label: 'SCIM 2.0 Bulk API' }, + { type: 'doc', id: 'apis/scim2/scim2-schema-rest-api', label: 'SCIM 2.0 Schema API' }, + { type: 'doc', id: 'apis/scim2/scim2-batch-operations', label: 'SCIM 2.0 Batch Operations' }, + { type: 'doc', id: 'apis/scim2/scim2-resource-types-rest-api', label: 'SCIM 2.0 Resource types API' }, + { type: 'doc', id: 'apis/scim2/scim2-service-provider-configs-rest-api', label: 'SCIM 2.0 Service provider configs API' }, + { type: 'doc', id: 'apis/scim2/build-scim2-user-creation-payload', label: 'SCIM 2.0 Build user creation payload' }, + ], + }, + { type: 'doc', id: 'apis/association-management-by-admin', label: 'User account associations API' }, + { type: 'doc', id: 'apis/user-account-recovery', label: 'Account Recovery API' }, + { type: 'doc', id: 'apis/offline-user-onboard', label: 'Offline user onboard management API' }, + { type: 'doc', id: 'apis/verification-code-management-rest-api', label: 'Verification Code Management API' }, + { type: 'doc', id: 'apis/admin-identity-verification', label: 'Identity verification API' }, + ], + }, + { + type: 'category', + label: 'User sessions', + items: [ + { type: 'doc', id: 'apis/session', label: 'Session management API' }, + { type: 'doc', id: 'apis/extend-sessions', label: 'Session extension API' }, + ], + }, + { + type: 'category', + label: 'User sharing management APIs', + items: [ + { type: 'doc', id: 'apis/organization-user-share-rest-api', label: 'V1 (deprecated)' }, + { type: 'doc', id: 'apis/organization-user-share-v2-rest-api', label: 'V2' }, + ], + }, + { type: 'doc', id: 'apis/user-store', label: 'User store management API' }, + { type: 'doc', id: 'apis/validation', label: 'Validation API' }, + { type: 'doc', id: 'apis/webhook-management-rest-api', label: 'Webhook Management API' }, + { type: 'doc', id: 'apis/webhook-metadata-rest-api', label: 'Webhook Metadata API' }, + { type: 'doc', id: 'apis/workflow-rest-api', label: 'Workflow Management API' }, + ], + }, + { + type: 'category', + label: 'Organization APIs', + items: [ + { type: 'doc', id: 'apis/organization-apis/index', label: 'Organization APIs' }, + { type: 'doc', id: 'apis/organization-apis/authentication', label: 'Get access for organization APIs' }, + { type: 'doc', id: 'apis/organization-apis/action-management-rest-api', label: 'Action Management API' }, + { type: 'doc', id: 'apis/organization-apis/api-resource-management-rest-api', label: 'API resource management API' }, + { + type: 'category', + label: 'Application management API', + items: [ + { type: 'doc', id: 'apis/organization-apis/shared-application-management', label: 'Application management API (Shared Applications)' }, + { type: 'doc', id: 'apis/organization-apis/organization-application-mgt', label: 'Application management API' }, + ], + }, + { type: 'doc', id: 'apis/organization-apis/org-authenticators', label: 'Authenticators API' }, + { type: 'doc', id: 'apis/organization-apis/org-branding-management', label: 'Branding API' }, + { type: 'doc', id: 'apis/organization-apis/org-claim-management', label: 'Claim management API' }, + { type: 'doc', id: 'apis/organization-apis/org-idp', label: 'Identity provider management API' }, + { type: 'doc', id: 'apis/organization-apis/org-account-recovery', label: 'Identity recovery API' }, + { type: 'doc', id: 'apis/organization-apis/org-idle-account-identification', label: 'Idle account identification API' }, + { type: 'doc', id: 'apis/organization-apis/organization-user-invitation', label: 'Invite parent organization\'s users API' }, + { type: 'doc', id: 'apis/organization-apis/notification-sender-v2-rest-api', label: 'Notification sender API' }, + { type: 'doc', id: 'apis/organization-apis/organization-discovery', label: 'Offline user onboard management API' }, + { type: 'doc', id: 'apis/organization-apis/org-management', label: 'Organization management API' }, + { type: 'doc', id: 'apis/organization-apis/org-role-mgt', label: 'Role management API' }, + { type: 'doc', id: 'apis/organization-apis/rule-metadata-rest-api', label: 'Rule Metadata API' }, + { type: 'doc', id: 'apis/organization-apis/end-user-credential-management-rest-api', label: 'User credential management API' }, + { + type: 'category', + label: 'User management', + items: [ + { type: 'doc', id: 'apis/organization-apis/scim2/index', label: 'User management' }, + { type: 'doc', id: 'apis/organization-apis/scim2/scim2-org-user-mgt', label: 'SCIM 2.0 Users API' }, + { type: 'doc', id: 'apis/organization-apis/scim2/scim2-org-group-mgt', label: 'SCIM 2.0 Groups API' }, + { type: 'doc', id: 'apis/organization-apis/scim2/scim2-org-bulk', label: 'SCIM 2.0 Bulk API' }, + { type: 'doc', id: 'apis/organization-apis/org-association-rest-api', label: 'User Account Association API' }, + { type: 'doc', id: 'apis/organization-apis/verification-code-management-rest-api', label: 'Verification Code Management API' }, + ], + }, + { type: 'doc', id: 'apis/organization-apis/organization-user-share', label: 'User sharing management API' }, + { type: 'doc', id: 'apis/organization-apis/organization-user-share-v2', label: 'User sharing management API V2' }, + { type: 'doc', id: 'apis/organization-apis/org-user-store', label: 'User store management API' }, + ], + }, + { + type: 'category', + label: 'End User APIs', + items: [ + { type: 'doc', id: 'apis/scim2-me', label: 'SCIM 2.0 Me API' }, + { type: 'doc', id: 'apis/register-mfa/backup-code', label: 'Backup codes API' }, + { type: 'doc', id: 'apis/register-mfa/export-user-info', label: 'Export user information API' }, + { type: 'doc', id: 'apis/register-mfa/password-recovery', label: 'Password recovery API' }, + { type: 'doc', id: 'apis/register-mfa/totp', label: 'TOTP API' }, + { type: 'doc', id: 'apis/push-notification-device-rest-api', label: 'Push Notification Device API' }, + { type: 'doc', id: 'apis/association-management-by-user', label: 'User account associations API' }, + { type: 'doc', id: 'apis/export-user-info', label: 'Export user information API' }, + { type: 'doc', id: 'apis/user-identity-verification', label: 'Identity Verification' }, + { type: 'doc', id: 'apis/user-organization-api', label: 'Organization Me API' }, + { type: 'doc', id: 'apis/self-password-update-rest-api', label: 'Self password update API' }, + { type: 'doc', id: 'apis/verification-code-management-me-api', label: 'Verification Code Management Me API' }, + { type: 'doc', id: 'apis/approvals-rest-api', label: 'Approval API' }, + ], + }, + ], + }, + { + type: 'category', + label: 'References', + className: 'sidebar-icon-external-link', + link: { type: 'doc', id: 'references/index' }, + items: [ + { type: 'doc', id: 'references/operational-policies', label: 'Operational policies' }, + { type: 'doc', id: 'references/asgardeo-outbound-ip-addresses', label: 'Asgardeo outbound IP addresses' }, + { type: 'doc', id: 'references/user-management/user-roles', label: 'Asgardeo user roles' }, + { type: 'doc', id: 'references/user-management/add-scim2-custom-user-schema-support', label: 'SCIM2 Custom User Schema Support' }, + { + type: 'category', + label: 'App configurations', + items: [ + { type: 'doc', id: 'references/app-settings/index', label: 'App configurations' }, + { type: 'doc', id: 'references/app-settings/oidc-settings-for-app', label: 'OIDC configurations' }, + { type: 'doc', id: 'references/app-settings/saml-settings-for-app', label: 'SAML configurations' }, + ], + }, + { + type: 'category', + label: 'IdP configurations', + items: [ + { type: 'doc', id: 'references/idp-settings/index', label: 'IdP configurations' }, + { type: 'doc', id: 'references/idp-settings/oidc-settings-for-idp', label: 'OIDC configurations' }, + { type: 'doc', id: 'references/idp-settings/saml-settings-for-idp', label: 'SAML configurations' }, + ], + }, + { + type: 'category', + label: 'Conditional authentication', + items: [ + { type: 'doc', id: 'references/conditional-auth/api-reference', label: 'Conditional auth - API' }, + ], + }, + { type: 'doc', id: 'references/remote-user-store/remote-user-store-properties', label: 'Remote agent properties' }, + { type: 'doc', id: 'references/authorization-policies-for-apps', label: 'Authorization policies for apps' }, + { type: 'doc', id: 'references/email-templates', label: 'Email templates' }, + { type: 'doc', id: 'references/sms-templates', label: 'SMS templates' }, + { + type: 'category', + label: 'Service extensions', + items: [ + { + type: 'category', + label: 'In-flow extensions', + items: [ + { + type: 'category', + label: 'Custom authentication', + items: [ + { type: 'doc', id: 'references/service-extensions/in-flow-extensions/custom-authentication/api-contract', label: 'API contract to implement' }, + ], + }, + ], + }, + { + type: 'category', + label: 'Pre-flow extensions (Actions)', + items: [ + { + type: 'category', + label: 'Pre issue access token action', + items: [ + { + type: 'category', + label: 'Version 1.x', + items: [ + { type: 'doc', id: 'references/service-extensions/pre-flow-extensions/pre-issue-access-token-action/pre-issue-access-token-action-v1.0', label: 'API v1.0 contract to implement' }, + { type: 'doc', id: 'references/service-extensions/pre-flow-extensions/pre-issue-access-token-action/pre-issue-access-token-action-v1.1', label: 'API v1.1 contract to implement' }, + ], + }, + { type: 'doc', id: 'references/service-extensions/pre-flow-extensions/pre-issue-access-token-action/sample-success-responses', label: 'Sample success reponses' }, + ], + }, + { + type: 'category', + label: 'Pre issue ID token action', + items: [ + { + type: 'category', + label: 'Version 1.x', + items: [ + { type: 'doc', id: 'references/service-extensions/pre-flow-extensions/pre-issue-id-token-action/pre-issue-id-token-action-v1.0', label: 'API v1.0 contract to implement' }, + ], + }, + { type: 'doc', id: 'references/service-extensions/pre-flow-extensions/pre-issue-id-token-action/sample-success-responses', label: 'Sample success responses' }, + ], + }, + { + type: 'category', + label: 'Pre update password action', + items: [ + { + type: 'category', + label: 'Version 1.x', + items: [ + { type: 'doc', id: 'references/service-extensions/pre-flow-extensions/pre-update-password-action/pre-update-password-action-v1.0', label: 'API v1.0 contract to implement' }, + { type: 'doc', id: 'references/service-extensions/pre-flow-extensions/pre-update-password-action/pre-update-password-action-v1.1', label: 'API v1.1 contract to implement' }, + ], + }, + { + type: 'category', + label: 'Version 2.x', + items: [ + { type: 'doc', id: 'references/service-extensions/pre-flow-extensions/pre-update-password-action/pre-update-password-action-v2.0', label: 'API v2.0 contract to implement' }, + ], + }, + ], + }, + { + type: 'category', + label: 'Pre update profile action', + items: [ + { + type: 'category', + label: 'Version 1.x', + items: [ + { type: 'doc', id: 'references/service-extensions/pre-flow-extensions/pre-update-profile-action/pre-update-profile-action-v1.0', label: 'API v1.0 contract to implement' }, + ], + }, + ], + }, + ], + }, + ], + }, + { type: 'doc', id: 'references/accessibility', label: 'Accessibility compliance' }, + { type: 'doc', id: 'references/data-residency-in-asgardeo', label: 'Data residency in Asgardeo' }, + { type: 'doc', id: 'references/mcp-tool-api-resource-access', label: 'API resources and scopes required for MCP tools' }, + { + type: 'category', + label: 'Production checklist', + items: [ + { type: 'doc', id: 'references/production-checklist/index', label: 'Production checklist' }, + { type: 'doc', id: 'references/production-checklist/readiness-check', label: 'Readiness check' }, + { type: 'doc', id: 'references/production-checklist/security-check', label: 'Security check' }, + { type: 'doc', id: 'references/production-checklist/best-practices', label: 'Best practices' }, + ], + }, + { type: 'doc', id: 'references/rate-limits', label: 'Asgardeo rate limits' }, + { + type: 'category', + label: 'Tutorials', + items: [ + { type: 'doc', id: 'references/tutorials/build-your-own-push-authenticator-app', label: 'Build your own push authenticator app' }, + ], + }, + { + type: 'category', + label: 'IAM concepts', + items: [ + { type: 'doc', id: 'references/grant-types', label: 'OAuth2 grant types' }, + { type: 'doc', id: 'references/pushed-authorization-requests', label: 'OAuth2 Pushed Authorization Requests' }, + { + type: 'category', + label: 'Token binding', + items: [ + { type: 'doc', id: 'references/token-binding/index', label: 'Token binding' }, + { type: 'doc', id: 'references/token-binding/client-request', label: 'Client-request' }, + ], + }, + { type: 'doc', id: 'references/financial-grade-api', label: 'Financial-grade API' }, + { type: 'doc', id: 'references/app-native-authentication', label: 'App-native authentication' }, + { type: 'doc', id: 'references/push-notification-based-authentication', label: 'Push Notification based authentication' }, + { type: 'doc', id: 'references/oid4vci', label: 'OpenID for verifiable credential issuance (OID4VCI)' }, + ], + }, + ], + }, + { + type: 'category', + label: 'Technology Guides', + items: [ + { + type: 'category', + label: 'Actions', + items: [ + { type: 'doc', id: 'complete-guides/actions/introduction', label: 'Introduction' }, + { type: 'doc', id: 'complete-guides/actions/prerequisite', label: 'Prerequisite' }, + { type: 'doc', id: 'complete-guides/actions/pre-issue-access-token-action-use-case', label: 'Pre-Issue Access Token Action Use Case' }, + { type: 'doc', id: 'complete-guides/actions/pre-issue-access-token-action-in-choreo', label: 'Configure Pre-Issue Access Token Action with Choreo' }, + { type: 'doc', id: 'complete-guides/actions/pre-issue-access-token-action-in-vercel', label: 'Configure Pre-Issue Access Token Action with Vercel' }, + { type: 'doc', id: 'complete-guides/actions/pre-issue-access-token-action-in-aws-lambda', label: 'Configure Pre-Issue Access Token Action with AWS Lambda' }, + { type: 'doc', id: 'complete-guides/actions/pre-update-password-action-use-case', label: 'Pre-Update Password Action Use Case' }, + { type: 'doc', id: 'complete-guides/actions/pre-update-password-action-in-choreo', label: 'Configure Pre-Update Password Action with Choreo' }, + { type: 'doc', id: 'complete-guides/actions/pre-update-password-action-in-vercel', label: 'Configure Pre-Update Password Action with Vercel' }, + { type: 'doc', id: 'complete-guides/actions/pre-update-password-action-in-aws-lambda', label: 'Configure Pre-Update Password Action with AWS Lambda' }, + { type: 'doc', id: 'complete-guides/actions/pre-update-profile-action-use-case', label: 'Pre-Update Profile Action Use Case' }, + { type: 'doc', id: 'complete-guides/actions/pre-update-profile-action-in-choreo', label: 'Configure Pre-Update Profile Action with Choreo' }, + { type: 'doc', id: 'complete-guides/actions/pre-update-profile-action-in-vercel', label: 'Configure Pre-Update Profile Action with Vercel' }, + { type: 'doc', id: 'complete-guides/actions/pre-update-profile-action-in-aws-lambda', label: 'Configure Pre-Update Profile Action with AWS Lambda' }, + ], + }, + { + type: 'category', + label: 'React', + items: [ + { type: 'doc', id: 'complete-guides/react/introduction', label: 'Introduction' }, + { type: 'doc', id: 'complete-guides/react/prerequisite', label: 'Prerequisite' }, + { type: 'doc', id: 'complete-guides/react/register-an-application', label: 'Configure an application' }, + { type: 'doc', id: 'complete-guides/react/create-a-react-app', label: 'Create a React app' }, + { type: 'doc', id: 'complete-guides/react/install-asgardeo-sdk', label: 'Configure Asgardeo SDK' }, + { type: 'doc', id: 'complete-guides/react/add-login-and-logout', label: 'Add login and logout' }, + { type: 'doc', id: 'complete-guides/react/display-logged-in-user-details', label: 'Display user details' }, + { type: 'doc', id: 'complete-guides/react/securing-routes-within-the-app', label: 'Securing Routes' }, + { type: 'doc', id: 'complete-guides/react/accessing-protected-api', label: 'Accessing protected API' }, + { type: 'doc', id: 'complete-guides/react/manage-tokens-in-React-apps', label: 'Manage tokens in React' }, + { type: 'doc', id: 'complete-guides/react/next-steps', label: 'Next Steps' }, + ], + }, + { + type: 'category', + label: 'Next.js', + items: [ + { + type: 'category', + label: 'B2B', + items: [ + { type: 'doc', id: 'complete-guides/nextjs-b2b/introduction', label: 'Introduction' }, + { type: 'doc', id: 'complete-guides/nextjs-b2b/prerequisite', label: 'Prerequisites' }, + { type: 'doc', id: 'complete-guides/nextjs-b2b/register-an-application', label: 'Register an application' }, + { type: 'doc', id: 'complete-guides/nextjs-b2b/give-access-to-apis-and-create-roles', label: 'Give access to APIs and create roles' }, + { type: 'doc', id: 'complete-guides/nextjs-b2b/create-app', label: 'Create a Next.js app' }, + { type: 'doc', id: 'complete-guides/nextjs-b2b/configure-app-for-login', label: 'Configure app for login' }, + { type: 'doc', id: 'complete-guides/nextjs-b2b/add-user-sign-up', label: 'Add user sign up' }, + { type: 'doc', id: 'complete-guides/nextjs-b2b/add-login-and-logout', label: 'Add login and logout' }, + { type: 'doc', id: 'complete-guides/nextjs-b2b/manage-teams', label: 'Manage teams' }, + { type: 'doc', id: 'complete-guides/nextjs-b2b/switch-to-a-team', label: 'Switch to a team' }, + { type: 'doc', id: 'complete-guides/nextjs-b2b/manage-team-members', label: 'Manage team members' }, + ], + }, + { + type: 'category', + label: 'Redirect-Based', + items: [ + { type: 'doc', id: 'complete-guides/nextjs/introduction', label: 'Introduction' }, + { type: 'doc', id: 'complete-guides/nextjs/prerequisite', label: 'Prerequisite' }, + { type: 'doc', id: 'complete-guides/nextjs/register-an-application', label: 'Register an application' }, + { type: 'doc', id: 'complete-guides/nextjs/create-app', label: 'Create a Next.js app' }, + { type: 'doc', id: 'complete-guides/nextjs/install-asgardeo-sdk', label: 'Configure Asgardeo SDK' }, + { type: 'doc', id: 'complete-guides/nextjs/add-login-and-logout', label: 'Add login and logout' }, + { type: 'doc', id: 'complete-guides/nextjs/display-logged-in-user-details', label: 'Display user details' }, + { type: 'doc', id: 'complete-guides/nextjs/securing-routes-within-the-app', label: 'Securing Routes' }, + { type: 'doc', id: 'complete-guides/nextjs/accessing-protected-api', label: 'Accessing protected API' }, + { type: 'doc', id: 'complete-guides/nextjs/manage-tokens-in-apps', label: 'Manage tokens in Next.js' }, + { type: 'doc', id: 'complete-guides/nextjs/next-steps', label: 'Next Steps' }, + ], + }, + { + type: 'category', + label: 'App-Native', + items: [ + { type: 'doc', id: 'complete-guides/app-native/introduction', label: 'Introduction' }, + { type: 'doc', id: 'complete-guides/app-native/prerequisites', label: 'Prerequisites' }, + { type: 'doc', id: 'complete-guides/app-native/register-an-application', label: 'Register an application' }, + { type: 'doc', id: 'complete-guides/app-native/create-app', label: 'Create an app for app-native authentication' }, + { type: 'doc', id: 'complete-guides/app-native/configure-provider', label: 'Configure Asgardeo SDK' }, + { type: 'doc', id: 'complete-guides/app-native/add-login-and-logout', label: 'Add login and logout' }, + { type: 'doc', id: 'complete-guides/app-native/add-mfa', label: 'Add MFA using app-native APIs' }, + { type: 'doc', id: 'complete-guides/app-native/add-social-login', label: 'Add Social Login using app-native APIs' }, + { type: 'doc', id: 'complete-guides/app-native/manage-tokens-in-apps', label: 'Manage tokens in app-native apps' }, + { type: 'doc', id: 'complete-guides/app-native/next-steps', label: 'Next Steps' }, + ], + }, + ], + }, + { + type: 'category', + label: 'Express.js', + items: [ + { type: 'doc', id: 'complete-guides/expressjs/introduction', label: 'Introduction' }, + { type: 'doc', id: 'complete-guides/expressjs/prerequisite', label: 'Prerequisite' }, + { type: 'doc', id: 'complete-guides/expressjs/register-an-application', label: 'Configure an application' }, + { type: 'doc', id: 'complete-guides/expressjs/create-an-expressjs-app', label: 'Create an Express.js app' }, + { type: 'doc', id: 'complete-guides/expressjs/install-passport-asgardeo', label: 'Configure Passport Asgardeo' }, + { type: 'doc', id: 'complete-guides/expressjs/add-login-and-logout', label: 'Add login and logout' }, + { type: 'doc', id: 'complete-guides/expressjs/persist-user-sessions', label: 'Persist user sessions' }, + { type: 'doc', id: 'complete-guides/expressjs/display-logged-in-user-details', label: 'Display user details' }, + { type: 'doc', id: 'complete-guides/expressjs/securing-routes-within-the-app', label: 'Securing Routes' }, + { type: 'doc', id: 'complete-guides/expressjs/accessing-protected-api', label: 'Accessing protected API' }, + { type: 'doc', id: 'complete-guides/expressjs/next-steps', label: 'Next Steps' }, + ], + }, + { + type: 'category', + label: 'Angular', + items: [ + { type: 'doc', id: 'complete-guides/angular/introduction', label: 'Introduction' }, + { type: 'doc', id: 'complete-guides/angular/prerequisite', label: 'Prerequisite' }, + { type: 'doc', id: 'complete-guides/angular/register-an-application', label: 'Register an application' }, + { type: 'doc', id: 'complete-guides/angular/create-app', label: 'Create an Angular app' }, + { type: 'doc', id: 'complete-guides/angular/install-asgardeo-sdk', label: 'Configure Asgardeo provider' }, + { type: 'doc', id: 'complete-guides/angular/add-login-and-logout', label: 'Add login and logout' }, + { type: 'doc', id: 'complete-guides/angular/display-logged-in-user-details', label: 'Display user details' }, + { type: 'doc', id: 'complete-guides/angular/securing-routes-within-the-app', label: 'Securing Routes' }, + { type: 'doc', id: 'complete-guides/angular/accessing-protected-api', label: 'Accessing protected API' }, + { type: 'doc', id: 'complete-guides/angular/manage-tokens', label: 'Manage tokens in Angular' }, + { type: 'doc', id: 'complete-guides/angular/next-steps', label: 'Next Steps' }, + ], + }, + { + type: 'category', + label: 'Javascript', + items: [ + { type: 'doc', id: 'complete-guides/javascript/introduction', label: 'Introduction' }, + { type: 'doc', id: 'complete-guides/javascript/prerequisite', label: 'Prerequisite' }, + { type: 'doc', id: 'complete-guides/javascript/register-an-application', label: 'Register an application' }, + { type: 'doc', id: 'complete-guides/javascript/create-app', label: 'Create a JavaScript app' }, + { type: 'doc', id: 'complete-guides/javascript/install-asgardeo-sdk', label: 'Configure Asgardeo SDK' }, + { type: 'doc', id: 'complete-guides/javascript/add-login-and-logout', label: 'Add login and logout' }, + { type: 'doc', id: 'complete-guides/javascript/display-logged-in-user-details', label: 'Display user details' }, + { type: 'doc', id: 'complete-guides/javascript/accessing-protected-api', label: 'Accessing protected API' }, + { type: 'doc', id: 'complete-guides/javascript/manage-tokens-in-apps', label: 'Manage tokens in JavaScript' }, + { type: 'doc', id: 'complete-guides/javascript/next-steps', label: 'Next Steps' }, + ], + }, + { + type: 'category', + label: '.NET', + items: [ + { type: 'doc', id: 'complete-guides/dotnet/introduction', label: 'Introduction' }, + { type: 'doc', id: 'complete-guides/dotnet/prerequisites', label: 'Prerequisites' }, + { type: 'doc', id: 'complete-guides/dotnet/register-an-application', label: 'Register an application' }, + { type: 'doc', id: 'complete-guides/dotnet/create-a-dotnet-app', label: 'Create a .NET app' }, + { type: 'doc', id: 'complete-guides/dotnet/configure-authentication-properties', label: 'Configure auth properties' }, + { type: 'doc', id: 'complete-guides/dotnet/add-login-and-logout', label: 'Add login and logout' }, + { type: 'doc', id: 'complete-guides/dotnet/securing-routes-within-the-app', label: 'Securing Routes' }, + { type: 'doc', id: 'complete-guides/dotnet/display-logged-in-user-details', label: 'Display user details' }, + { type: 'doc', id: 'complete-guides/dotnet/protected-api', label: 'Accessing protected API' }, + { type: 'doc', id: 'complete-guides/dotnet/manage-tokens-in-dotnet-apps', label: 'Manage tokens in .NET' }, + { type: 'doc', id: 'complete-guides/dotnet/next-steps', label: 'Next Steps' }, + ], + }, + ], + }, + { + type: 'category', + label: 'Best Practice Guides', + items: [ + { + type: 'category', + label: 'Frontend Security', + items: [ + { type: 'doc', id: 'complete-guides/fesecurity/introduction', label: 'Introduction' }, + { type: 'doc', id: 'complete-guides/fesecurity/login-options', label: 'In-app vs IdP-based login' }, + { type: 'doc', id: 'complete-guides/fesecurity/public-clients', label: 'Public clients' }, + { type: 'doc', id: 'complete-guides/fesecurity/insecure-tokens', label: 'Insecure token handling' }, + { type: 'doc', id: 'complete-guides/fesecurity/weak-access-control', label: 'Weak access control' }, + { type: 'doc', id: 'complete-guides/fesecurity/unauthorized-privilege-gain', label: 'Unauthorized access' }, + { type: 'doc', id: 'complete-guides/fesecurity/weak-mfa', label: 'Weak MFA' }, + { type: 'doc', id: 'complete-guides/fesecurity/partial-user-logouts', label: 'Partial user logouts' }, + { type: 'doc', id: 'complete-guides/fesecurity/misconfiguration', label: 'Product misconfiguration' }, + { type: 'doc', id: 'complete-guides/fesecurity/xss', label: 'Cross-Site Scripting (XSS)' }, + { type: 'doc', id: 'complete-guides/fesecurity/csrf', label: 'Cross-Site Request Forgery (CSRF)' }, + { type: 'doc', id: 'complete-guides/fesecurity/next-steps', label: 'Next Steps' }, + ], + }, + ], + }, + ], +}; + +export default sidebars; diff --git a/docusaurus-asgardeo/src/assets/fonts/fa/fa-brands-400.ttf b/docusaurus-asgardeo/src/assets/fonts/fa/fa-brands-400.ttf new file mode 100644 index 0000000000000000000000000000000000000000..30f55b7435491ed4c2b11de8ab5e5c7e1e1ed669 GIT binary patch literal 189684 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

(0wGwLXB2naKMKgASi>6$6=JG#)$u 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 literal 0 HcmV?d00001 diff --git a/docusaurus-asgardeo/src/assets/fonts/fa/fa-solid-900.ttf b/docusaurus-asgardeo/src/assets/fonts/fa/fa-solid-900.ttf new file mode 100644 index 0000000000000000000000000000000000000000..e479fb29349a12b564516c40aa529276c6c5e12d GIT binary patch literal 394668 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 B77+jd literal 0 HcmV?d00001 diff --git a/docusaurus-asgardeo/src/assets/fonts/fa/fa-solid-900.woff2 b/docusaurus-asgardeo/src/assets/fonts/fa/fa-solid-900.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..88b0367aae421f51483c07ad7ae3ebc5251e48e5 GIT binary patch literal 150020 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

N{f}=hJyVz~&Ig83lmY%4(j$SFN&j#sZXv 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 DT5c?X literal 0 HcmV?d00001 diff --git a/docusaurus-asgardeo/src/assets/fonts/gilmer/gilmer-bold.eot b/docusaurus-asgardeo/src/assets/fonts/gilmer/gilmer-bold.eot new file mode 100644 index 0000000000000000000000000000000000000000..4066e7d5e3539827ac8b5bd5921102ee5e2e4517 GIT binary patch literal 98922 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 Iz?+Ev2RLZ7VE_OC literal 0 HcmV?d00001 diff --git a/docusaurus-asgardeo/src/assets/fonts/gilmer/gilmer-bold.ttf b/docusaurus-asgardeo/src/assets/fonts/gilmer/gilmer-bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..2dc04cf81a360356b9c749a7053a43137d60b128 GIT binary patch literal 98696 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%0DrLlt93steIwV&tqS} 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 cMI`CiWAt$&wD<+-=C+eezUr-S*yCc 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 literal 0 HcmV?d00001 diff --git a/docusaurus-asgardeo/src/assets/fonts/gilmer/gilmer-medium.ttf b/docusaurus-asgardeo/src/assets/fonts/gilmer/gilmer-medium.ttf new file mode 100644 index 0000000000000000000000000000000000000000..615fdee711669c6df21cc447f45d5ece96e82395 GIT binary patch literal 97272 zcmd443t$z+y+1y)yXSp!-bn}na*{&`hlFPcZ!ki52#6SwCP-<57!i3Rq9P(vM6ik) zN@d+vMauRlt~^B0Vn-k`#?GQdVyL{FiH{N%84W0+#y?5@M1@|zj559Oj zy`MY(j=6syIqEe$6Rt<;4J>&_mg}r+&|?z5fe3v7+UIfHibRNq@odHCotE{@_S~pcH%vY#q==U znC1FO!-K5bu;K~0j=6pkt~cH^7T4mNZp3xM_2fUHcnq$rIi7U)9rI^1*R1mSce9j) z93`YHBM&=#JF^~mvf{a$w9{N9+-6sG%G{hl!K48n4671Y_^@}h`|xf|l17l5KPu%h zFLNNjld&kwyx8{G8QjmuP9iV;7pskJCui)8<`IjM8zHqj;^_fJ7%h|$wmAmkvU#q{bi=7woYk(HiDcp!dhEk=sM%qY0V5d8b{?z

  • ;?| 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 Rhj=TUx0#Oz_(V;}{{X41aOeO4 literal 0 HcmV?d00001 diff --git a/docusaurus-asgardeo/src/assets/fonts/gilmer/gilmer-medium.woff b/docusaurus-asgardeo/src/assets/fonts/gilmer/gilmer-medium.woff new file mode 100644 index 0000000000000000000000000000000000000000..e248e37d6a62582aeead32e9dec822df120cfaa7 GIT binary patch literal 46992 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�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 jj^vOCkdjCs*v!Mh$fLD`@qgmR31m>lfG9;6 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 QzvKODEXZYF#V`>70N6+zCjbBd literal 0 HcmV?d00001 diff --git a/docusaurus-asgardeo/src/assets/fonts/gilmer/gilmer-regular.eot b/docusaurus-asgardeo/src/assets/fonts/gilmer/gilmer-regular.eot new file mode 100644 index 0000000000000000000000000000000000000000..6d528a5157867ce2c88314ad10a11ef65b9b2ce1 GIT binary patch literal 97770 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 Bxn2MO literal 0 HcmV?d00001 diff --git a/docusaurus-asgardeo/src/assets/fonts/gilmer/gilmer-regular.ttf b/docusaurus-asgardeo/src/assets/fonts/gilmer/gilmer-regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..679bf3e954b479f5bba316665ff44bac4ddaa5e2 GIT binary patch literal 97544 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 literal 0 HcmV?d00001 diff --git a/docusaurus-asgardeo/src/assets/fonts/gilmer/gilmer-regular.woff b/docusaurus-asgardeo/src/assets/fonts/gilmer/gilmer-regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..c66fc561409cf2d4a2f39518e00b3d08134ee072 GIT binary patch literal 47036 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 literal 0 HcmV?d00001 diff --git a/docusaurus-asgardeo/src/assets/fonts/gilmer/gilmer-regular.woff2 b/docusaurus-asgardeo/src/assets/fonts/gilmer/gilmer-regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..e92be881e245e0877ac0f3489811f5f732a059b9 GIT binary patch literal 33596 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 literal 0 HcmV?d00001 diff --git a/docusaurus-asgardeo/src/assets/fonts/gilmer/gilmer.css b/docusaurus-asgardeo/src/assets/fonts/gilmer/gilmer.css new file mode 100644 index 0000000000..300c429307 --- /dev/null +++ b/docusaurus-asgardeo/src/assets/fonts/gilmer/gilmer.css @@ -0,0 +1,83 @@ +/* +Font: Gilmer +Style: Regular +URL: https://www.youworkforthem.com/font/T9758/gilmer +Foundry: Piotr Lapa +Foundry: https://www.youworkforthem.com/designer/1166/piotr-lapa +Copyright: Copyright © 2018 by Piotr _apa. All rights reserved. +Version: 17 +Created: August 17, 2018 +License: https://www.youworkforthem.com/font-license +License: The WebFont(s) listed in this document must follow the YouWorkForThem + WebFont license rules. All other parties are strictly restricted + from using the WebFonts(s) listed without a purchased license. + All details above must always remain unaltered and visible in your CSS. +*/ + +@font-face { + font-family: 'Gilmer'; + src: url('gilmer-regular.eot'); + src: + url('gilmer-regular.eot?#iefix') format('embedded-opentype'), + url('gilmer-regular.woff2') format('woff2'), + url('gilmer-regular.woff') format('woff'), + url('gilmer-regular.ttf') format('truetype'); + font-weight: normal; + font-style: normal; +} + +/* +Font: Gilmer +Style: Medium +URL: https://www.youworkforthem.com/font/T9758/gilmer +Foundry: Piotr Lapa +Foundry: https://www.youworkforthem.com/designer/1166/piotr-lapa +Copyright: Copyright © 2018 by Piotr _apa. All rights reserved. +Version: 17 +Created: August 17, 2018 +License: https://www.youworkforthem.com/font-license +License: The WebFont(s) listed in this document must follow the YouWorkForThem + WebFont license rules. All other parties are strictly restricted + from using the WebFonts(s) listed without a purchased license. + All details above must always remain unaltered and visible in your CSS. +*/ + +@font-face { + font-family: 'Gilmer'; + src: url('gilmer-medium.eot'); + src: + url('gilmer-medium.eot?#iefix') format('embedded-opentype'), + url('gilmer-medium.woff2') format('woff2'), + url('gilmer-medium.woff') format('woff'), + url('gilmer-medium.ttf') format('truetype'); + font-weight: 500; + font-style: normal; +} + +/* +Font: Gilmer +Style: Bold +URL: https://www.youworkforthem.com/font/T9758/gilmer +Foundry: Piotr Lapa +Foundry: https://www.youworkforthem.com/designer/1166/piotr-lapa +Copyright: Copyright © 2018 by Piotr _apa. All rights reserved. +Version: 17 +Created: August 17, 2018 +License: https://www.youworkforthem.com/font-license +License: The WebFont(s) listed in this document must follow the YouWorkForThem + WebFont license rules. All other parties are strictly restricted + from using the WebFonts(s) listed without a purchased license. + All details above must always remain unaltered and visible in your CSS. +*/ + +@font-face { + font-family: 'Gilmer'; + src: url('gilmer-bold.eot'); + src: + url('gilmer-bold.eot?#iefix') format('embedded-opentype'), + url('gilmer-bold.woff2') format('woff2'), + url('gilmer-bold.woff') format('woff'), + url('gilmer-bold.ttf') format('truetype'); + font-weight: bold; + font-style: normal; +} diff --git a/docusaurus-asgardeo/src/components/Card.jsx b/docusaurus-asgardeo/src/components/Card.jsx new file mode 100644 index 0000000000..e02d8e1f9e --- /dev/null +++ b/docusaurus-asgardeo/src/components/Card.jsx @@ -0,0 +1,43 @@ +import React from 'react'; +import useBaseUrl from '@docusaurus/useBaseUrl'; + +export default function Card({ icon, darkIcon, name, artifact, description, docsLink, downloadLink, sourceLink }) { + return ( + + ); +} diff --git a/docusaurus-asgardeo/src/components/HomePageCards.jsx b/docusaurus-asgardeo/src/components/HomePageCards.jsx new file mode 100644 index 0000000000..0c6453422c --- /dev/null +++ b/docusaurus-asgardeo/src/components/HomePageCards.jsx @@ -0,0 +1,226 @@ +import React, { useEffect } from 'react'; +import useBaseUrl from '@docusaurus/useBaseUrl'; + +const columnData = [ + { + cards: [ + { + title: 'Get Started', + icon: 'rocket', + iconColor: 'icon-color-1', + links: [ + { title: 'Create Account', url: '/get-started/create-asgardeo-account/' }, + { title: 'Connect React App', url: '/quick-starts/react/' }, + { title: 'Connect Angular App', url: '/quick-starts/angular/' }, + { title: 'Connect Javascript App', url: '/quick-starts/javascript/' }, + { title: 'Connect Next.js App', url: '/quick-starts/nextjs/' }, + { title: 'Connect Express.js App', url: '/complete-guides/expressjs/introduction/' }, + { title: 'Connect .NET App', url: '/complete-guides/dotnet/introduction/' }, + { title: 'Connect Spring Boot App', url: '/quick-starts/springboot/' }, + ], + }, + ], + }, + { + cards: [ + { + title: 'Guides', + icon: 'book', + iconColor: 'icon-color-4', + links: [ + { title: 'Applications', url: '/guides/applications/' }, + { title: 'Authentication', url: '/guides/authentication/' }, + { title: 'API authorization', url: '/guides/authorization/' }, + { title: 'Branding', url: '/guides/branding/' }, + { title: 'User management', url: '/guides/users/' }, + { title: 'User self-service', url: '/guides/user-self-service/' }, + { title: 'Organizations', url: '/guides/organization-management/' }, + ], + }, + ], + }, + { + cards: [ + { + title: 'Developer Resources', + icon: 'tools', + iconColor: 'icon-color-3', + links: [ + { title: 'APIs', url: '/apis/' }, + { title: 'Tutorials', url: '/tutorials/' }, + { title: 'SDKs and Integrations', url: '/sdks/' }, + ], + }, + { + title: 'Community and Support', + icon: 'light-bulb', + iconColor: 'icon-color-2', + links: [ + { title: 'Community Help', url: 'https://discord.com/invite/wso2', external: true }, + { title: 'Enterprise Support', url: 'https://wso2.com/asgardeo/pricing/', external: true }, + ], + }, + ], + }, +]; + +const iconSvgs = { + rocket: ( + + + + ), + book: ( + + + + ), + tools: ( + + + + ), + 'light-bulb': ( + + + + ), +}; + +function ArrowIcon() { + return ( + + + + ); +} + +function HomeCard({ title, icon, iconColor, links }) { + return ( +
    +
    +
    {title}
    +
    + {iconSvgs[icon]} +
    +
    + {links.map((link, i) => ( +
    +
    + {link.external ? ( + +
    +
    {link.title}
    +
    + ) : ( + +
    +
    {link.title}
    +
    + )} +
    +
    + ))} +
    + ); +} + +export default function HomePageCards() { + useEffect(() => { + const el = document.getElementById('asgardeo-home'); + if (!el) return; + + // Walk up to find the main content column + let markdownEl = el.parentElement; + while (markdownEl && !markdownEl.classList.contains('theme-doc-markdown')) { + markdownEl = markdownEl.parentElement; + } + if (markdownEl) { + markdownEl.style.maxWidth = '100%'; + markdownEl.style.padding = '0'; + } + + // Find and expand the content column + const docItemCol = el.closest('.docItemCol_VOVn'); + if (docItemCol) { + docItemCol.style.maxWidth = '100%'; + } + + // Hide TOC sidebar column + const docItemColEl = el.closest('.docItemCol_VOVn'); + if (docItemColEl) { + const row = docItemColEl.parentElement; + if (row) { + for (const child of row.children) { + if (!child.classList.contains('docItemCol_VOVn')) { + child.style.display = 'none'; + } + } + } + } + + // Widen the container + const container = el.closest('.container'); + if (container) { + container.style.maxWidth = '100%'; + } + }, []); + + return ( + <> + +
    +
    +
    +

    How can we help?

    +

    + Welcome to Asgardeo documentation! Within these pages, + you will learn how to build a seamless login experience for your applications using + Asgardeo. +

    +
    +
    + {columnData.map((column, i) => ( +
    + {column.cards.map((card, j) => ( + + ))} +
    + ))} +
    +
    + + ); +} diff --git a/docusaurus-asgardeo/src/css/custom.css b/docusaurus-asgardeo/src/css/custom.css new file mode 100644 index 0000000000..b9f30bc84c --- /dev/null +++ b/docusaurus-asgardeo/src/css/custom.css @@ -0,0 +1,1395 @@ +/** + * Custom CSS for Asgardeo Docusaurus docs. + * Migrated from the en/theme/material mkdocs theme. + */ + +/* ========================================================================== + Gilmer Font + ========================================================================== */ + +@font-face { + font-family: 'Gilmer'; + src: url('../assets/fonts/gilmer/gilmer-regular.eot'); + src: + url('../assets/fonts/gilmer/gilmer-regular.eot?#iefix') format('embedded-opentype'), + url('../assets/fonts/gilmer/gilmer-regular.woff2') format('woff2'), + url('../assets/fonts/gilmer/gilmer-regular.woff') format('woff'), + url('../assets/fonts/gilmer/gilmer-regular.ttf') format('truetype'); + font-weight: normal; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'Gilmer'; + src: url('../assets/fonts/gilmer/gilmer-medium.eot'); + src: + url('../assets/fonts/gilmer/gilmer-medium.eot?#iefix') format('embedded-opentype'), + url('../assets/fonts/gilmer/gilmer-medium.woff2') format('woff2'), + url('../assets/fonts/gilmer/gilmer-medium.woff') format('woff'), + url('../assets/fonts/gilmer/gilmer-medium.ttf') format('truetype'); + font-weight: 500; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'Gilmer'; + src: url('../assets/fonts/gilmer/gilmer-bold.eot'); + src: + url('../assets/fonts/gilmer/gilmer-bold.eot?#iefix') format('embedded-opentype'), + url('../assets/fonts/gilmer/gilmer-bold.woff2') format('woff2'), + url('../assets/fonts/gilmer/gilmer-bold.woff') format('woff'), + url('../assets/fonts/gilmer/gilmer-bold.ttf') format('truetype'); + font-weight: bold; + font-style: normal; + font-display: swap; +} + +/* ========================================================================== + FontAwesome Solid Icons + ========================================================================== */ + +@font-face { + font-family: 'FA-Solid'; + src: url('../assets/fonts/fa/fa-solid-900.woff2') format('woff2'), + url('../assets/fonts/fa/fa-solid-900.ttf') format('truetype'); + font-weight: 900; + font-style: normal; + font-display: block; +} + +/* ========================================================================== + FontAwesome Brand Icons + ========================================================================== */ + +@font-face { + font-family: 'FA-Brands'; + src: url('../assets/fonts/fa/fa-brands-400.woff2') format('woff2'), + url('../assets/fonts/fa/fa-brands-400.ttf') format('truetype'); + font-weight: 400; + font-style: normal; + font-display: block; +} + +/* ========================================================================== + CSS Custom Properties (Light Mode / Default) + ========================================================================== */ + +:root { + --ifm-font-family-base: 'Gilmer', system-ui, -apple-system, sans-serif; + --ifm-heading-font-family: 'Gilmer', system-ui, -apple-system, sans-serif; + + --ifm-font-size-base: 16px; + --ifm-line-height-base: 1.7; + + /* Primary color - Asgardeo orange */ + --ifm-color-primary: #ff7300; + --ifm-color-primary-dark: #e66800; + --ifm-color-primary-darker: #d96200; + --ifm-color-primary-darkest: #b35100; + --ifm-color-primary-light: #ff811a; + --ifm-color-primary-lighter: #ff8926; + --ifm-color-primary-lightest: #ff9f4d; + + /* Code */ + --ifm-code-font-size: 95%; + --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1); + + /* Layout */ + --ifm-navbar-height: 62px; + --ifm-navbar-shadow: none; + --ifm-navbar-background-color: #ffffff; + --ifm-navbar-link-color: #1f2024; + --ifm-navbar-link-hover-color: #ff7300; + + --ifm-spacing-horizontal: 1.5rem; + + /* Border radius */ + --ifm-border-radius: 8px; + --ifm-global-radius: 8px; + --ifm-card-border-radius: 12px; + + /* Code block colors (dark theme, same for light mode in mkdocs) */ + --ifm-code-background: #161618; + --ifm-code-color: #d9d9de; + --ifm-pre-background: #161618; + --ifm-pre-color: #d9d9de; + + /* Custom variables */ + --ds-colors-white: #ffffff; + --ds-colors-mystic: #d8dde8; + --ds-colors-shark: #1f2024; + --ds-colors-alabaster: #f9f9f9; + --ds-colors-discord-blurple: #5865F2; + --ds-border-color: #d8dde8; + --ds-surface-bg: #ffffff; + --ds-box-shadow: 0 10px 15px -3px rgba(0, 0, 0, .1), 0 4px 6px -4px rgba(0, 0, 0, .1); + --ds-box-shadow-2: 0 12px 32px rgba(0, 0, 0, .1), 0 2px 6px rgba(0, 0, 0, .08); + + /* Icon colors */ + --ds-icon-color-1-bg: rgba(233, 246, 252, 1); + --ds-icon-color-1-fg: #27aae1; + --ds-icon-color-2-bg: rgba(255, 236, 246, 1); + --ds-icon-color-2-fg: #cf3b89; + --ds-icon-color-3-bg: rgba(231, 246, 245, 1); + --ds-icon-color-3-fg: #15a79e; + --ds-icon-color-4-bg: rgba(255, 247, 239, 1); + --ds-icon-color-4-fg: #f7931e; +} + +/* ========================================================================== + Dark Mode CSS Custom Properties + ========================================================================== */ + +[data-theme='dark'] { + --ifm-color-primary: #ff811a; + --ifm-color-primary-dark: #ff7300; + --ifm-color-primary-darker: #f56e00; + --ifm-color-primary-darkest: #cc5a00; + --ifm-color-primary-light: #ff8f33; + --ifm-color-primary-lighter: #ff9640; + --ifm-color-primary-lightest: #ffad66; + + --ifm-background-color: #232327; + --ifm-background-surface-color: #232327; + --ifm-navbar-background-color: #232327; + --ifm-footer-background-color: #232327; + + --ifm-navbar-link-color: #e3e3e3; + --ifm-navbar-link-hover-color: #ff811a; + + --ifm-code-background: #161618; + --ifm-code-color: #d9d9de; + --ifm-pre-background: #161618; + --ifm-pre-color: #d9d9de; + + --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3); + + --ds-border-color: rgba(255, 255, 255, 0.1); + --ds-surface-bg: #1f2024; + --ds-icon-color-1-bg: rgba(233, 246, 252, 0.1); + --ds-icon-color-2-bg: rgba(255, 236, 246, 0.1); + --ds-icon-color-3-bg: rgba(231, 246, 245, 0.1); + --ds-icon-color-4-bg: rgba(255, 247, 239, 0.1); +} + +/* ========================================================================== + Inline Code Styling (Light Mode: light bg, dark code) + ========================================================================== */ + +:root:not([data-theme='dark']) code:not([class*='language-']) { + background-color: #161618; + color: #d9d9de; + border-radius: 0.25rem; + padding: 0.1rem 0.3rem; +} + +[data-theme='dark'] code:not([class*='language-']) { + background-color: #161618; + color: #d9d9de; + border-radius: 0.25rem; + padding: 0.1rem 0.3rem; +} + +/* ========================================================================== + Navbar / Header Styling + ========================================================================== */ + +.navbar { + border-bottom: 1px solid var(--ds-border-color); + box-shadow: none; + padding: 0 1rem; + font-size: 0.7rem; + letter-spacing: 0.1px; +} + +.navbar__inner { + padding: 0; +} + +.navbar__brand { + margin-right: 1rem; +} + +.navbar__logo { + height: 1.4rem; +} + +.navbar__logo img { + height: 1.4rem; +} + +.navbar__items--right > * { + margin-left: 0.5rem; +} + +.navbar__link { + font-size: 0.7rem; + font-weight: 400; +} + +/* Search bar styling in navbar */ +.navbar__search-input { + font-size: 0.7rem; + border-radius: var(--ifm-border-radius); +} + +/* ========================================================================== + Theme / Color Mode Toggle + ========================================================================== */ + +.navbar .clean-btn svg { + height: 20px; + width: 20px; +} + +/* ========================================================================== + Sidebar / Docs Menu Styling + ========================================================================== */ + +.theme-doc-sidebar-container { + border-right: none !important; +} + +.menu { + font-size: 14px; + line-height: 1.3; + padding: 1rem 0; + margin: 0 0 0 1rem; +} + +.menu__list { + margin-bottom: 15px; +} + +.menu__list-item { + margin-top: 0.8em; +} + +.menu__link { + font-size: 14px; + font-weight: 400; + border-radius: var(--ifm-border-radius); + padding: 0.4rem 0.75rem; + color: var(--ifm-font-color-base); +} + +.menu__link:hover { + color: var(--ifm-color-primary); +} + +.menu__link--active { + font-weight: 500; + color: var(--ifm-color-primary); +} + +.menu__caret, +.menu__link--sublist-caret::after { + min-width: 1.25rem; +} + +/* Hide the TOC sidebar when not needed (matching mkdocs behavior) */ +/* The .hide-toc logic can be applied via frontmatter if needed */ + +/* ========================================================================== + Content / Main Area Styling + ========================================================================== */ + +.markdown { + font-size: 16px; + letter-spacing: 0.1px; +} + +.markdown h1 { + color: var(--ifm-heading-color); +} + +.markdown h1:first-child { + --ifm-h1-font-size: 2rem; +} + +/* ========================================================================== + Code Blocks Styling + ========================================================================== */ + +.theme-code-block { + border-radius: 0.4rem; + box-shadow: none; + font-size: 0.875rem; +} + +.prism-code { + border-radius: 0.4rem; +} + +/* ========================================================================== + Admonitions / Callouts Styling + ========================================================================== */ + +.theme-admonition { + font-size: 14px; + border-radius: var(--ifm-border-radius); + border-left-width: 4px; +} + +[data-theme='dark'] .theme-admonition { + background-color: rgba(0, 0, 0, 0.17); + color: rgba(255, 255, 255, 0.65); +} + +/* ========================================================================== + Footer Styling + ========================================================================== */ + +.footer { + --ifm-footer-background-color: var(--ds-colors-alabaster); + color: var(--ifm-font-color-base); + border-top: 1px solid var(--ds-border-color); + padding: 3rem 0 2rem; +} + +[data-theme='dark'] .footer { + --ifm-footer-background-color: #232327; +} + +.footer__links { + margin-bottom: 2rem; +} + +.footer__title { + font-size: 0.85rem; +} + +.footer__item { + font-size: 0.8rem; +} + +.footer__link-item { + font-weight: 500; +} + +.footer__link-item:hover { + color: var(--ifm-color-primary); +} + +.footer__col { + margin-bottom: 1.5rem; +} + +.footer__bottom { + border-top: 1px solid var(--ds-border-color); + margin-top: 2rem; + padding-top: 1.5rem; + font-size: 0.75rem; +} + +[data-theme='dark'] .footer { + --ifm-footer-background-color: #232327; +} + +[data-theme='dark'] .footer__bottom { + background-color: var(--ds-colors-alabaster); + color: var(--ifm-font-color-base); +} + +/* ========================================================================== + Cards Styling (for landing page / section pages) + ========================================================================== */ + +.cards-container { + display: flex; + flex-wrap: wrap; + align-items: stretch; + margin: 50px 0; +} + +.cards-container .card { + display: inline-block; + margin: 5px; + padding: 20px; + border-radius: 4px; + border: 1px solid var(--ifm-color-emphasis-300); + max-width: 330px; + text-align: center; + color: var(--ifm-font-color-base); + text-decoration: none; +} + +.cards-container .card:hover { + background: var(--ifm-color-emphasis-200); + color: var(--ifm-font-color-base); + text-decoration: none; +} + +.cards-container .card > h3 { + margin-top: 0; +} + +.cards-container .card > p:last-child { + margin-bottom: 0; +} + +.cards-container .card.square { + width: 185px; + height: 185px; +} + +.cards-container .card > img { + width: 100px; + max-height: 100px; +} + +.cards-container .card > p > a { + margin: 10px; + color: var(--ifm-font-color-base); +} + +.cards-container .card > p > a:hover { + color: var(--ifm-color-primary); +} + +.center-all { + text-align: center; +} + +.center-all .cards-container { + justify-content: center; +} + +/* ========================================================================== + Buttons Styling + ========================================================================== */ + +.md-button { + border-radius: var(--ifm-border-radius); + color: var(--ifm-font-color-base); + cursor: pointer; + display: inline-block; + font-weight: 500; + transition: color 125ms, background-color 125ms, border-color 125ms; + padding: 8px 16px; + border: 1px solid var(--ifm-color-emphasis-300); + background-color: transparent; + text-decoration: none; +} + +.md-button:hover { + opacity: 0.9; + text-decoration: none; + color: var(--ifm-font-color-base); +} + +.md-button.md-button--primary { + background: linear-gradient(77.74deg, #eb4f63 11.16%, #ff7300 99.55%); + color: #ffffff; + border-color: transparent; +} + +.md-button.md-button--primary:hover { + color: #ffffff; +} + +.md-button.md-button--link { + background-color: transparent; + border-color: transparent; +} + +.md-button.md-button--small { + padding: 6px 12px; +} + +.md-button.md-button--flex { + display: flex; + flex-direction: row; + align-content: center; + align-items: center; + gap: 10px; +} + +/* ========================================================================== + Chip Styling (Beta, Preview, New, Premium badges) + ========================================================================== */ + +.md-chip { + max-width: 100%; + font-family: 'Gilmer', sans-serif; + display: inline-flex; + align-items: center; + justify-content: center; + color: var(--ifm-font-color-base); + background: var(--ifm-color-primary); + cursor: default; + vertical-align: middle; + box-sizing: border-box; + font-size: 0.6125rem; + height: 24px; + border-radius: 6px; + white-space: nowrap; + transition: background-color 300ms cubic-bezier(0.4, 0, 0.2, 1), box-shadow 300ms cubic-bezier(0.4, 0, 0.2, 1); + outline: 0px; + text-decoration: none; + border: none; + padding: 0px; +} + +.md-chip__label { + overflow: hidden; + text-overflow: ellipsis; + padding-left: 12px; + padding-right: 12px; + white-space: nowrap; + font-weight: 600; +} + +.md-chip--beta { + background: linear-gradient(131deg, rgba(143, 197, 246, 0.30) 0%, rgba(72, 141, 180, 0.30) 100%); + border: 1px solid #488DB4; +} + +.md-chip--beta .md-chip__label { + background-image: linear-gradient(93deg, #488DB4 0%, #1F3D4E 100%); + background-clip: text; + -webkit-background-clip: text; + color: transparent; +} + +.md-chip--preview { + background: linear-gradient(131deg, rgba(233, 95, 255, 0.30) 0%, rgba(140, 57, 153, 0.30) 100%); + border: 1px solid #8C3999; +} + +.md-chip--preview .md-chip__label { + background-image: linear-gradient(93deg, #8C3999 0%, #2F1333 100%); + background-clip: text; + -webkit-background-clip: text; + color: transparent; +} + +.md-chip--new { + background: linear-gradient(131deg, rgba(117, 237, 161, 0.30) 28.46%, rgba(52, 146, 86, 0.30) 119.09%); + border: 1px solid #349256; +} + +.md-chip--new .md-chip__label { + background-image: linear-gradient(93deg, #349256 28.46%, #102C1A 119.09%); + background-clip: text; + -webkit-background-clip: text; + color: transparent; +} + +.md-chip--premium { + background: linear-gradient(131deg, rgba(224, 184, 52, 0.30) 25.98%, rgba(181, 138, 0, 0.30) 112.91%); + border: 1px solid #928934; +} + +.md-chip--premium .md-chip__label { + background-image: linear-gradient(93deg, #928934 28.46%, #2C2910 119.09%); + background-clip: text; + -webkit-background-clip: text; + color: transparent; +} + +[data-theme='dark'] .md-chip--beta .md-chip__label { + background-image: linear-gradient(93deg, #adcddf 0%, #59859e 100%); + background-clip: text; + -webkit-background-clip: text; + color: transparent; +} + +[data-theme='dark'] .md-chip--preview .md-chip__label { + background-image: linear-gradient(93deg, #ef85ff 0%, #e1bae7 100%); + background-clip: text; + -webkit-background-clip: text; + color: transparent; +} + +[data-theme='dark'] .md-chip--new .md-chip__label { + background-image: linear-gradient(93deg, #5bb77c 28.46%, #65d48d 119.09%); + background-clip: text; + -webkit-background-clip: text; + color: transparent; +} + +[data-theme='dark'] .md-chip--premium .md-chip__label { + background-image: linear-gradient(93deg, #d9d07c 28.46%, #867f46 119.09%); + background-clip: text; + -webkit-background-clip: text; + color: transparent; +} + +/* ========================================================================== + Icon Color Variants (for section landing pages) + ========================================================================== */ + +.icon-color-1 { background-color: var(--ds-icon-color-1-bg); } +.icon-color-1 svg path { fill: var(--ds-icon-color-1-fg) !important; } +.icon-color-2 { background-color: var(--ds-icon-color-2-bg); } +.icon-color-2 svg path { fill: var(--ds-icon-color-2-fg) !important; } +.icon-color-3 { background-color: var(--ds-icon-color-3-bg); } +.icon-color-3 svg path { fill: var(--ds-icon-color-3-fg) !important; } +.icon-color-4 { background-color: var(--ds-icon-color-4-bg); } +.icon-color-4 svg path { fill: var(--ds-icon-color-4-fg) !important; } + +/* ========================================================================== + Card Component Styling (md-card) + ========================================================================== */ + +.md-card { + box-shadow: var(--ds-box-shadow); + border: 1px solid var(--ds-border-color); + border-radius: 12px; + background-color: var(--ds-surface-bg); + padding: 30px; +} + +/* ========================================================================== + Image + Text Layouts + ========================================================================== */ + +.image-text-wrapped-container { + display: flex; + align-items: center; + margin: 0 auto; + max-width: 1000px; +} + +.image-text-wrapped-container .wrapping-text { + flex: 1; + padding: 20px; + margin-bottom: 1em; +} + +.image-text-wrapped-container .wrapped-image { + flex-shrink: 0; + padding: 20px; + max-width: 100%; +} + +.image-text-wrapped-container .wrapped-image > img { + max-width: 100%; + height: auto; + display: block; +} + +.centered-container { + display: flex; + justify-content: left; + align-items: baseline; +} + +.border-text { + margin: 10px; + text-align: center; +} + +/* ========================================================================== + Progress / Visited States + ========================================================================== */ + +.md-nav__link-read_time { + font-size: 10px; + color: var(--ifm-color-emphasis-600); + white-space: nowrap; + word-break: keep-all; + font-style: italic; +} + +.md-nav__link-read_time.visited > .md-nav__link-read_check:after { + display: inline-block; +} + +.md-nav__link-read_time > .md-nav__link-read_check:after { + background-color: #00c853; + -webkit-mask-image: var(--ifm-admonition-icon-success); + mask-image: var(--ifm-admonition-icon-success); + content: ""; + height: 0.6rem; + -webkit-mask-position: center; + mask-position: center; + -webkit-mask-repeat: no-repeat; + mask-repeat: no-repeat; + -webkit-mask-size: contain; + mask-size: contain; + position: absolute; + width: 0.6rem; + display: none; + padding-left: 25px; + top: 0.82rem; +} + +/* ========================================================================== + Tabbed Content + ========================================================================== */ + +.tabbed-content.tab_with_no_code { + background: var(--ifm-color-emphasis-100); + padding: 0 20px 10px; + border-radius: 0 0 0.4rem 0.4rem; +} + +/* ========================================================================== + Copy Page Button + ========================================================================== */ + +.copy-page-container { + display: flex; + position: relative; + margin-top: 12px; + margin-bottom: 20px; + width: fit-content; +} + +.copy-page-button.header-group-btn { + display: flex; + align-items: center; + gap: 8px; + padding: 6px 14px; + background-color: var(--ifm-background-color); + border: 1px solid var(--ifm-color-emphasis-300); + border-radius: 4px; + cursor: pointer; + font-size: 0.7rem; + font-weight: 700; + color: var(--ifm-color-emphasis-600); + transition: all 0.2s ease-in-out; + height: 34px; + white-space: nowrap; +} + +.copy-page-button.header-group-btn:hover { + color: var(--ifm-color-primary); + border-color: var(--ifm-color-primary); + background-color: rgba(255, 115, 0, 0.05); +} + +.copy-page-button.copied-success { + color: #2e7d32; + border-color: #2e7d32; + background-color: rgba(46, 125, 50, 0.1); +} + +.copy-page-menu { + position: absolute; + top: calc(100% + 4px); + left: 0; + right: auto; + min-width: 230px; + padding: 6px; + background-color: var(--ifm-background-color); + border: 1px solid var(--ifm-color-emphasis-300); + border-radius: 6px; + box-shadow: var(--ds-box-shadow-2); + z-index: 100; + display: none; +} + +.copy-page-menu.active { display: block; } + +.copy-page-item { + display: flex; + align-items: center; + gap: 10px; + width: 100%; + padding: 8px 12px; + font-size: 0.75rem; + color: var(--ifm-font-color-base); + background: none; + border: none; + border-radius: 4px; + cursor: pointer; + text-align: left; +} + +.copy-page-item:hover { background-color: var(--ifm-color-emphasis-100); } + +.copy-page-item-text { + display: flex; + flex-direction: column; + flex: 1; +} + +.copy-page-item-title { font-weight: 600; } +.copy-page-item-desc { font-size: 0.65rem; color: var(--ifm-color-emphasis-600); } +.copy-page-divider { height: 1px; background-color: var(--ifm-color-emphasis-300); margin: 6px 0; opacity: 0.5; } + +.copy-page-chevron-icon { transition: transform 0.2s; } +.copy-page-button[aria-expanded="true"] .copy-page-chevron-icon { transform: rotate(180deg); } + +.copy-page-backdrop { + display: none; + position: fixed; + top: 0; left: 0; right: 0; bottom: 0; + z-index: 90; +} +.copy-page-backdrop.active { display: block; } + +@media (max-width: 600px) { + .copy-page-button .btn-text, .copy-page-chevron-icon { display: none; } + .copy-page-button { width: 100px; padding: 0; justify-content: center; } + .copy-page-container { width: 50px; } +} + +/* ========================================================================== + Superfences / Tabs + ========================================================================== */ + +.superfences-tabs { + display: flex; + position: relative; + flex-wrap: wrap; + margin: 1em 0; + border-radius: 0.2em; +} + +html .superfences-tabs > label { + color: #ff7043; + font-weight: normal; + border: none; +} + +html .superfences-tabs > label:hover { + color: #ff7043; + font-weight: bold; +} + +/* ========================================================================== + Responsive Adjustments + ========================================================================== */ + +@media screen and (max-width: 996px) { + .navbar__items { + font-size: 14px; + } + + .menu { + font-size: 14px; + } +} + +@media screen and (min-width: 997px) { + article .markdown { + margin: 0 auto 3rem; + padding: 0.5rem 2rem; + max-width: 900px; + } +} + +/* ========================================================================== + Prism / Syntax Highlighting Overrides + ========================================================================== */ + +/* Override Prism code block to use the dark code theme colors */ +.prism-code { + color: #d9d9de; + background-color: #161618; +} + +/* Token colors matching mkdocs code highlighting */ +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: #47bfffb5; +} + +.token.punctuation { + color: #d9d9de; +} + +.token.property, +.token.tag, +.token.boolean, +.token.number, +.token.constant, +.token.symbol, +.token.deleted { + color: #d52a2a; +} + +.token.selector, +.token.attr-name, +.token.string, +.token.char, +.token.builtin, +.token.inserted { + color: #a0fbaa; +} + +.token.operator, +.token.entity, +.token.url { + color: #d9d9de; +} + +.token.atrule, +.token.attr-value, +.token.keyword { + color: #4489FF; +} + +.token.function, +.token.class-name { + color: #ec9752; +} + +.token.regex, +.token.important, +.token.variable { + color: #47bfffb5; +} + +/* ========================================================================== + Tables Styling + ========================================================================== */ + +.markdown table { + display: table; + width: 100%; + border-radius: var(--ifm-border-radius); +} + +.markdown th { + font-weight: 600; + font-size: 0.85rem; +} + +.markdown td { + font-size: 0.85rem; +} + +/* ========================================================================== + Breadcrumbs Styling + ========================================================================== */ + +.theme-doc-breadcrumbs { + margin-bottom: 1rem; +} + +.breadcrumbs__link { + font-size: 0.75rem; +} + +/* ========================================================================== + Sidebar Category Icons (top-level only, not sub-items) + ========================================================================== */ + +/* Common styles for all sidebar icons */ +.sidebar-icon-home > .menu__link::before, +.sidebar-icon-rocket > .menu__list-item-collapsible > .menu__link::before, +.sidebar-icon-book > .menu__list-item-collapsible > .menu__link::before, +.sidebar-icon-graduation > .menu__list-item-collapsible > .menu__link::before, +.sidebar-icon-cube > .menu__list-item-collapsible > .menu__link::before, +.sidebar-icon-code > .menu__list-item-collapsible > .menu__link::before, +.sidebar-icon-external-link > .menu__list-item-collapsible > .menu__link::before { + font-family: 'FA-Solid'; + font-weight: 900; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + margin-right: 8px; + display: inline-block; + width: 17px; + text-align: center; + font-size: 14px; +} + +.sidebar-icon-home > .menu__link::before { content: '\f015'; } +.sidebar-icon-rocket > .menu__list-item-collapsible > .menu__link::before { content: '\f135'; } +.sidebar-icon-book > .menu__list-item-collapsible > .menu__link::before { content: '\f518'; } +.sidebar-icon-graduation > .menu__list-item-collapsible > .menu__link::before { content: '\f19d'; } +.sidebar-icon-cube > .menu__list-item-collapsible > .menu__link::before { content: '\f1b2'; } +.sidebar-icon-code > .menu__list-item-collapsible > .menu__link::before { content: '\f121'; } +.sidebar-icon-external-link > .menu__list-item-collapsible > .menu__link::before { content: '\f35d'; } + +/* Connect App tech stack brand icons */ +.sidebar-icon-ca-react > .menu__list-item-collapsible > .menu__link::before, +.sidebar-icon-ca-vue > .menu__list-item-collapsible > .menu__link::before, +.sidebar-icon-ca-angular > .menu__list-item-collapsible > .menu__link::before, +.sidebar-icon-ca-js > .menu__list-item-collapsible > .menu__link::before { + font-family: 'FA-Brands'; + font-weight: 400; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + margin-right: 8px; + display: inline-block; + width: 17px; + text-align: center; + font-size: 14px; +} + +.sidebar-icon-ca-react > .menu__list-item-collapsible > .menu__link::before { content: '\f41b'; } +.sidebar-icon-ca-vue > .menu__list-item-collapsible > .menu__link::before { content: '\f41f'; } +.sidebar-icon-ca-angular > .menu__list-item-collapsible > .menu__link::before { content: '\f420'; } +.sidebar-icon-ca-js > .menu__list-item-collapsible > .menu__link::before { content: '\f3b8'; } + +/* Sidebar divider */ +.sidebar-divider { + border-top: 1px solid var(--ifm-color-emphasis-300); + margin: 15px 0; +} + +/* ========================================================================== + SDK Cards + ========================================================================== */ + +.sdk-type-heading { + margin-top: 2rem; +} + +.sdk-type-description { + color: var(--ifm-color-emphasis-600); + font-weight: 400; + margin-bottom: 1.5rem; +} + +.flex-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); + gap: 20px; + margin-bottom: 2rem; +} + +.sdk-card { + display: flex; + flex-direction: column; + justify-content: space-between; +} + +.sdk-card-header { + display: flex; + flex-direction: column; + gap: 12px; +} + +.sdk-card-info { + display: flex; + align-items: flex-start; + gap: 14px; +} + +.sdk-card-icon-container { + flex-shrink: 0; + width: 40px; + height: 40px; + display: flex; + align-items: center; + justify-content: center; +} + +.sdk-card-icon { + max-width: 100%; + max-height: 100%; +} + +[data-theme='dark'] .sdk-card-icon--dark { + display: inline; +} + +[data-theme='light'] .sdk-card-icon--dark, +:root:not([data-theme='dark']) .sdk-card-icon--dark { + display: none; +} + +.sdk-card-package-info { + flex: 1; + min-width: 0; +} + +.sdk-card-heading { + margin: 0 0 6px; + font-size: 1rem; +} + +.sdk-card-artifact-id code { + font-size: 0.75rem; + background: var(--ifm-color-emphasis-100); + padding: 2px 8px; + border-radius: 4px; + word-break: break-all; +} + +.sdk-card-description { + margin-top: 12px; + font-size: 0.85rem; + color: var(--ifm-color-emphasis-700); + flex: 1; +} + +.sdk-card-description p { + margin: 0; +} + +.integration-card-source-links { + display: flex; + gap: 8px; + margin-top: 16px; + padding-top: 12px; + border-top: 1px solid var(--ifm-color-emphasis-200); +} + +.integration-card-source-links .source-link { + display: flex; + align-items: center; + justify-content: center; + width: 32px; + height: 32px; + border-radius: 50%; + color: var(--ifm-color-emphasis-600); + transition: background-color 0.2s, color 0.2s; +} + +.integration-card-source-links .source-link:hover { + background: var(--ifm-color-emphasis-200); + color: var(--ifm-color-primary); +} + +/* ========================================================================== + Home Page Styles + ========================================================================== */ + +/* Hide TOC sidebar on home page */ +.docMainContainer_TBSr:has(#asgardeo-home) ~ .col { + display: none !important; +} + +.docMainContainer_TBSr:has(#asgardeo-home) .row .col.docItemCol_VOVn { + max-width: 100% !important; +} + +/* Override Docusaurus content max-width for home page */ +#asgardeo-home { + max-width: 1400px; + margin: 0 auto; +} + +/* Prevent Docusaurus article/navbar default max-widths from boxing-in the home page */ +.markdown:has(#asgardeo-home) { + max-width: 100% !important; + padding: 0 !important; + margin: 0 auto 3rem !important; +} + +.docMainContainer_TBSr:has(#asgardeo-home) > .container { + max-width: 100% !important; +} + +#asgardeo-home .md-home-search-input-description { + max-width: 800px; + margin-left: auto; + margin-right: auto; +} + +.home-page-container { + position: relative; +} + +:root, +[data-theme='light'] { + --md-home-body-gradient: conic-gradient(from 180deg at 50% 50%, #2a8af6 0deg, #d9a300 180deg, #ff7300 1turn); +} + +[data-theme='dark'] { + --md-home-body-gradient: conic-gradient(from 180deg at 50% 50%, #2a8af6 0deg, #d9a300 180deg, #ff7300 1turn); +} + +.md-home-gradient { + background: var(--md-home-body-gradient); + width: 1000px; + height: 1000px; + display: block; + mix-blend-mode: normal; + filter: blur(75px); + opacity: 0.15; + will-change: filter; + border-radius: 9999px; + max-width: 100%; + top: -500px; + position: absolute; + z-index: -1; +} + +.md-home-search-container { + margin: 0 auto 10px; + text-align: center; +} + +.md-home-search-input-label { + margin-bottom: 0.5em; + font-size: 2rem; +} + +.md-home-search-input-description { + display: block; + max-width: 800px; + margin: 2em auto 5em; + text-align: center; +} + +.md-home-sections { + max-width: 1400px; + margin-bottom: 5rem !important; +} + +.md-column-grid { + margin: auto; + display: flex; + align-items: start; + justify-content: space-between; + width: 100%; +} + +.md-grid-column { + width: 32%; + flex-shrink: 0; +} + +.md-grid-column:last-child { + margin-right: 0; +} + +.md-column-grid-item { + margin: 0 0 20px 0; +} + +/* Override Docusaurus content max-width for home page */ +#asgardeo-home { + max-width: 1400px; + margin: 0 auto; +} + +/* Prevent Docusaurus article/navbar default max-widths from boxing-in the home page */ +.markdown:has(#asgardeo-home) { + max-width: 100% !important; + padding: 0 !important; + margin: 0 auto 3rem !important; +} + +.docMainContainer_TBSr:has(#asgardeo-home) > .container { + max-width: 100% !important; +} + +#asgardeo-home .md-home-search-input-description { + max-width: 800px; + margin-left: auto; + margin-right: auto; +} + +.article-wrapper .home-page-container { + max-width: 100%; +} + +.home-page-container .md-home-search-input-description { + max-width: 800px; + margin-left: auto; + margin-right: auto; +} + +/* Remove Docusaurus article default max-width on home page */ +article:has(.home-page-container) { + max-width: 100% !important; +} + +article:has(.home-page-container) ~ .container { + max-width: 100% !important; +} + +.markdown:has(.home-page-container) { + max-width: 100% !important; + padding: 0 !important; +} + +.md-column-grid-item-header-container { + display: flex; + justify-content: space-between; + margin-bottom: 15px; +} + +.md-column-grid-item-header-text { + font-size: 0.8rem; + font-weight: 600; + line-height: 2.5; +} + +.md-column-grid-item-header-icon { + background: #F7F8FB; + border-radius: 50%; + display: inline-flex; + align-items: center; + justify-content: center; + height: 2rem; + width: 2rem; + flex-shrink: 0; +} + +[data-theme='dark'] .md-column-grid-item-header-icon { + background: rgba(255, 255, 255, 0.08); +} + +.md-list-item > a { + color: var(--ifm-font-color-base); + display: block; + padding: 10px 0; + white-space: nowrap; + border-bottom: 1px solid var(--ifm-color-emphasis-200); + text-decoration: none; +} + +.md-list-item > a:hover { + color: var(--ifm-color-primary); + text-decoration: none; +} + +.md-list-item:last-child > a { + border-bottom: none; +} + +.md-list-item-icon { + margin-right: 0.5rem; + vertical-align: top; + display: inline-block; +} + +.md-list-item-icon svg > path { + fill: var(--ifm-color-primary); +} + +.md-list-item-icon, +.md-list-item-text { + max-width: 92%; + white-space: normal; + display: inline-block; + vertical-align: middle; +} + +@media screen and (max-width: 996px) { + .md-column-grid { + flex-direction: column; + } + + .md-grid-column { + width: 100%; + display: block; + } +} + +/* ========================================================================== + Scrollbar Styling + ========================================================================== */ + +::-webkit-scrollbar { + width: 8px; + height: 8px; +} + +::-webkit-scrollbar-track { + background: transparent; +} + +::-webkit-scrollbar-thumb { + background: var(--ifm-color-emphasis-400); + border-radius: 4px; +} + +::-webkit-scrollbar-thumb:hover { + background: var(--ifm-color-emphasis-500); +} diff --git a/docusaurus-asgardeo/static/apis/organization-apis/restapis/account-recovery.yaml b/docusaurus-asgardeo/static/apis/organization-apis/restapis/account-recovery.yaml new file mode 100644 index 0000000000..e3507dc049 --- /dev/null +++ b/docusaurus-asgardeo/static/apis/organization-apis/restapis/account-recovery.yaml @@ -0,0 +1,256 @@ +openapi: 3.0.1 +info: + title: Recovery API + description: | + This document specifies a **Organization level Recovery related RESTful API** for Asgardeo. + version: 0.9.0 +servers: + - url: https://api.asgardeo.io/t/{root-organization-name}/o/api/identity/recovery/v0.9 +security: + - OAuth2: [] +paths: + /recover-password: + post: + tags: + - Password Recovery + - Notification + summary: | + Send recovery notification + description: | + This API is used to send password recovery confirmation over defined channels like email/SMS. + + Scope(Permission) required: `internal_org_recovery_create` + parameters: + - name: type + in: query + description: Notification Type + schema: + type: string + - name: notify + in: query + description: If notify=true, notifications will be internally managed. + schema: + type: boolean + requestBody: + description: Optional property parameters can be sent via email based on the + email template. + content: + application/json: + schema: + $ref: '#/components/schemas/RecoveryInitiatingRequest' + required: true + responses: + 202: + description: Successful response + content: + application/json: + schema: + title: key + type: string + 400: + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 500: + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{root-organization-name}/o/api/identity/recovery/v0.9/recover-password?type=email¬ify=true' \ + -H 'Authorization: Bearer {bearer_token}' \ + -H 'Content-Type: application/json' \ + -d '{ + "user": { + "username": "john", + "realm": "ENGINEERING", + "tenant-domain": "f5fac8b0-e23e-44de-b4ba-a4d7c304d474" + }, + "properties": [] + }' + /set-password: + post: + tags: + - Password Recovery + - Notification + summary: | + Update password + description: | + This API is used to reset the user password using the confirmation key received through the recovery process. You need to input the `key` and the new `password`. + + Scope(Permission) required: `internal_org_recovery_create` + requestBody: + description: Key, password, and optional metadata properties. + content: + application/json: + schema: + $ref: '#/components/schemas/ResetPasswordRequest' + required: true + responses: + 202: + description: Successful response + content: {} + 400: + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 412: + description: Precondition Failed + content: + application/json: + schema: + $ref: '#/components/schemas/RetryError' + 500: + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{root-organization-name}/o/api/identity/recovery/v0.9/set-password' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "key": "5c765a47-6764-4048-b5cf-55864cb654c0", + "password": "P@ssW0rd", + "properties": [] + }' + /validate-code: + post: + tags: + - Password Recovery + summary: | + Validate confirmation code + description: | + This API is used to validate confirmation codes sent in account recovery scenarios and self-signup. You need to input the confirmation `code` and recovery `step` as parameters. + + Scope(Permission) required: `internal_org_recovery_create` + requestBody: + description: Code, recovery step, and optional parameters.
    For recovery **step**, + you can use one of the following according to the recovery scenario that you want to validate the code. +
      +
    • **UPDATE_PASSWORD**
    • +
    • **CONFIRM_SIGN_UP**
    • +
    • **VALIDATE_CHALLENGE_QUESTION**
    • +
    • **VALIDATE_ALL_CHALLENGE_QUESTION**
    • +
    + + content: + application/json: + schema: + $ref: '#/components/schemas/CodeValidationRequest' + required: true + responses: + 202: + description: Accepted + content: {} + 400: + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 500: + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{root-organization-name}/o/api/identity/recovery/v0.9/validate-code' \ + -H 'Authorization: Bearer {bearer_token}' \ + -H 'Content-Type: application/json' \ + -d '{ + "code": "84325529-8aa7-4851-8751-5980a7f2d9f7", + "step": "UPDATE_PASSWORD", + "properties": [] + }' +components: + schemas: + User: + type: object + properties: + username: + type: string + realm: + type: string + ResetPasswordRequest: + type: object + properties: + key: + type: string + password: + type: string + properties: + type: array + items: + $ref: '#/components/schemas/Property' + Error: + type: object + properties: + code: + type: string + message: + type: string + description: + type: string + RetryError: + type: object + properties: + code: + type: string + message: + type: string + description: + type: string + key: + type: string + Property: + type: object + properties: + key: + type: string + value: + type: string + RecoveryInitiatingRequest: + type: object + properties: + user: + $ref: '#/components/schemas/User' + properties: + type: array + items: + $ref: '#/components/schemas/Property' + CodeValidationRequest: + type: object + properties: + code: + type: string + step: + type: string + properties: + type: array + items: + $ref: '#/components/schemas/Property' + securitySchemes: + OAuth2: + type: oauth2 + flows: + authorizationCode: + authorizationUrl: https://api.asgardeo.io/t/{root-organization-name}/oauth/authorize + tokenUrl: https://api.asgardeo.io/t/{root-organization-name}/oauth/token + scopes: + read: Grants read access + write: Grants write access + admin: Grants read and write access to administrative information diff --git a/docusaurus-asgardeo/static/apis/organization-apis/restapis/actions.yaml b/docusaurus-asgardeo/static/apis/organization-apis/restapis/actions.yaml new file mode 100644 index 0000000000..80f6f9235a --- /dev/null +++ b/docusaurus-asgardeo/static/apis/organization-apis/restapis/actions.yaml @@ -0,0 +1,1418 @@ +openapi: 3.0.0 +info: + version: v1 + title: Asgardeo - Action Management Rest API + description: > + The Action Management REST API provides a comprehensive interface to manage actions + within the Asgardeo. Actions enable the extension of product functionality + across various workflows, such as password updates, and profile updates. + This API helps developers and administrators to define and manage actions to meet specific + business needs. +servers: + - url: 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1' + variables: + root-organization-name: + default: "{root-organization-name}" +security: + - OAuth2: [] +paths: + /actions/types: + get: + tags: + - Action Types + summary: List Action Types + description: "This API returns the detailed summary of the action types.\n\n + Scope (Permission) required: ``internal_org_action_mgt_view``\n\n" + operationId: getActionTypes + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/ActionTypesResponse' + example: + - type: PRE_UPDATE_PASSWORD + displayName: Pre Update Password + description: This action invokes before updating a user password. + count: 1 + self: "/o/api/server/v1/actions/preUpdatePassword" + - type: PRE_UPDATE_PROFILE + displayName: Pre Update Profile + description: This action invokes before updating a user profile. + count: 1 + self: "/o/api/server/v1/actions/preUpdateProfile" + '401': + description: Unauthorized + '403': + description: Forbidden + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/actions/types' \ + -H 'Authorization: Bearer {bearer_token}' + + /actions/{actionType}: + post: + tags: + - Actions + summary: Add Action + description: "This API creates an action and returns the action details along with the action's unique ID.\n\n + Scope (Permission) required: ``internal_org_action_mgt_create``\n\n" + operationId: createAction + parameters: + - name: actionType + in: path + description: Name of the Action Type. + required: true + schema: + enum: + - preUpdatePassword + - preUpdateProfile + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ActionModel' + examples: + preUpdatePassword: + summary: Sample payload for pre update password action + value: + name: Password Update Action + description: This action invokes before updating a user password. + endpoint: + uri: https://myextension.com/pre-update-password + authentication: + properties: + header: x-api-key + value: e12595c1-1435-4bf2-94e8-445135ab505a + type: API_KEY + passwordSharing: + format: SHA256_HASHED + certificate: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURxRENDQXBDZ0F3SUJBZ0lFWlhCR0NUQU5CZ2txaGtpRzl3MEJBUXNGQURCaU1Rc3dDUVlEVlFRR0V3SlYNClV6RUxNQWtHQTFVRUNBd0NRMEV4RkRBU0JnTlZCQWNNQzFOaGJuUmhJRU5zWVhKaE1RMHdDd1lEVlFRS0RBUlgNClUwOHlNUTB3Q3dZRFZRUUxEQVJYVTA4eU1SSXdFQVlEVlFRRERBbHNiMk5oYkdodmMzUXdIaGNOTWpNeE1qQTINCk1EazFPVE0zV2hjTk1qVXdNVEEzTURrMU9UTTNXakJpTVFzd0NRWURWUVFHRXdKVlV6RUxNQWtHQTFVRUNBd0MNClEwRXhGREFTQmdOVkJBY01DMU5oYm5SaElFTnNZWEpoTVEwd0N3WURWUVFLREFSWFUwOHlNUTB3Q3dZRFZRUUwNCkRBUlhVMDh5TVJJd0VBWURWUVFEREFsc2IyTmhiR2h2YzNRd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUINCkR3QXdnZ0VLQW9JQkFRQ2E0amx3OEtyWHMzOTZTdktmVFEwMkllUm9hWnF1ZWtvSlNpdzBsOWU5QkkyRWF2blQNCkc4SnlvcDh6MnJPcjZDNmpqZGdVeXR6NWpCaG9wYmdmeHJQMmkwTkd1akpGTE5uU1U4cmNoRDJUSjlRbzh0V3YNCmZqQUtDL1VsUnhTb0VyT1RkejdYUzFDY1BmNm9RZk56TVo2QnkyOXpmSVN1QytyV25qTHFUM002ejBGMGIzK20NCm9paVpmUTA1RjAwaHd6U0U5V0JsTCtHUnh3cHlRUVl3c2JHZlordmlJM0VHdjdzUnYreHFwTFBoVzVTTHpoR3oNCnNaaTlDME0wRzFqYnZWMWQrUFkwTVRoRTYwcmthdmpNKytSUkJlc29pNUprblprc0F0OWhPcXhZM0ExSU1kREENCk5wZEtxaGRGMWFBeURYK3ZUWkZySGZMc3VFQmVjNVBwM3RJWEFnTUJBQUdqWmpCa01BNEdBMVVkRHdFQi93UUUNCkF3SUU4REFVQmdOVkhSRUVEVEFMZ2dsc2IyTmhiR2h2YzNRd0hRWURWUjBPQkJZRUZIWFhWMm5sb2ZoaThXd2oNCncwRW9hRlNZbldiU01CMEdBMVVkSlFRV01CUUdDQ3NHQVFVRkJ3TUJCZ2dyQmdFRkJRY0RBakFOQmdrcWhraUcNCjl3MEJBUXNGQUFPQ0FRRUFSZThESThuNzJlVWxReTlHU3BpeXh2OFFVSEZkaVFhMW5CVzluVlRaZHlKb1NYMHENCmg2TjN4Vk5KWFIzL3pMdkw4TUJWTXZqa3QwT1FxdkVpeWp3bkVXTzZEYnhUUnIzdmRmK3J2NVZ3ZGtZbjRNY00NCkt4NHhGOFphZzh4aHlhWXFVUXpRWG5nNTFyVjErYzR1elh1Z0VoRTVTemRESFlFWHpYNmpvWklnMXlOK2hFUGMNCjc3UlpKSkhtd0lRclRkM2JuWnB5dEI2UmRCam5qU3loMEJlSGxKUUdtUHhvbXhZQVMxaFZzelJkZld0cnhEQUINCmZsSUppbUppSGgzZHlrY3lObHJ3QnU5MDNwTWRVR1FHcXNVeUVqaEZkN3M0QXp1cVlISnI1cll5OTUwZGY5SWINCllTaHUyWWZsVkVzV1pxSlI2MkNpYldCY0pLeUhQWW10QzBjU1JRPT0NCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K + attributes: + - http://wso2.org/claims/givenname + - http://wso2.org/claims/dob + rule: + condition: OR + rules: + - condition: AND + expressions: + - field: flow + operator: equals + value: adminInitiatedPasswordReset + - field: flow + operator: notEquals + value: adminInitiatedPasswordUpdate + - condition: AND + expressions: + - field: flow + operator: equals + value: userInitiatedPasswordReset + preUpdateProfile: + summary: Sample payload for pre update profile action + value: + name: Profile Update Action + description: This action invokes before updating a user profile. + endpoint: + uri: https://myextension.com/pre-update-profile + authentication: + properties: + header: x-api-key + value: e12595c1-1435-4bf2-94e8-445135ab505a + type: API_KEY + attributes: + - http://wso2.org/claims/givenname + - http://wso2.org/claims/dob + rule: + condition: OR + rules: + - condition: AND + expressions: + - field: flow + operator: equals + value: adminInitiatedProfileUpdate + - field: claim + operator: notEquals + value: http://wso2.org/claims/country + - condition: AND + expressions: + - field: flow + operator: equals + value: userInitiatedProfileUpdate + description: This represents the information of the action to be created. + required: true + responses: + '201': + description: Action Created + content: + application/json: + schema: + $ref: '#/components/schemas/ActionResponse' + examples: + preUpdatePassword: + summary: Sample response for pre update password action + value: + id: 24f64d17-9824-4e28-8413-de45728d8e84 + name: Password Update Action + description: This action invokes before updating a user password. + status: INACTIVE + createdAt: 2025-08-01T12:00:00Z + updatedAt: 2025-09-01T13:00:00Z + endpoint: + uri: https://myextension.com/pre-update-password + authentication: + type: API_KEY + passwordSharing: + format: SHA256_HASHED + certificate: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURxRENDQXBDZ0F3SUJBZ0lFWlhCR0NUQU5CZ2txaGtpRzl3MEJBUXNGQURCaU1Rc3dDUVlEVlFRR0V3SlYNClV6RUxNQWtHQTFVRUNBd0NRMEV4RkRBU0JnTlZCQWNNQzFOaGJuUmhJRU5zWVhKaE1RMHdDd1lEVlFRS0RBUlgNClUwOHlNUTB3Q3dZRFZRUUxEQVJYVTA4eU1SSXdFQVlEVlFRRERBbHNiMk5oYkdodmMzUXdIaGNOTWpNeE1qQTINCk1EazFPVE0zV2hjTk1qVXdNVEEzTURrMU9UTTNXakJpTVFzd0NRWURWUVFHRXdKVlV6RUxNQWtHQTFVRUNBd0MNClEwRXhGREFTQmdOVkJBY01DMU5oYm5SaElFTnNZWEpoTVEwd0N3WURWUVFLREFSWFUwOHlNUTB3Q3dZRFZRUUwNCkRBUlhVMDh5TVJJd0VBWURWUVFEREFsc2IyTmhiR2h2YzNRd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUINCkR3QXdnZ0VLQW9JQkFRQ2E0amx3OEtyWHMzOTZTdktmVFEwMkllUm9hWnF1ZWtvSlNpdzBsOWU5QkkyRWF2blQNCkc4SnlvcDh6MnJPcjZDNmpqZGdVeXR6NWpCaG9wYmdmeHJQMmkwTkd1akpGTE5uU1U4cmNoRDJUSjlRbzh0V3YNCmZqQUtDL1VsUnhTb0VyT1RkejdYUzFDY1BmNm9RZk56TVo2QnkyOXpmSVN1QytyV25qTHFUM002ejBGMGIzK20NCm9paVpmUTA1RjAwaHd6U0U5V0JsTCtHUnh3cHlRUVl3c2JHZlordmlJM0VHdjdzUnYreHFwTFBoVzVTTHpoR3oNCnNaaTlDME0wRzFqYnZWMWQrUFkwTVRoRTYwcmthdmpNKytSUkJlc29pNUprblprc0F0OWhPcXhZM0ExSU1kREENCk5wZEtxaGRGMWFBeURYK3ZUWkZySGZMc3VFQmVjNVBwM3RJWEFnTUJBQUdqWmpCa01BNEdBMVVkRHdFQi93UUUNCkF3SUU4REFVQmdOVkhSRUVEVEFMZ2dsc2IyTmhiR2h2YzNRd0hRWURWUjBPQkJZRUZIWFhWMm5sb2ZoaThXd2oNCncwRW9hRlNZbldiU01CMEdBMVVkSlFRV01CUUdDQ3NHQVFVRkJ3TUJCZ2dyQmdFRkJRY0RBakFOQmdrcWhraUcNCjl3MEJBUXNGQUFPQ0FRRUFSZThESThuNzJlVWxReTlHU3BpeXh2OFFVSEZkaVFhMW5CVzluVlRaZHlKb1NYMHENCmg2TjN4Vk5KWFIzL3pMdkw4TUJWTXZqa3QwT1FxdkVpeWp3bkVXTzZEYnhUUnIzdmRmK3J2NVZ3ZGtZbjRNY00NCkt4NHhGOFphZzh4aHlhWXFVUXpRWG5nNTFyVjErYzR1elh1Z0VoRTVTemRESFlFWHpYNmpvWklnMXlOK2hFUGMNCjc3UlpKSkhtd0lRclRkM2JuWnB5dEI2UmRCam5qU3loMEJlSGxKUUdtUHhvbXhZQVMxaFZzelJkZld0cnhEQUINCmZsSUppbUppSGgzZHlrY3lObHJ3QnU5MDNwTWRVR1FHcXNVeUVqaEZkN3M0QXp1cVlISnI1cll5OTUwZGY5SWINCllTaHUyWWZsVkVzV1pxSlI2MkNpYldCY0pLeUhQWW10QzBjU1JRPT0NCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K + attributes: + - http://wso2.org/claims/givenname + - http://wso2.org/claims/dob + rule: + condition: OR + rules: + - condition: AND + expressions: + - field: flow + operator: equals + value: adminInitiatedPasswordReset + - field: flow + operator: notEquals + value: adminInitiatedPasswordUpdate + - condition: AND + expressions: + - field: flow + operator: equals + value: userInitiatedPasswordReset + preUpdateProfile: + summary: Sample response for pre update profile action + value: + id: 24f64d17-9824-4e28-8413-de45728d8e84 + name: Profile Update Action + description: This action invokes before updating a user profile. + status: INACTIVE + createdAt: 2025-08-01T12:00:00Z + updatedAt: 2025-09-01T13:00:00Z + endpoint: + uri: https://myextension.com/pre-update-profile + authentication: + type: API_KEY + attributes: + - http://wso2.org/claims/givenname + - http://wso2.org/claims/dob + rule: + condition: OR + rules: + - condition: AND + expressions: + - field: flow + operator: equals + value: adminInitiatedProfileUpdate + - field: claim + operator: notEquals + value: http://wso2.org/claims/country + - condition: AND + expressions: + - field: flow + operator: equals + value: userInitiatedProfileUpdate + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '501': + description: Not Implemented + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl - preUpdatePassword + source: | + curl --location 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/actions/preUpdatePassword' \ + -H 'Authorization: Bearer {bearer_token}' \ + -H 'Content-Type: application/json' \ + -d '{ + "name": "Password Update Action", + "description": "This action invokes before updating a user password.", + "endpoint": { + "uri": "https://myextension.com/pre-update-password", + "authentication": { + "properties": { + "header": "x-api-key", + "value": "e12595c1-1435-4bf2-94e8-445135ab505a" + }, + "type": "API_KEY" + } + }, + "passwordSharing": { + "format": "SHA256_HASHED" + }, + "attributes": ["http://wso2.org/claims/givenname", "http://wso2.org/claims/dob"] + }' + - lang: Curl - preUpdateProfile + source: | + curl --location 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/actions/preUpdateProfile' \ + -H 'Authorization: Bearer {bearer_token}' \ + -H 'Content-Type: application/json' \ + -d '{ + "name": "Profile Update Action", + "description": "This action invokes before updating a user profile.", + "endpoint": { + "uri": "https://myextension.com/pre-update-profile", + "authentication": { + "properties": { + "header": "x-api-key", + "value": "e12595c1-1435-4bf2-94e8-445135ab505a" + }, + "type": "API_KEY" + } + }, + "attributes": ["http://wso2.org/claims/givenname", "http://wso2.org/claims/dob"] + }' + x-codegen-request-body-name: body + + get: + tags: + - Actions + summary: List Actions + description: "This API returns actions according to the action type. \n\n + Scope (Permission) required: ``internal_org_action_mgt_view``\n\n" + operationId: getActionsByActionType + parameters: + - name: actionType + in: path + description: Name of the Action Type. + required: true + schema: + enum: + - preUpdatePassword + - preUpdateProfile + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/ActionResponseList' + examples: + preUpdatePassword: + summary: Sample response for pre update password action + value: + - id: 24f64d17-9824-4e28-8413-de45728d8e84 + type: PRE_UPDATE_PASSWORD + name: Password Update Action + description: This action invokes before updating a user password. + status: ACTIVE + createdAt: 2025-08-01T12:00:00Z + updatedAt: 2025-09-01T13:00:00Z + links: + - href: "/o/api/server/v1/actions/preUpdatePassword/24f64d17-9824-4e28-8413-de45728d8e84" + method: GET + rel: self + preUpdateProfile: + summary: Sample response for pre update profile action + value: + - id: 24f64d17-9824-4e28-8413-de45728d8e84 + type: PRE_UPDATE_PROFILE + name: Profile Update Action + description: This action invokes before updating a user profile. + status: ACTIVE + createdAt: 2025-08-01T12:00:00Z + updatedAt: 2025-09-01T13:00:00Z + links: + - href: "/o/api/server/v1/actions/preUpdateProfile/24f64d17-9824-4e28-8413-de45728d8e84" + method: GET + rel: self + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '501': + description: Not Implemented + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/actions/{actionType}' \ + -H 'Authorization: Bearer {bearer_token}' + + /actions/{actionType}/{actionId}: + get: + tags: + - Actions + operationId: getActionByActionId + summary: Retrieve Action by ID + description: "This API provides the capability to retrieve the action by action Id. \n\n + Scope (Permission) required: ``internal_org_action_mgt_view``\n\n" + parameters: + - name: actionType + in: path + description: Name of the Action Type. + required: true + schema: + enum: + - preUpdatePassword + - preUpdateProfile + - name: actionId + in: path + description: Unique identifier of the action. + required: true + schema: + type: string + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/ActionResponse' + examples: + preUpdatePassword: + summary: Sample response for pre update password action + value: + id: 24f64d17-9824-4e28-8413-de45728d8e84 + type: PRE_UPDATE_PASSWORD + name: Password Update Action + description: This action invokes before updating a user password. + status: ACTIVE + createdAt: 2025-08-01T12:00:00Z + updatedAt: 2025-09-01T13:00:00Z + endpoint: + uri: https://myextension.com/pre-update-password + authentication: + type: API_KEY + passwordSharing: + format: SHA256_HASHED + certificate: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURxRENDQXBDZ0F3SUJBZ0lFWlhCR0NUQU5CZ2txaGtpRzl3MEJBUXNGQURCaU1Rc3dDUVlEVlFRR0V3SlYNClV6RUxNQWtHQTFVRUNBd0NRMEV4RkRBU0JnTlZCQWNNQzFOaGJuUmhJRU5zWVhKaE1RMHdDd1lEVlFRS0RBUlgNClUwOHlNUTB3Q3dZRFZRUUxEQVJYVTA4eU1SSXdFQVlEVlFRRERBbHNiMk5oYkdodmMzUXdIaGNOTWpNeE1qQTINCk1EazFPVE0zV2hjTk1qVXdNVEEzTURrMU9UTTNXakJpTVFzd0NRWURWUVFHRXdKVlV6RUxNQWtHQTFVRUNBd0MNClEwRXhGREFTQmdOVkJBY01DMU5oYm5SaElFTnNZWEpoTVEwd0N3WURWUVFLREFSWFUwOHlNUTB3Q3dZRFZRUUwNCkRBUlhVMDh5TVJJd0VBWURWUVFEREFsc2IyTmhiR2h2YzNRd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUINCkR3QXdnZ0VLQW9JQkFRQ2E0amx3OEtyWHMzOTZTdktmVFEwMkllUm9hWnF1ZWtvSlNpdzBsOWU5QkkyRWF2blQNCkc4SnlvcDh6MnJPcjZDNmpqZGdVeXR6NWpCaG9wYmdmeHJQMmkwTkd1akpGTE5uU1U4cmNoRDJUSjlRbzh0V3YNCmZqQUtDL1VsUnhTb0VyT1RkejdYUzFDY1BmNm9RZk56TVo2QnkyOXpmSVN1QytyV25qTHFUM002ejBGMGIzK20NCm9paVpmUTA1RjAwaHd6U0U5V0JsTCtHUnh3cHlRUVl3c2JHZlordmlJM0VHdjdzUnYreHFwTFBoVzVTTHpoR3oNCnNaaTlDME0wRzFqYnZWMWQrUFkwTVRoRTYwcmthdmpNKytSUkJlc29pNUprblprc0F0OWhPcXhZM0ExSU1kREENCk5wZEtxaGRGMWFBeURYK3ZUWkZySGZMc3VFQmVjNVBwM3RJWEFnTUJBQUdqWmpCa01BNEdBMVVkRHdFQi93UUUNCkF3SUU4REFVQmdOVkhSRUVEVEFMZ2dsc2IyTmhiR2h2YzNRd0hRWURWUjBPQkJZRUZIWFhWMm5sb2ZoaThXd2oNCncwRW9hRlNZbldiU01CMEdBMVVkSlFRV01CUUdDQ3NHQVFVRkJ3TUJCZ2dyQmdFRkJRY0RBakFOQmdrcWhraUcNCjl3MEJBUXNGQUFPQ0FRRUFSZThESThuNzJlVWxReTlHU3BpeXh2OFFVSEZkaVFhMW5CVzluVlRaZHlKb1NYMHENCmg2TjN4Vk5KWFIzL3pMdkw4TUJWTXZqa3QwT1FxdkVpeWp3bkVXTzZEYnhUUnIzdmRmK3J2NVZ3ZGtZbjRNY00NCkt4NHhGOFphZzh4aHlhWXFVUXpRWG5nNTFyVjErYzR1elh1Z0VoRTVTemRESFlFWHpYNmpvWklnMXlOK2hFUGMNCjc3UlpKSkhtd0lRclRkM2JuWnB5dEI2UmRCam5qU3loMEJlSGxKUUdtUHhvbXhZQVMxaFZzelJkZld0cnhEQUINCmZsSUppbUppSGgzZHlrY3lObHJ3QnU5MDNwTWRVR1FHcXNVeUVqaEZkN3M0QXp1cVlISnI1cll5OTUwZGY5SWINCllTaHUyWWZsVkVzV1pxSlI2MkNpYldCY0pLeUhQWW10QzBjU1JRPT0NCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K + attributes: + - http://wso2.org/claims/givenname + - http://wso2.org/claims/dob + rule: + condition: OR + rules: + - condition: AND + expressions: + - field: flow + operator: equals + value: adminInitiatedPasswordReset + - field: flow + operator: notEquals + value: adminInitiatedPasswordUpdate + - condition: AND + expressions: + - field: flow + operator: equals + value: userInitiatedPasswordReset + preUpdateProfile: + summary: Sample response for pre update profile action + value: + id: 24f64d17-9824-4e28-8413-de45728d8e84 + type: PRE_UPDATE_PROFILE + name: Profile Update Action + description: This action invokes before updating a user profile. + status: ACTIVE + createdAt: 2025-08-01T12:00:00Z + updatedAt: 2025-09-01T13:00:00Z + endpoint: + uri: https://myextension.com/pre-update-profile + authentication: + type: API_KEY + attributes: + - http://wso2.org/claims/givenname + - http://wso2.org/claims/dob + rule: + condition: OR + rules: + - condition: AND + expressions: + - field: flow + operator: equals + value: adminInitiatedProfileUpdate + - field: claim + operator: notEquals + value: http://wso2.org/claims/country + - condition: AND + expressions: + - field: flow + operator: equals + value: userInitiatedProfileUpdate + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '501': + description: Not Implemented + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/actions/{actionType}/{actionId}' \ + -H 'Authorization: Bearer {bearer_token}' + patch: + tags: + - Actions + summary: Update Action + description: "This API updates an action and return the updated action. \n\n + Scope (Permission) required: ``internal_org_action_mgt_update``\n\n" + operationId: updateAction + parameters: + - name: actionType + in: path + description: Name of the Action Type. + required: true + schema: + enum: + - preUpdatePassword + - preUpdateProfile + - name: actionId + in: path + description: Unique identifier of the action. + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ActionUpdateModel' + examples: + preUpdatePassword: + summary: Sample payload for pre update password action update + value: + name: Updated Password Update Action + description: This action invokes before updating a user password. + endpoint: + uri: https://myextension.com/external/pre-update-password + authentication: + properties: {} + type: NONE + passwordSharing: + format: PLAIN_TEXT + certificate: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURxRENDQXBDZ0F3SUJBZ0lFWlhCR0NUQU5CZ2txaGtpRzl3MEJBUXNGQURCaU1Rc3dDUVlEVlFRR0V3SlYNClV6RUxNQWtHQTFVRUNBd0NRMEV4RkRBU0JnTlZCQWNNQzFOaGJuUmhJRU5zWVhKaE1RMHdDd1lEVlFRS0RBUlgNClUwOHlNUTB3Q3dZRFZRUUxEQVJYVTA4eU1SSXdFQVlEVlFRRERBbHNiMk5oYkdodmMzUXdIaGNOTWpNeE1qQTINCk1EazFPVE0zV2hjTk1qVXdNVEEzTURrMU9UTTNXakJpTVFzd0NRWURWUVFHRXdKVlV6RUxNQWtHQTFVRUNBd0MNClEwRXhGREFTQmdOVkJBY01DMU5oYm5SaElFTnNZWEpoTVEwd0N3WURWUVFLREFSWFUwOHlNUTB3Q3dZRFZRUUwNCkRBUlhVMDh5TVJJd0VBWURWUVFEREFsc2IyTmhiR2h2YzNRd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUINCkR3QXdnZ0VLQW9JQkFRQ2E0amx3OEtyWHMzOTZTdktmVFEwMkllUm9hWnF1ZWtvSlNpdzBsOWU5QkkyRWF2blQNCkc4SnlvcDh6MnJPcjZDNmpqZGdVeXR6NWpCaG9wYmdmeHJQMmkwTkd1akpGTE5uU1U4cmNoRDJUSjlRbzh0V3YNCmZqQUtDL1VsUnhTb0VyT1RkejdYUzFDY1BmNm9RZk56TVo2QnkyOXpmSVN1QytyV25qTHFUM002ejBGMGIzK20NCm9paVpmUTA1RjAwaHd6U0U5V0JsTCtHUnh3cHlRUVl3c2JHZlordmlJM0VHdjdzUnYreHFwTFBoVzVTTHpoR3oNCnNaaTlDME0wRzFqYnZWMWQrUFkwTVRoRTYwcmthdmpNKytSUkJlc29pNUprblprc0F0OWhPcXhZM0ExSU1kREENCk5wZEtxaGRGMWFBeURYK3ZUWkZySGZMc3VFQmVjNVBwM3RJWEFnTUJBQUdqWmpCa01BNEdBMVVkRHdFQi93UUUNCkF3SUU4REFVQmdOVkhSRUVEVEFMZ2dsc2IyTmhiR2h2YzNRd0hRWURWUjBPQkJZRUZIWFhWMm5sb2ZoaThXd2oNCncwRW9hRlNZbldiU01CMEdBMVVkSlFRV01CUUdDQ3NHQVFVRkJ3TUJCZ2dyQmdFRkJRY0RBakFOQmdrcWhraUcNCjl3MEJBUXNGQUFPQ0FRRUFSZThESThuNzJlVWxReTlHU3BpeXh2OFFVSEZkaVFhMW5CVzluVlRaZHlKb1NYMHENCmg2TjN4Vk5KWFIzL3pMdkw4TUJWTXZqa3QwT1FxdkVpeWp3bkVXTzZEYnhUUnIzdmRmK3J2NVZ3ZGtZbjRNY00NCkt4NHhGOFphZzh4aHlhWXFVUXpRWG5nNTFyVjErYzR1elh1Z0VoRTVTemRESFlFWHpYNmpvWklnMXlOK2hFUGMNCjc3UlpKSkhtd0lRclRkM2JuWnB5dEI2UmRCam5qU3loMEJlSGxKUUdtUHhvbXhZQVMxaFZzelJkZld0cnhEQUINCmZsSUppbUppSGgzZHlrY3lObHJ3QnU5MDNwTWRVR1FHcXNVeUVqaEZkN3M0QXp1cVlISnI1cll5OTUwZGY5SWINCllTaHUyWWZsVkVzV1pxSlI2MkNpYldCY0pLeUhQWW10QzBjU1JRPT0NCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K + attributes: + - http://wso2.org/claims/dob + rule: + condition: OR + rules: + - condition: AND + expressions: + - field: flow + operator: equals + value: userInitiatedPasswordReset + - field: flow + operator: notEquals + value: adminInitiatedPasswordUpdate + preUpdateProfile: + summary: Sample payload for pre update profile action update + value: + name: Updated Profile Update Action + description: This action invokes before updating a user profile. + endpoint: + uri: https://myextension.com/external/pre-update-profile + authentication: + properties: {} + type: NONE + attributes: + - http://wso2.org/claims/dob + rule: + condition: OR + rules: + - condition: AND + expressions: + - field: flow + operator: equals + value: userInitiatedProfileUpdate + - field: claim + operator: notEquals + value: http://wso2.org/claims/postalcode + description: This represents the action to be updated. + required: true + responses: + '200': + description: Action Updated + content: + application/json: + schema: + $ref: '#/components/schemas/ActionResponse' + examples: + preUpdatePassword: + summary: Sample response for pre update password action + value: + id: 24f64d17-9824-4e28-8413-de45728d8e84 + name: Updated Password Update Action + description: This action invokes before updating a user password. + status: ACTIVE + createdAt: 2025-08-01T12:00:00Z + updatedAt: 2025-09-01T13:00:00Z + endpoint: + uri: https://myextension.com/external/pre-update-password + authentication: + type: NONE + passwordSharing: + format: PLAIN_TEXT + certificate: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURxRENDQXBDZ0F3SUJBZ0lFWlhCR0NUQU5CZ2txaGtpRzl3MEJBUXNGQURCaU1Rc3dDUVlEVlFRR0V3SlYNClV6RUxNQWtHQTFVRUNBd0NRMEV4RkRBU0JnTlZCQWNNQzFOaGJuUmhJRU5zWVhKaE1RMHdDd1lEVlFRS0RBUlgNClUwOHlNUTB3Q3dZRFZRUUxEQVJYVTA4eU1SSXdFQVlEVlFRRERBbHNiMk5oYkdodmMzUXdIaGNOTWpNeE1qQTINCk1EazFPVE0zV2hjTk1qVXdNVEEzTURrMU9UTTNXakJpTVFzd0NRWURWUVFHRXdKVlV6RUxNQWtHQTFVRUNBd0MNClEwRXhGREFTQmdOVkJBY01DMU5oYm5SaElFTnNZWEpoTVEwd0N3WURWUVFLREFSWFUwOHlNUTB3Q3dZRFZRUUwNCkRBUlhVMDh5TVJJd0VBWURWUVFEREFsc2IyTmhiR2h2YzNRd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUINCkR3QXdnZ0VLQW9JQkFRQ2E0amx3OEtyWHMzOTZTdktmVFEwMkllUm9hWnF1ZWtvSlNpdzBsOWU5QkkyRWF2blQNCkc4SnlvcDh6MnJPcjZDNmpqZGdVeXR6NWpCaG9wYmdmeHJQMmkwTkd1akpGTE5uU1U4cmNoRDJUSjlRbzh0V3YNCmZqQUtDL1VsUnhTb0VyT1RkejdYUzFDY1BmNm9RZk56TVo2QnkyOXpmSVN1QytyV25qTHFUM002ejBGMGIzK20NCm9paVpmUTA1RjAwaHd6U0U5V0JsTCtHUnh3cHlRUVl3c2JHZlordmlJM0VHdjdzUnYreHFwTFBoVzVTTHpoR3oNCnNaaTlDME0wRzFqYnZWMWQrUFkwTVRoRTYwcmthdmpNKytSUkJlc29pNUprblprc0F0OWhPcXhZM0ExSU1kREENCk5wZEtxaGRGMWFBeURYK3ZUWkZySGZMc3VFQmVjNVBwM3RJWEFnTUJBQUdqWmpCa01BNEdBMVVkRHdFQi93UUUNCkF3SUU4REFVQmdOVkhSRUVEVEFMZ2dsc2IyTmhiR2h2YzNRd0hRWURWUjBPQkJZRUZIWFhWMm5sb2ZoaThXd2oNCncwRW9hRlNZbldiU01CMEdBMVVkSlFRV01CUUdDQ3NHQVFVRkJ3TUJCZ2dyQmdFRkJRY0RBakFOQmdrcWhraUcNCjl3MEJBUXNGQUFPQ0FRRUFSZThESThuNzJlVWxReTlHU3BpeXh2OFFVSEZkaVFhMW5CVzluVlRaZHlKb1NYMHENCmg2TjN4Vk5KWFIzL3pMdkw4TUJWTXZqa3QwT1FxdkVpeWp3bkVXTzZEYnhUUnIzdmRmK3J2NVZ3ZGtZbjRNY00NCkt4NHhGOFphZzh4aHlhWXFVUXpRWG5nNTFyVjErYzR1elh1Z0VoRTVTemRESFlFWHpYNmpvWklnMXlOK2hFUGMNCjc3UlpKSkhtd0lRclRkM2JuWnB5dEI2UmRCam5qU3loMEJlSGxKUUdtUHhvbXhZQVMxaFZzelJkZld0cnhEQUINCmZsSUppbUppSGgzZHlrY3lObHJ3QnU5MDNwTWRVR1FHcXNVeUVqaEZkN3M0QXp1cVlISnI1cll5OTUwZGY5SWINCllTaHUyWWZsVkVzV1pxSlI2MkNpYldCY0pLeUhQWW10QzBjU1JRPT0NCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K + attributes: + - http://wso2.org/claims/dob + rule: + condition: OR + rules: + - condition: AND + expressions: + - field: flow + operator: equals + value: userInitiatedPasswordReset + - field: flow + operator: notEquals + value: adminInitiatedPasswordUpdate + preUpdateProfile: + summary: Sample response for pre update profile action + value: + id: 24f64d17-9824-4e28-8413-de45728d8e84 + name: Updated Profile Update Action + description: This action invokes before updating a user profile. + status: ACTIVE + createdAt: 2025-08-01T12:00:00Z + updatedAt: 2025-09-01T13:00:00Z + endpoint: + uri: https://myextension.com/external/pre-update-profile + authentication: + type: NONE + attributes: + - http://wso2.org/claims/dob + rule: + condition: OR + rules: + - condition: AND + expressions: + - field: flow + operator: equals + value: userInitiatedProfileUpdate + - field: claim + operator: notEquals + value: http://wso2.org/claims/postalcode + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '501': + description: Not Implemented + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl - preUpdatePassword + source: | + curl --location --request PATCH 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/actions/preUpdatePassword/{actionId}' \ + -H 'Content-Type: application/json' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "name": "Updated Password Update Action", + "description": "This is the configuration of pre-action for updating password", + "endpoint": { + "uri": "http://myextensions.com/external/pre-update-password", + "authentication": { + "type": "NONE", + "properties": {} + } + }, + "passwordSharing": { + "format": "PLAIN_TEXT" + }, + "attributes": ["http://wso2.org/claims/dob"] + }' + - lang: Curl - preUpdateProfile + source: | + curl --location --request PATCH 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/actions/preUpdateProfile/{actionId}' \ + -H 'Content-Type: application/json' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "name": "Updated Profile Update Action", + "description": "This is the configuration of pre-action for updating profile", + "endpoint": { + "uri": "http://myextensions.com/external/pre-update-profile", + "authentication": { + "type": "NONE", + "properties": {} + } + }, + "attributes": ["http://wso2.org/claims/dob"] + }' + x-codegen-request-body-name: body + + delete: + tags: + - Actions + summary: Delete Action + description: "This API deletes an action using the action's type and unique ID. \n\n + Scope (Permission) required: ``internal_org_action_mgt_delete``\n\n" + operationId: deleteAction + parameters: + - name: actionType + in: path + description: Name of the Action Type. + required: true + schema: + enum: + - preUpdatePassword + - preUpdateProfile + - name: actionId + in: path + description: Unique identifier of the action. + required: true + schema: + type: string + responses: + '204': + description: Action Deleted + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '501': + description: Not Implemented + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location --request DELETE 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/actions/{actionType}/{actionId}' \ + -H 'Authorization: Bearer {bearer_token}' + + /actions/{actionType}/{actionId}/activate: + post: + tags: + - Actions + summary: Activate Action + description: "This API activates an action using the action's type and unique ID. \n\n + Scope (Permission) required: ``internal_org_action_mgt_update``\n\n" + operationId: activateAction + parameters: + - name: actionType + in: path + description: Name of the Action Type. + required: true + schema: + enum: + - preUpdatePassword + - preUpdateProfile + - name: actionId + in: path + description: Unique identifier of the action. + required: true + schema: + type: string + responses: + '200': + description: Action Activated + content: + application/json: + schema: + $ref: '#/components/schemas/ActionBasicResponse' + examples: + preUpdatePassword: + summary: Sample response for pre update password action + value: + - id: 24f64d17-9824-4e28-8413-de45728d8e84 + type: PRE_UPDATE_PASSWORD + name: Password Update Action + description: This action invokes before updating a user password. + status: ACTIVE + createdAt: 2025-08-01T12:00:00Z + updatedAt: 2025-09-01T13:00:00Z + links: + - href: "/o/api/server/v1/actions/preUpdatePassword/24f64d17-9824-4e28-8413-de45728d8e84" + method: GET + rel: self + preUpdateProfile: + summary: Sample response for pre update profile action + value: + - id: 24f64d17-9824-4e28-8413-de45728d8e84 + type: PRE_UPDATE_PROFILE + name: Profile Update Action + description: This action invokes before updating a user profile. + status: ACTIVE + createdAt: 2025-08-01T12:00:00Z + updatedAt: 2025-09-01T13:00:00Z + links: + - href: "/o/api/server/v1/actions/preUpdateProfile/24f64d17-9824-4e28-8413-de45728d8e84" + method: GET + rel: self + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '501': + description: Not Implemented + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location --request POST 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/actions/{actionType}/{actionId}/activate' \ + -H 'Authorization: Bearer {bearer_token}' + + /actions/{actionType}/{actionId}/deactivate: + post: + tags: + - Actions + summary: Deactivate Action + description: "This API deactivates an action using the action's type and unique ID. \n\n + Scope (Permission) required: ``internal_org_action_mgt_update``\n\n" + operationId: deactivateAction + parameters: + - name: actionType + in: path + description: Name of the Action Type. + required: true + schema: + enum: + - preUpdatePassword + - preUpdateProfile + - name: actionId + in: path + description: Unique identifier of the action. + required: true + schema: + type: string + responses: + '200': + description: Action Deactivated + content: + application/json: + schema: + $ref: '#/components/schemas/ActionBasicResponse' + examples: + preUpdatePassword: + summary: Sample response for pre update password action + value: + - id: 24f64d17-9824-4e28-8413-de45728d8e84 + type: PRE_UPDATE_PASSWORD + name: Password Update Action + description: This action invokes before updating a user password. + status: INACTIVE + createdAt: 2025-08-01T12:00:00Z + updatedAt: 2025-09-01T13:00:00Z + links: + - href: "/o/api/server/v1/actions/preUpdatePassword/24f64d17-9824-4e28-8413-de45728d8e84" + method: GET + rel: self + preUpdateProfile: + summary: Sample response for pre update profile action + value: + - id: 24f64d17-9824-4e28-8413-de45728d8e84 + type: PRE_UPDATE_PROFILE + name: Profile Update Action + description: This action invokes before updating a user profile. + status: INACTIVE + createdAt: 2025-08-01T12:00:00Z + updatedAt: 2025-09-01T13:00:00Z + links: + - href: "/o/api/server/v1/actions/preUpdateProfile/24f64d17-9824-4e28-8413-de45728d8e84" + method: GET + rel: self + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '501': + description: Not Implemented + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location --request POST 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/actions/{actionType}/{actionId}/deactivate' \ + -H 'Authorization: Bearer {bearer_token}' + +components: + securitySchemes: + OAuth2: + type: oauth2 + flows: + authorizationCode: + authorizationUrl: 'https://api.asgardeo.io/t/{root-organization-name}/oauth2/authorize' + tokenUrl: 'http://api.asgardeo.io/t/{root-organization-name}/oauth2/token' + scopes: + read: internal_org_action_mgt_view + write: internal_org_action_mgt_create + update: internal_org_action_mgt_update + delete: internal_org_action_mgt_delete + + schemas: + ActionType: + type: string + description: Action types supported. + enum: + - PRE_UPDATE_PASSWORD + - PRE_UPDATE_PROFILE + ActionModel: + type: object + required: + - name + - endpoint + properties: + name: + type: string + minLength: 1 + maxLength: 255 + description: Name of the action. + example: Pre Update Password Action + description: + type: string + maxLength: 255 + description: Description of the action. + example: This action invokes before setting/updating a user password. + endpoint: + $ref: '#/components/schemas/Endpoint' + rule: + $ref: '#/components/schemas/ORRule' + + Endpoint: + type: object + description: Endpoint configurations of the action. + required: + - uri + - authentication + properties: + uri: + type: string + description: HTTPS URI of the endpoint. + pattern: '^https?://.+' + example: https://myextension.com/token + authentication: + $ref: '#/components/schemas/AuthenticationType' + allowedHeaders: + type: array + description: List of HTTP headers to forward to the extension. + items: + type: string + example: [ "x-geo-location", "host"] + allowedParameters: + type: array + description: List of parameters to forward to the extension. + items: + type: string + example: [ "device-id"] + + EndpointResponse: + type: object + description: Endpoint configurations of the action. + required: + - uri + - authentication + properties: + uri: + type: string + description: HTTPS URI of the endpoint. + pattern: '^https?://.+' + example: https://myextension.com/token + authentication: + $ref: '#/components/schemas/AuthenticationTypeResponse' + allowedHeaders: + type: array + description: List of HTTP headers to forward to the extension. + items: + type: string + example: [ "x-geo-location", "host" ] + allowedParameters: + type: array + description: List of parameters to forward to the extension. + items: + type: string + example: [ "device-id" ] + + ActionResponse: + type: object + properties: + id: + type: string + example: '24f64d17-9824-4e28-8413-de45728d8e84' + description: Unique identifier of the action. + type: + $ref: '#/components/schemas/ActionType' + name: + type: string + minLength: 1 + maxLength: 255 + description: Name of the action. + example: Pre Update Password Action + description: + type: string + maxLength: 255 + description: Description of the action. + example: This action invokes before setting/updating a user password. + status: + type: string + enum: + - ACTIVE + - INACTIVE + description: Status of the action. + example: ACTIVE + createdAt: + type: string + description: Created time of the action. + example: "2025-08-01T12:00:00Z" + updatedAt: + type: string + description: Last updated time of the action. + example: "2025-09-01T13:00:00Z" + endpoint: + $ref: '#/components/schemas/EndpointResponse' + rule: + $ref: '#/components/schemas/ORRuleResponse' + + ActionBasicResponse: + type: object + properties: + id: + type: string + example: '24f64d17-9824-4e28-8413-de45728d8e84' + description: Unique identifier of the action. + type: + $ref: '#/components/schemas/ActionType' + name: + type: string + minLength: 1 + maxLength: 255 + description: Name of the action. + example: Pre Update Password Action + description: + type: string + maxLength: 255 + description: Description of the action. + example: This action invokes before setting/updating a user password. + status: + type: string + enum: + - ACTIVE + - INACTIVE + description: Status of the action. + createdAt: + type: string + description: Created time of the action. + example: "2025-08-01T12:00:00Z" + updatedAt: + type: string + description: Last updated time of the action. + example: "2025-09-01T13:00:00Z" + links: + type: array + items: + $ref: '#/components/schemas/Link' + example: + - href: "/o/api/server/v1/actions/preIssueAccessToken/24f64d17-9824-4e28-8413-de45728d8e84" + method: GET + rel: self + + Link: + type: object + properties: + href: + type: string + description: Url of the endpoint. + method: + type: string + enum: + - GET + description: Http method. + rel: + type: string + description: Relation to the resource. + + ActionResponseList: + type: array + items: + $ref: '#/components/schemas/ActionBasicResponse' + + ActionTypesResponse: + type: array + items: + $ref: '#/components/schemas/ActionTypesResponseItem' + + ActionTypesResponseItem: + type: object + properties: + type: + $ref: '#/components/schemas/ActionType' + displayName: + type: string + description: "Display name of the action type." + example: "Pre Update Password." + description: + type: string + description: "Description of the action type." + example: "Extension point configuration for Pre Update Password." + count: + type: integer + description: "Number of actions configured under the action type." + example: 1 + self: + type: string + description: "API endpoint referring to the location of the given action type." + example: "/o/api/server/v1/actions/preUpdatePassword/24f64d17-9824-4e28-8413-de45728d8e84" + + AuthenticationType: + type: object + description: > + The type of authentication required by the action's endpoint. The following options are supported: + + - NONE: No authentication is required.
    + ``{ + "type": "NONE" + }`` + + - BASIC: Basic authentication with a username and password.
    + ``{ + "type": "BASIC", + "properties": { + "username": "auth_username", + "password": "auth_password" + } + }`` + + - API_KEY: API key-based authentication, where the key is provided in an HTTP header.
    + ``{ + "type": "API_KEY", + "properties": { + "header": "X-API-Key", + "value": "12345-abcde-67890" + } + }`` + + - BEARER: Bearer token-based authentication.
    + ``{ + "type": "BEARER", + "properties": { + "accessToken": "0d6fed02-eac0-332b-8998-213a543139a0" + } + }`` + required: + - type + properties: + type: + type: string + enum: + - NONE + - BEARER + - API_KEY + - BASIC + example: BASIC + properties: + type: object + description: Authentication properties specific to the selected type. + additionalProperties: true + example: + type: BASIC + properties: + username: "auth_username" + password: "auth_password" + + AuthenticationTypeResponse: + type: object + description: Authentication configurations of the action. + required: + - type + properties: + type: + type: string + enum: + - NONE + - BEARER + - API_KEY + - BASIC + description: Type of the authentication. + example: BASIC + + ActionUpdateModel: + type: object + properties: + name: + type: string + minLength: 1 + maxLength: 255 + description: Updating name of the action. + example: Pre Issue Access Token Action + description: + type: string + maxLength: 255 + description: Updating description of the action. + example: This action invokes before issuing an access token. + endpoint: + $ref: '#/components/schemas/EndpointUpdateModel' + rule: + $ref: '#/components/schemas/ORRule' + + EndpointUpdateModel: + type: object + description: Updating endpoint configurations of the action. + properties: + uri: + type: string + pattern: '^https?://.+' + description: Updating HTTPS URI of the endpoint. + example: https://myextension.com/token + authentication: + $ref: '#/components/schemas/AuthenticationType' + allowedHeaders: + type: array + description: List of HTTP headers to forward to the extension. + items: + type: string + example: [ "x-geo-location", "host" ] + allowedParameters: + type: array + description: List of parameters to forward to the extension. + items: + type: string + example: [ "device-id" ] + + ORRule: + type: object + description: Represents a rule configuration that combines multiple sub-rules with an OR condition. + If any of the sub-rules evaluate to true, the ORRule is considered satisfied. + properties: + condition: + type: string + description: The logical condition for combining the sub-rules. For ORRule, the value + must always be "OR". + enum: ["OR"] + rules: + type: array + items: + $ref: '#/components/schemas/ANDRule' + minItems: 1 + + ORRuleResponse: + type: object + description: Rule configured for the action. + properties: + condition: + type: string + enum: ["OR"] + rules: + type: array + items: + $ref: '#/components/schemas/ANDRuleResponse' + description: A list of sub-rules that are combined using the OR condition. Each sub-rule is an ANDRule. + minItems: 1 + + ANDRule: + type: object + description: A sub-rule that combines expressions with AND condition. + required: + - condition + - expressions + properties: + condition: + type: string + enum: ["AND"] + description: The logical condition for combining the expressions. For ANDRule, the value must always be "AND". + expressions: + type: array + items: + $ref: '#/components/schemas/Expression' + minItems: 1 + description: A list of expressions that are combined using the AND condition. All expressions must evaluate to true for the ANDRule to pass. + + ANDRuleResponse: + type: object + description: Represents a rule configuration that combines multiple expressions with an AND condition. All expressions in the ANDRule must evaluate to true for the rule to be satisfied. + properties: + condition: + type: string + enum: ["AND"] + description: The logical condition for combining the expressions. For ANDRule, the value must always be "AND". + expressions: + type: array + items: + $ref: '#/components/schemas/ExpressionResponse' + minItems: 1 + description: A list of expressions that are combined using the AND condition. All expressions must evaluate to true for the ANDRule to pass. + + Expression: + type: object + description: Represents a single logical condition or comparison within a rule. An expression defines a field, an operator, and a value that is evaluated. + required: + - field + - operator + - value + properties: + field: + type: string + description: The field or attribute of the entity being evaluated (e.g.,application, role). + example: application + operator: + type: string + description: The comparison operator used to evaluate the field and value. Common operators include "equals", "contains", "startsWith", etc. + example: equals + value: + type: string + description: The value that the field is compared against based on the operator. + example: myapp + + ExpressionResponse: + type: object + description: Expressions in the rule. + properties: + field: + type: string + example: application + operator: + type: string + example: equals + value: + type: string + example: myapp + + Error: + type: object + properties: + code: + type: string + example: AAA-00000 + message: + type: string + example: Some error message. + description: + type: string + example: Some error description. + traceId: + type: string + example: e0fbcfeb-3617-43c4-8dd0-7b7d38e13047 diff --git a/docusaurus-asgardeo/static/apis/organization-apis/restapis/api-resources.yaml b/docusaurus-asgardeo/static/apis/organization-apis/restapis/api-resources.yaml new file mode 100644 index 0000000000..ace4944daa --- /dev/null +++ b/docusaurus-asgardeo/static/apis/organization-apis/restapis/api-resources.yaml @@ -0,0 +1,779 @@ +openapi: 3.0.0 +info: + description: > + This document explains the RESTful API for API Resource Management in Asgardeo. + version: "v1" + title: Asgardeo - API Resource Management Rest API + +security: + - OAuth2: [] + +servers: + - url: 'https://api.asgardeo.io/t/{organization-name}/o/api/server/v1' + +paths: + /api-resources: + get: + tags: + - API Resources + summary: List all API resources in the server + description: | + List all API resources in the server + + Scope(Permission) required: `internal_org_api_resource_view` + operationId: getAPIResources + parameters: + - $ref: '#/components/parameters/before' + - $ref: '#/components/parameters/after' + - $ref: '#/components/parameters/filter' + - $ref: '#/components/parameters/limit' + - $ref: '#/components/parameters/attributes' + responses: + 200: + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/APIResourceListResponse' + 401: + description: Unauthorized + 403: + description: Forbidden + 500: + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{organization-name}/o/api/server/v1/api-resources' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + /api-resources/{apiResourceId}: + get: + tags: + - API Resources + summary: Get API resource specified by the id + description: | + Get API resource specified by the id + + Scope(Permission) required: `internal_org_api_resource_view` + parameters: + - $ref: '#/components/parameters/apiResourceId' + responses: + 200: + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/APIResourceResponse' + 401: + description: Unauthorized + 403: + description: Forbidden + 500: + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{organization-name}/o/api/server/v1/api-resources/{apiResourceId}' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + /api-resources/{apiResourceId}/scopes: + get: + tags: + - API Resource Scopes + summary: Get API resource scopes + description: | + Get API resource scopes specified by the id + + Scope(Permission) required: `internal_org_api_resource_view` + parameters: + - $ref: '#/components/parameters/apiResourceId' + responses: + 200: + description: OK + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/ScopeGetModel' + 401: + description: Unauthorized + 403: + description: Forbidden + 404: + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 500: + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{organization-name}/o/api/server/v1/api-resources/{apiResourceId}/scopes' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + /scopes: + get: + tags: + - API Resource Scopes + summary: Get all scopes in the tenant + description: | + Get all scopes in the tenant + + Scope(Permission) required: `internal_org_api_resource_view` + parameters: + - $ref: '#/components/parameters/scopeFilter' + responses: + 200: + description: OK + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/ScopeGetModel' + 401: + description: Unauthorized + 403: + description: Forbidden + 404: + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 500: + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{organization-name}/o/api/server/v1/scopes' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' +components: + parameters: + organizationId: + in: path + name: organizationId + description: uuid of the org. + required: true + schema: + type: string + example: "1234-4567-4567" + + apiResourceId: + name: apiResourceId + in: path + description: ID of the API Resource. + required: true + schema: + type: string + example: er34-gf23-bv54-vb90 + + collectionId: + name: collectionId + in: path + description: ID of the API Resource Collection. + required: true + schema: + type: string + example: er34-gf23-bv54-vb90 + + scopeName: + name: scopeName + in: path + description: Name of the Scope. + required: true + schema: + type: string + + applicationId: + name: applicationId + in: path + description: ID of the Application. + required: true + schema: + type: string + + authorizationId: + name: authorizationId + in: path + description: ID of the authorization. + required: true + schema: + type: string + + before: + name: before + in: query + required: false + description: | + Base64 encoded cursor value for backward pagination. + schema: + type: string + example: Ng== + + after: + name: after + in: query + required: false + description: | + Base64 encoded cursor value for forward pagination. + schema: + type: string + example: Ng== + + filter: + name: filter + in: query + required: false + description: | + Condition to filter the retrieval of records. Supports 'sw', 'co', 'ew' and 'eq' operations. + schema: + type: string + example: identifier+eq+greetings + + scopeFilter: + name: filter + in: query + required: false + description: | + Condition to filter the retrieval of scopes by name. Supports 'sw', 'co', 'ew' and 'eq' operations. + schema: + type: string + example: name+co+greetings + + collectionFilter: + name: filter + in: query + required: false + description: | + Condition to filter the retrieval of records. Supports 'sw', 'co', 'ew' and 'eq' operations. + schema: + type: string + example: type+eq+tenant + + limit: + name: limit + in: query + required: false + description: | + Maximum number of records to return. + schema: + type: integer + example: 10 + + attributes: + name: attributes + in: query + required: false + description: Specifies the required attributes in the response. Only 'properties' attribute is currently supported. + schema: + type: string + + collectionAttributes: + name: attributes + in: query + required: false + description: Specifies the required attributes in the response. Only 'apiResources' attribute is currently supported. + schema: + type: string + + schemas: + Error: + type: object + properties: + code: + type: string + example: AAA-00000 + message: + type: string + example: Some Error Message + description: + type: string + example: Some Error Description + traceId: + type: string + example: e0fbcfeb-3617-43c4-8dd0-7b7d38e13047 + + APIResourceListItem: + type: object + required: + - id + - name + - identifier + - self + properties: + id: + type: string + example: gh43-jk34-vb34-df67 + name: + type: string + example: Greetings API + identifier: + type: string + example: greetings_api + type: + type: string + example: SYSTEM + requiresAuthorization: + type: boolean + example: true + properties: + type: array + items: + $ref: '#/components/schemas/Property' + self: + type: string + example: /o/api/server/v1/api-resources/eDUwOUNlcnRpZmljYXRlQXV0aGVudGljYXRvcg + + APIResourceResponse: + type: object + required: + - id + - name + - identifier + - self + properties: + id: + type: string + example: gh43-jk34-vb34-df67 + name: + type: string + example: Greetings API + description: + type: string + example: Greeting API representation + identifier: + type: string + example: greetings_api + type: + type: string + example: BUSINESS + requiresAuthorization: + type: boolean + example: true + scopes: + type: array + items: + $ref: '#/components/schemas/ScopeGetModel' + subscribedApplications: + type: array + items: + $ref: '#/components/schemas/SubscribedApplicationGetModel' + properties: + type: array + items: + $ref: '#/components/schemas/Property' + self: + type: string + example: /o/api/server/v1/api-resources/eDUwOUNlcnRpZmljYXRlQXV0aGVudGljYXRvcg + + APIResourceCreationModel: + type: object + required: + - identifier + - name + properties: + name: + type: string + example: Greetings API + identifier: + type: string + example: greetings_api + description: + type: string + example: Greetings API representation + requiresAuthorization: + type: boolean + example: true + scopes: + type: array + items: + $ref: '#/components/schemas/ScopeCreationModel' + + APIResourcePatchModel: + type: object + properties: + name: + type: string + example: Greetings API + description: + type: string + example: Greetings API representation + addedScopes: + type: array + items: + $ref: '#/components/schemas/ScopeCreationModel' + removedScopes: + type: array + items: + type: string + description: This field is not supported yet. + example: + { + "name": "Greetings API", + "description": "Greetings API representation", + "addedScopes": [ + { + "name": "greetings:read", + "displayName": "Read Greetings", + "description": "Allows to read greetings" + } + ] + } + PaginationLink: + type: object + properties: + rel: + type: string + example: before + href: + type: string + example: /o/api/server/v1/api-resources?after=NDoy + + APIResourceListResponse: + type: object + required: + - links + properties: + totalResults: + type: integer + example: 1 + links: + type: array + items: + $ref: '#/components/schemas/PaginationLink' + APIResources: + type: array + items: + $ref: '#/components/schemas/APIResourceListItem' + + APIResourceMap: + type: object + properties: + read: + type: array + items: + $ref: '#/components/schemas/APIResourceCollectionItem' + write: + type: array + items: + $ref: '#/components/schemas/APIResourceCollectionItem' + + APIResourceCollectionListItem: + type: object + required: + - id + - name + - displayName + - self + properties: + id: + type: string + example: gh43-jk34-vb34-df67 + name: + type: string + example: bulkUserImport + displayName: + type: string + example: Bulk User Import + type: + type: string + example: TENANT + apiResources: + $ref: '#/components/schemas/APIResourceMap' + self: + type: string + example: /o/api/server/v1/api-resource-collections/eDUwOUNlcnRpZmljYXRlQXV0aGVudGljYXRvcg + + APIResourceCollectionListResponse: + type: object + required: + - links + properties: + totalResults: + type: integer + example: 1 + apiResourceCollections: + type: array + items: + $ref: '#/components/schemas/APIResourceCollectionListItem' + example: + { + "totalResults": 2, + "apiResourceCollections": [ + { + "id": "YXBwbGljYXRpb25z", + "name": "applications", + "displayName": "Applications", + "type": "tenant", + "self": "/o/api/server/v1/api-resource-collections/YXBwbGljYXRpb25z" + }, + { + "id": "b3JnX2VtYWlsVGVtcGxhdGVz", + "name": "org_emailTemplates", + "displayName": "Email Templates", + "type": "organization", + "self": "/o/api/server/v1/api-resource-collections/b3JnX2VtYWlsVGVtcGxhdGVz" + } + ] + } + APIResourceCollectionItem: + type: object + required: + - id + - name + - displayName + - self + properties: + id: + type: string + example: gh43-jk34-vb34-df67 + name: + type: string + example: Greetings API + description: + type: string + example: Greeting API representation + identifier: + type: string + example: greetings_api + type: + type: string + example: BUSINESS + scopes: + type: array + items: + $ref: '#/components/schemas/ScopeGetModel' + self: + type: string + example: /o/api/server/v1/api-resources/eDUwOUNlcnRpZmljYXRlQXV0aGVudGljYXRvcg + + APIResourceCollectionResponse: + type: object + required: + - id + - name + - displayName + properties: + id: + type: string + example: gh43-jk34-vb34-df67 + name: + type: string + example: bulkUserImport + displayName: + type: string + example: Bulk User Import + type: + type: string + example: TENANT + apiResources: + $ref: '#/components/schemas/APIResourceMap' + example: + { + "id": "YXBwbGljYXRpb25z", + "name": "applications", + "displayName": "Applications", + "type": "tenant", + "apiResources": { + "read": [ + { + "id": "dea5bc01-f8e2-4a29-bc39-acdcb6c73e0e", + "name": "Userstore Management API", + "scopes": [ + { + "displayName": "View Userstore", + "name": "internal_userstore_view" + } + ], + "self": "/v1/api-resources/dea5bc01-f8e2-4a29-bc39-acdcb6c73e0e" + }, + { + "id": "ec4882d7-9628-413b-9704-1b06fc8c5888", + "name": "Identity Provider Management API", + "scopes": [ + { + "displayName": "View Identity Provider", + "name": "internal_idp_view" + } + ], + "self": "/v1/api-resources/ec4882d7-9628-413b-9704-1b06fc8c5888" + } + ] + } + } + ScopeGetModel: + type: object + required: + - id + - displayName + - name + properties: + id: + type: string + example: sf23-fg34-fy53-hj23 + displayName: + type: string + example: Write + name: + type: string + example: greetings:write + description: + type: string + example: Allow writing greetings + + ScopeCreationModel: + type: object + required: + - name + properties: + name: + type: string + example: 'greetings:write' + displayName: + type: string + example: "Write Greetings" + description: + type: string + example: "Allows writing greetings" + + ScopePatchModel: + type: object + properties: + displayName: + type: string + example: "Write Greetings" + description: + type: string + example: "Allows writing greetings" + + SubscribedApplicationGetModel: + type: object + properties: + name: + type: string + example: Application1 + id: + type: string + example: 23fd-23gd-54vv-sdhf + + Property: + type: object + required: + - name + - value + properties: + name: + type: string + example: "label" + value: + type: string + example: "Internal" + + responses: + BadRequest: + description: Bad Request. Invalid request or validation error. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + example: + code: 400 + message: Bad Request + description: Invalid request or validation error + + Conflict: + description: Conflict. Specified resource already exists. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + example: + code: 409 + message: Conflict + description: Specified resource already exists + moreInfo: '' + error: [] + Forbidden: + description: >- + Forbidden. The request must be conditional but no condition has been + specified. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + example: + code: 403 + message: Forbidden + description: >- + The request must be conditional but no condition has been + specified + InternalServerError: + description: Internal Server Error. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + example: + code: 500 + message: Internal Server Error + description: >- + The server encountered an internal error. Please contact + administrator. + moreInfo: '' + error: [] + NotFound: + description: Not Found. The specified resource does not exist. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + example: + code: 404 + message: Not Found + description: The specified resource does not exist + moreInfo: '' + error: [] + + Unauthorized: + description: Unauthorized. The user is not authorized. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + example: + code: 401 + message: Unauthorized + description: The user is not authorized + moreInfo: '' + error: [] + + securitySchemes: + OAuth2: + type: oauth2 + flows: + authorizationCode: + authorizationUrl: 'https://localhost:9443/oauth2/authorize' + tokenUrl: 'http://localhost:9443/oauth2/token' + scopes: {} diff --git a/docusaurus-asgardeo/static/apis/organization-apis/restapis/application.yaml b/docusaurus-asgardeo/static/apis/organization-apis/restapis/application.yaml new file mode 100644 index 0000000000..9bcf1c8ebc --- /dev/null +++ b/docusaurus-asgardeo/static/apis/organization-apis/restapis/application.yaml @@ -0,0 +1,1310 @@ +openapi: 3.0.0 +info: + description: > + This document explains the RESTful API for application management of organizations in Asgardeo. + version: "v1" + title: Asgardeo - Application Management Rest API +security: + - OAuth2: [] +paths: + /applications: + get: + tags: + - Applications + operationId: getAllApplications + summary: | + List applications + description: | + This API provides the capability to retrieve the list of applications.
    + Scope required: `internal_org_application_mgt_view` + parameters: + - $ref: '#/components/parameters/limitQueryParam' + - $ref: '#/components/parameters/offsetQueryParam' + - $ref: '#/components/parameters/filterQueryParam' + - $ref: '#/components/parameters/sortOrderQueryParam' + - $ref: '#/components/parameters/sortByQueryParam' + - $ref: '#/components/parameters/attributesQueryParam' + - $ref: '#/components/parameters/excludeSystemPortalsQueryParam' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/ApplicationListResponse' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '501': + description: Not Implemented + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/applications?limit=30&offset=0' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + /applications/{applicationId}: + get: + tags: + - Applications + summary: | + Retrieve application by ID + operationId: getApplication + description: > + This API provides the capability to retrieve the application information + by ID.
    + Scope required: `internal_org_application_mgt_view` + parameters: + - name: applicationId + in: path + description: ID of the application. + required: true + schema: + type: string + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/ApplicationResponseModel' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + application/xml: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + application/xml: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + application/xml: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/applications/{application-id}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + patch: + tags: + - Applications + summary: | + Partially update application by ID + operationId: patchApplication + description: | + This API provides the capability to partially update an application by ID.
    + Scope required: `internal_org_application_mgt_update` + parameters: + - name: applicationId + in: path + description: ID of the application. + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ApplicationPatchModel' + description: This represents the application details to be updated. + required: true + responses: + '200': + description: Successfully Updated + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '409': + description: Conflict + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PATCH' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/applications/{application-id}' \ + -H 'accept: */*' \ + -H 'Authorization: Bearer {bearer_token}' \ + -H 'Content-Type: application/json' \ + -d '{ + "authenticationSequence": { + "attributeStepId": 1, + "steps": [ + { + "id": 1, + "options": [ + { + "authenticator": "OpenIDConnectAuthenticator", + "idp": "Enterprise IDP" + } + ] + } + ], + "subjectStepId": 1, + "type": "USER_DEFINED", + "script": "" + } + }' + /applications/{applicationId}/authenticators: + get: + tags: + - Authenticators + summary: | + Get configured authenticators + operationId: getConfiguredAuthenticators + description: | + This API provides the capability to retrieve the configured authenticators. + + Scope required: `internal_org_application_mgt_view` + parameters: + - name: applicationId + in: path + description: ID of the application. + required: true + schema: + type: string + responses: + '200': + description: OK + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/ConfiguredAuthenticatorsModal' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/applications/{application-id}/authenticators' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' +components: + parameters: + limitQueryParam: + in: query + name: limit + required: false + description: | + Maximum number of records to return. + schema: + type: integer + minimum: 1 + default: 30 + limitWithoutDefaultQueryParam: + in: query + name: limit + required: false + description: | + Maximum number of records to return. + schema: + type: integer + offsetQueryParam: + in: query + name: offset + required: false + description: | + Number of records to skip for pagination. + schema: + type: integer + default: 0 + offsetWithoutDefaultQueryParam: + in: query + name: offset + required: false + description: | + Number of records to skip for pagination. + schema: + type: integer + filterQueryParam: + in: query + name: filter + required: false + description: | + Condition to filter the records retrieved. + Supports 'sw', 'co', 'ew', and 'eq' operations with 'and', 'or' logical operators. + Note that 'and' and 'or' operators in filters follow the general precedence of logical operators. + For example, A and B or C and D = (A and B) or (C and D)). + Currently supports only filtering based on the 'name', the 'clientId', and the 'issuer' attributes. + + /applications?filter=name+eq+user_portal +
    + /applications?filter=name+co+prod+or+clientId+co+123 + schema: + type: string + sortOrderQueryParam: + in: query + name: sortOrder + required: false + description: | + Define the order in which the retrieved records should be sorted. + _This parameter is not supported yet._ + schema: + type: string + enum: + - ASC + - DESC + sortByQueryParam: + in: query + name: sortBy + required: false + description: | + Attribute by which the retrieved records should be sorted. + _This parameter is not supported yet._ + schema: + type: string + attributesQueryParam: + in: query + name: attributes + required: false + description: | + Specifies the required parameters in the response. + Only 'advancedConfigurations', 'templateId', 'clientId', and 'issuer' attributes are supported currently. + + /applications?attributes=advancedConfigurations,templateId,clientId,issuer + schema: + type: string + excludeSystemPortalsQueryParam: + in: query + name: excludeSystemPortals + required: false + description: | + Specifies whether to exclude system portals in the response. + If not provided, the default is false, meaning system portals will be included. + + /applications?excludeSystemPortals=true + schema: + type: boolean + exportSecretsQueryParam: + in: query + name: exportSecrets + required: false + description: | + Specifies whether to export secrets when exporting an application. + schema: + type: boolean + default: false + inboundProtocolsCustomOnly: + in: query + name: customOnly + required: false + description: | + Send only the custom inbound protocols. + schema: + type: boolean + example: true + default: false + templateIdPathParam: + in: path + name: template-id + required: true + description: | + Application template ID. This should be a valid locale. + schema: + type: string + securitySchemes: + OAuth2: + type: oauth2 + description: "**Authorization code OAuth flow** + **Organization Switch**" + schemas: + Link: + type: object + properties: + href: + type: string + example: "applications?offset=10&limit=10" + rel: + type: string + example: "next" + + ApplicationListResponse: + type: object + properties: + totalResults: + type: integer + description: "Number of results that match the listing operation." + example: 1 + startIndex: + type: integer + description: "Index of the first element of the page, which will be equal to offset + 1." + example: 1 + count: + type: integer + description: "Number of elements in the returned page." + example: 10 + applications: + type: array + items: + $ref: '#/components/schemas/ApplicationListItem' + links: + type: array + items: + $ref: '#/components/schemas/Link' + + ApplicationListItem: + type: object + properties: + id: + type: string + example: "85e3f4b8-0d22-4181-b1e3-1651f71b88bd" + name: + type: string + example: "user-portal" + description: + type: string + example: Application representing user portal + image: + type: string + example: 'https://example.com/logo/my-logo.png' + accessUrl: + type: string + example: 'https://example.com/app/login' + clientId: + type: string + example: 'SmrrDNXRYf1lMmDlnleeHTuXx_Ea' + issuer: + type: string + example: 'http://idp.example.com/metadata.php' + access: + type: string + enum: + - READ + - WRITE + default: READ + self: + type: string + example: "/t/{root-organization-name}/o/api/server/v1/applications/85e3f4b8-0d22-4181-b1e3-1651f71b88bd" + advancedConfigurations: + $ref: '#/components/schemas/AdvancedApplicationConfiguration' + templateId: + type: string + example: "980b8tester24c64a8a09a0d80abf8c337bd2555" + + ApplicationModel: + type: object + required: + - name + properties: + id: + type: string + example: "394b8adcce24c64a8a09a0d80abf8c337bd253de" + readOnly: true + name: + type: string + example: pickup + description: + type: string + example: This is the configuration for Pickup application. + imageUrl: + type: string + example: 'https://example.com/logo/my-logo.png' + accessUrl: + type: string + example: 'https://example.com/login' + templateId: + type: string + example: "980b8tester24c64a8a09a0d80abf8c337bd2555" + isManagementApp: + default: false + type: boolean + example: false + description: Decides whether the application used to access System APIs + claimConfiguration: + $ref: '#/components/schemas/ClaimConfiguration' + inboundProtocolConfiguration: + $ref: '#/components/schemas/InboundProtocols' + authenticationSequence: + $ref: '#/components/schemas/AuthenticationSequence' + advancedConfigurations: + $ref: '#/components/schemas/AdvancedApplicationConfiguration' + provisioningConfigurations: + $ref: '#/components/schemas/ProvisioningConfiguration' + + ApplicationResponseModel: + type: object + required: + - name + properties: + id: + type: string + example: "394b8adcce24c64a8a09a0d80abf8c337bd253de" + readOnly: true + name: + type: string + example: pickup + description: + type: string + example: This is the configuration for Pickup application. + imageUrl: + type: string + example: 'https://example.com/logo/my-logo.png' + accessUrl: + type: string + example: 'https://example.com/login' + clientId: + type: string + example: 'SmrrDNXRYf1lMmDlnleeHTuXx_Ea' + issuer: + type: string + example: 'http://idp.example.com/metadata.php' + templateId: + type: string + example: "adwefi2429asdfdf94444rraf44" + isManagementApp: + type: boolean + example: false + description: Decides whether the application used to access System APIs + claimConfiguration: + $ref: '#/components/schemas/ClaimConfiguration' + inboundProtocols: + $ref: '#/components/schemas/InboundProtocolsListResponse' + authenticationSequence: + $ref: '#/components/schemas/AuthenticationSequence' + advancedConfigurations: + $ref: '#/components/schemas/AdvancedApplicationConfiguration' + provisioningConfigurations: + $ref: '#/components/schemas/ProvisioningConfiguration' + access: + type: string + enum: + - READ + - WRITE + default: READ + + ApplicationPatchModel: + type: object + properties: + authenticationSequence: + $ref: '#/components/schemas/AuthenticationSequence' + + ProvisioningConfiguration: + type: object + properties: + inboundProvisioning: + $ref: '#/components/schemas/InboundSCIMProvisioningConfiguration' + outboundProvisioningIdps: + type: array + items: + $ref: '#/components/schemas/OutboundProvisioningConfiguration' + InboundSCIMProvisioningConfiguration: + type: object + properties: + proxyMode: + type: boolean + example: false + provisioningUserstoreDomain: + type: string + example: PRIMARY + description: >- + This property becomes only applicable if the proxy-mode config is + set to false + + OutboundProvisioningConfiguration: + type: object + properties: + idp: + type: string + example: Google + connector: + type: string + example: googleapps + blocking: + type: boolean + example: false + rules: + type: boolean + example: false + jit: + type: boolean + example: false + ConfiguredAuthenticatorsModal: + type: object + properties: + stepId: + type: integer + example: 1 + localAuthenticators: + type: array + items: + $ref: '#/components/schemas/LocalConfiguredAuthenticator' + federatedAuthenticators: + type: array + items: + $ref: '#/components/schemas/ConfiguredAuthenticator' + LocalConfiguredAuthenticator: + type: object + properties: + name: + type: string + example: Username & Password + type: + type: string + example: BasicAuthenticator + ConfiguredAuthenticator: + type: object + properties: + name: + type: string + example: Enterprise IDP + type: + type: string + example: OpenIDConnectAuthenticator + AdvancedApplicationConfiguration: + type: object + properties: + saas: + type: boolean + example: false + description: Decides whether the application is accessible across tenants. + discoverableByEndUsers: + type: boolean + example: false + description: Decides whether the application is visible for end users. + certificate: + $ref: '#/components/schemas/Certificate' + skipLoginConsent: + type: boolean + example: false + description: Decides whether user consent needs to be skipped during login flows. + skipLogoutConsent: + type: boolean + example: false + description: Decides whether user consent needs to be skipped during logout flows. + useExternalConsentPage: + type: boolean + example: false + description: Decides whether users should be presented with an external consent page. + returnAuthenticatedIdpList: + type: boolean + example: false + description: Decides whether the list of authenticated identity providers need to be returned in the authentication response. + enableAuthorization: + type: boolean + description: Decides whether authorization policies needs to be engaged during authentication flows. + example: true + additionalSpProperties: + $ref: '#/components/schemas/AdditionalProperties' + AdditionalProperties: + type: array + description: Denotes additional properties of the application. It is only supported by getApplication and getAllApplications request. + items: + $ref: "#/components/schemas/AdditionalSpProperty" + AdditionalSpProperty: + type: object + required: + - name + - value + properties: + name: + type: string + example: "isInternalApp" + value: + type: string + example: "true" + displayName: + type: string + example: "Internal Application" + Certificate: + type: object + properties: + type: + type: string + description: >- + Certificate type. This should be either JWKS or PEM. + value: + type: string + description: >- + Certificate value. If type is JWKS, value should be jwks URL. If + type is PEM, value should be the certificate in PEM format. + InboundProtocols: + type: object + properties: + oidc: + $ref: '#/components/schemas/OpenIDConnectConfiguration' +# saml: +# $ref: '#/components/schemas/SAML2Configuration' +# passiveSts: +# $ref: '#/components/schemas/PassiveStsConfiguration' +# wsTrust: +# $ref: '#/components/schemas/WSTrustConfiguration' +# custom: +# type: array +# items: +# $ref: '#/components/schemas/CustomInboundProtocolConfiguration' + InboundProtocolsListResponse: + type: array + items: + $ref: '#/components/schemas/InboundProtocolListItem' + + InboundProtocolListItem: + type: object + required: + - type + - name + - self + properties: + type: + type: string + example: "samlsso" + name: + type: string + example: "SAML2 Inbound" + self: + type: string + example: "/t/{root-organization-name}/o/api/server/v1/applications/29048810-1447-4ea0-a348-30d15ab65fa3/inbound-protocols/saml" + + ClaimConfiguration: + type: object + properties: + dialect: + type: string + enum: + - CUSTOM + - LOCAL + default: LOCAL + claimMappings: + type: array + items: + $ref: '#/components/schemas/ClaimMappings' + requestedClaims: + type: array + items: + $ref: '#/components/schemas/RequestedClaimConfiguration' + subject: + $ref: '#/components/schemas/SubjectConfig' + role: + $ref: '#/components/schemas/RoleConfig' + SubjectConfig: + type: object + properties: + claim: + $ref: '#/components/schemas/Claim' + includeUserDomain: + type: boolean + example: false + includeTenantDomain: + type: boolean + example: false + useMappedLocalSubject: + type: boolean + example: false + RoleConfig: + type: object + properties: + mappings: + type: array + items: + $ref: '#/components/schemas/RoleMapping' + includeUserDomain: + type: boolean + example: true + claim: + $ref: '#/components/schemas/Claim' + RoleMapping: + type: object + required: + - localRole + - applicationRole + properties: + localRole: + type: string + example: admin + applicationRole: + type: string + example: Administrator + RequestedClaimConfiguration: + type: object + required: + - claim + description: >- + User claims that need to be sent back to the application. If the + claim mappings are local, use local claim URIs. If the custom claim + mappings are configured, use the mapped application claim URI + properties: + claim: + $ref: '#/components/schemas/Claim' + mandatory: + type: boolean + example: false + ClaimMappings: + type: object + required: + - applicationClaim + - localClaim + properties: + applicationClaim: + type: string + description: Claim URI received by the application + example: firstname + localClaim: + $ref: '#/components/schemas/Claim' + Claim: + type: object + required: + - uri + properties: + id: + type: string + example: aHR0cDovL3dzbzIub3JnL2NsYWltcy91c2VybmFtZQ + readOnly: true + uri: + type: string + example: 'http://wso2.org/claims/username' + displayName: + type: string + example: Username + readOnly: true + + SAML2Configuration: + type: object + properties: + metadataFile: + type: string + example: 'Base64 encoded metadata file content' + metadataURL: + type: string + example: 'https://example.com/samlsso/meta' + manualConfiguration: + $ref: '#/components/schemas/SAML2ServiceProvider' + + SingleSignOnProfile: + type: object + properties: + bindings: + type: array + items: + type: string + enum: + - HTTP_POST + - HTTP_REDIRECT + - ARTIFACT + + enableSignatureValidationForArtifactBinding: + type: boolean + description: Enables Signature validation for SAML artifact binding. Applicable only if SAML artifact binding is enabled through the bindings option. + default: false + + attributeConsumingServiceIndex: + type: string + readOnly: true + + enableIdpInitiatedSingleSignOn: + type: boolean + default: false + + assertion: + $ref: '#/components/schemas/SAMLAssertionConfiguration' + + SAMLAttributeProfile: + type: object + properties: + enabled: + type: boolean + default: false + alwaysIncludeAttributesInResponse: + type: boolean + default: false + + SingleLogoutProfile: + type: object + properties: + enabled: + type: boolean + default: true + logoutRequestUrl: + type: string + description: Single logout request accepting endpoint + logoutResponseUrl: + type: string + description: Single logout response accepting endpoint + logoutMethod: + type: string + enum: + - BACKCHANNEL + - FRONTCHANNEL_HTTP_REDIRECT + - FRONTCHANNEL_HTTP_POST + idpInitiatedSingleLogout: + $ref: '#/components/schemas/IdpInitiatedSingleLogout' + + IdpInitiatedSingleLogout: + type: object + properties: + enabled: + type: boolean + default: false + returnToUrls: + type: array + items: + type: string + + SAMLAssertionConfiguration: + type: object + properties: + nameIdFormat: + type: string + default: 'urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified' + example: 'urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress' + + audiences: + type: array + description: Additional audience values to be added to the SAML Assertions. + example: + - 'https://app.example.com/saml' + items: + type: string + + recipients: + type: array + description: Additional recipient values to be added to the SAML Assertions + example: + - 'https://app.example.com/saml' + items: + type: string + + digestAlgorithm: + type: string + default: "http://www.w3.org/2000/09/xmldsig#sha1" + example: "http://www.w3.org/2000/09/xmldsig#sha1" + encryption: + $ref: '#/components/schemas/AssertionEncryptionConfiguration' + + AssertionEncryptionConfiguration: + type: object + properties: + enabled: + type: boolean + default: false + assertionEncryptionAlgorithm: + type: string + default: "http://www.w3.org/2001/04/xmlenc#aes256-cbc" + keyEncryptionAlgorithm: + type: string + default: "http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p" + + SAMLRequestValidation: + type: object + properties: + enableSignatureValidation: + type: boolean + default: true + signatureValidationCertAlias: + type: string + + SAMLResponseSigning: + type: object + properties: + enabled: + type: boolean + default: true + signingAlgorithm: + type: string + + SAML2ServiceProvider: + type: object + required: + - issuer + - assertionConsumerUrls + + properties: + issuer: + type: string + serviceProviderQualifier: + type: string + assertionConsumerUrls: + type: array + items: + type: string + minItems: 1 + defaultAssertionConsumerUrl: + type: string + description: If not provided, the first assertion consumer URL on the `assertionConsumerUrls` will be picked as the default assertion consumer URL. + idpEntityIdAlias: + type: string + description: Default value is the IdP's entity ID value specified in the resident IdP. + + singleSignOnProfile: + $ref: '#/components/schemas/SingleSignOnProfile' + + attributeProfile: + $ref: '#/components/schemas/SAMLAttributeProfile' + + singleLogoutProfile: + $ref: '#/components/schemas/SingleLogoutProfile' + + requestValidation: + $ref: '#/components/schemas/SAMLRequestValidation' + + responseSigning: + $ref: '#/components/schemas/SAMLResponseSigning' + + enableAssertionQueryProfile: + type: boolean + default: false + + OpenIDConnectConfiguration: + type: object + required: + - grantTypes + properties: + clientId: + type: string + clientSecret: + type: string + state: + type: string + enum: + - ACTIVE + - REVOKED + readOnly: true + default: ACTIVE + grantTypes: + type: array + example: + - authorization_code + - password + items: + type: string + minItems: 1 + callbackURLs: + type: array + description: Authorized redirect URIs + example: + - 'regexp=(https://app.example.com/callback1|https://app.example.com/callback2)' + items: + type: string + allowedOrigins: + type: array + description: Authorized JavaScript origins. CORS requests will be allowed to these origins. + example: + - 'https://app.example.com' + items: + type: string + publicClient: + type: boolean + default: false + description: >- + Enabling this option will allow the client to authenticate without a + client secret. + example: false + pkce: + $ref: '#/components/schemas/OAuth2PKCEConfiguration' + accessToken: + $ref: '#/components/schemas/AccessTokenConfiguration' + refreshToken: + $ref: '#/components/schemas/RefreshTokenConfiguration' + idToken: + $ref: '#/components/schemas/IdTokenConfiguration' + logout: + $ref: '#/components/schemas/OIDCLogoutConfiguration' + validateRequestObjectSignature: + type: boolean + default: false + example: false + scopeValidators: + type: array + example: + - Role based scope validator + items: + type: string + OAuth2PKCEConfiguration: + type: object + properties: + mandatory: + type: boolean + example: false + supportPlainTransformAlgorithm: + type: boolean + example: true + AccessTokenConfiguration: + type: object + properties: + type: + type: string + example: JWT + userAccessTokenExpiryInSeconds: + type: integer + format: int64 + example: 3600 + applicationAccessTokenExpiryInSeconds: + type: integer + format: int64 + example: 3600 + bindingType: + type: string + description: "OAuth2 access token and refresh token can be bound to an external attribute during the token + generation so that it can be optionally validated during the API invocation." + default: "None" + example: cookie + revokeTokensWhenIDPSessionTerminated: + type: boolean + description: "If enabled, when the IDP session is terminated, all the access tokens bound to the session + will get revoked." + validateTokenBinding: + type: boolean + description: "If enabled, both access token and the token binding needs to be present for a successful API + invocation." + enableJwtScopeAsArray: + type: boolean + description: "If enabled, the scope claim in JWT access tokens will be formatted as a JSON array instead of a space-separated string." + example: false + RefreshTokenConfiguration: + type: object + properties: + expiryInSeconds: + type: integer + format: int64 + example: 86400 + renewRefreshToken: + description: Decides whether the refresh token needs to be renewed during refresh grant flow. + type: boolean + example: true + IdTokenConfiguration: + type: object + properties: + expiryInSeconds: + type: integer + format: int64 + example: 3600 + audience: + type: array + example: + - 'http://idp.xyz.com' + - 'http://idp.abc.com' + items: + type: string + encryption: + $ref: '#/components/schemas/IdTokenEncryptionConfiguration' + IdTokenEncryptionConfiguration: + type: object + properties: + enabled: + type: boolean + default: false + example: false + algorithm: + type: string + example: RSA-OAEP + method: + type: string + example: A128CBC+HS256 + OIDCLogoutConfiguration: + type: object + properties: + backChannelLogoutUrl: + type: string + example: 'https://app.example.com/backchannel/callback' + frontChannelLogoutUrl: + type: string + example: 'https://app.example.com/frontchannel/callback' + PassiveStsConfiguration: + type: object + required: + - realm + - replyTo + properties: + realm: + type: string + replyTo: + type: string + WSTrustConfiguration: + type: object + required: + - audience + - certificateAlias + properties: + audience: + type: string + description: Audience value of the trusted service + example: https://wstrust.endpoint.com + certificateAlias: + type: string + example: "wso2carbon" + CustomInboundProtocolConfiguration: + type: object + required: + - name + - configName + properties: + name: + type: string + example: cas + configName: + type: string + example: cas + properties: + type: array + items: + $ref: '#/components/schemas/PropertyModel' + PropertyModel: + type: object + properties: + key: + type: string + example: app-identifier + value: + type: string + example: 'http://app.wso2.com/employeeApp' + friendlyName: + type: string + example: Application Identifier + AuthenticationSequence: + type: object + properties: + type: + type: string + description: " + - DEFAULT type indicates that the application will use the default authentication sequence specified at the tenant level. When the DEFAULT type is used, the information given in the other fields of the AuthenticationSequence will be ignored and overriden with values defined at the tenant level. + + - USER_DEFINED type indicates that the application will use a user-defined authentication sequence." + enum: + - DEFAULT + - USER_DEFINED + default: DEFAULT + steps: + type: array + items: + $ref: '#/components/schemas/AuthenticationStepModel' + script: + type: string + example: "" + subjectStepId: + type: integer + default: 1 + example: 1 + attributeStepId: + type: integer + default: 1 + example: 1 + + AuthenticationStepModel: + type: object + required: + - id + - options + properties: + id: + type: integer + minimum: 1 + example: 1 + options: + type: array + items: + $ref: '#/components/schemas/Authenticator' + minItems: 1 + Authenticator: + type: object + required: + - idp + - authenticator + properties: + idp: + type: string + example: Enterprise IDP + authenticator: + type: string + example: OpenIDConnectAuthenticator + Error: + type: object + properties: + code: + type: string + example: AAA-00000 + message: + type: string + example: Some error message. + description: + type: string + example: Some error description. + traceId: + type: string + example: e0fbcfeb-3617-43c4-8dd0-7b7d38e13047 + +servers: + - url: 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1' + variables: + server-url: + default: "https://api.asgardeo.io/t/{root-organization-name}/o/" + root-organization-name: + default: "{root-organization-name}" diff --git a/docusaurus-asgardeo/static/apis/organization-apis/restapis/association-management-by-admin.yaml b/docusaurus-asgardeo/static/apis/organization-apis/restapis/association-management-by-admin.yaml new file mode 100644 index 0000000000..22d24d2b30 --- /dev/null +++ b/docusaurus-asgardeo/static/apis/organization-apis/restapis/association-management-by-admin.yaml @@ -0,0 +1,589 @@ +openapi: 3.0.1 +info: + title: User Account Association API + description: | + This document specifies a **User Account Association Management RESTful API** for **Asgardeo**. + The APIs provide the capability for privileged users to retrieve/delete associated local/federated accounts of other users. + version: v1 +servers: + - url: https://api.asgardeo.io/t/{organization-name}/o/api/users/v1 + variables: + serverUrl: + default: https://api.asgardeo.io/t/{organization-name} + tenantDomain: + default: carbon.super +security: + - OAuth2: [] +tags: + - name: admin + description: | + Operations available for privileged users, to be invoked on behalf of another user. +paths: + /{user-id}/associations: + get: + tags: + - admin + summary: Get user's associations + description: | + This API is used to retrieve the associations of the user.
    + + Scope(Permission) required: `internal_org_user_association_view` + parameters: + - name: user-id + in: path + description: user id + required: true + schema: + type: string + responses: + 200: + description: Successful operation + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/User' + 204: + description: No content + content: {} + 401: + description: Unauthorized request + content: {} + 403: + description: Resource Forbidden + content: {} + 404: + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 500: + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/o/api/users/v1/{user-id}/associations' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer ' + delete: + tags: + - admin + summary: Delete user's all user associations + description: | + This API is used to delete all associations of the user.
    + + Scope(Permission) required: `internal_org_user_association_delete` + parameters: + - name: user-id + in: path + required: true + schema: + type: string + responses: + 204: + description: No content + content: {} + 401: + description: Unauthorized request + content: {} + 403: + description: Resource Forbidden + content: {} + 404: + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 500: + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'DELETE' \ + 'https://api.asgardeo.io/t/{organization-name}/o/api/users/v1/{user-id}/associations' \ + -H 'accept: */*' \ + -H 'Authorization: Bearer ' + /{user-id}/federated-associations: + get: + tags: + - admin + summary: Get user's federated associations + description: | + This API is used to retrieve the federated associations of the user.
    + + Scope(Permission) required: `internal_org_user_association_view` + parameters: + - name: user-id + in: path + description: user id + required: true + schema: + type: string + responses: + 200: + description: Successful operation + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/FederatedAssociation' + 204: + description: No content + content: {} + 401: + description: Unauthorized request + content: {} + 403: + description: Resource Forbidden + content: {} + 404: + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 500: + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/o/api/users/v1/{user-id}/federated-associations' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer ' + post: + tags: + - admin + summary: Create federated user association + description: | + This API allows administrators to explicitly associate a local user with a federated identity.
    + Scope(Permission) required: `internal_org_user_association_create` + parameters: + - name: user-id + in: path + required: true + description: user id + type: string + - name: association + in: body + description: User details to be associated. + required: true + schema: + $ref: '#/definitions/FederatedAssociationRequest' + responses: + 201: + description: Successfully created + schema: + $ref: '#/definitions/FederatedAssociation' + 400: + description: Bad Request + schema: + $ref: '#/definitions/Error' + 401: + description: Unauthorized + schema: + $ref: '#/definitions/Error' + 403: + description: Resource Forbidden + schema: + $ref: '#/definitions/Error' + 500: + description: Server Error + schema: + $ref: '#/definitions/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{organization-name}/o/api/users/v1/{user-id}/federated-associations' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer ' \ + -H 'Content-Type: application/json' \ + -d '{ + "idp": "exampleIdP", + "federatedUserId": "john@example.com" + }' + delete: + tags: + - admin + summary: Delete user's all user-federated associations + description: | + This API is used to delete all federated associations of the user.
    + + Scope(Permission) required: `internal_org_user_association_delete` + parameters: + - name: user-id + in: path + required: true + schema: + type: string + responses: + 204: + description: No content + content: {} + 401: + description: Unauthorized request + content: {} + 403: + description: Resource Forbidden + content: {} + 404: + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 500: + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'DELETE' \ + 'https://api.asgardeo.io/t/{organization-name}/o/api/users/v1/{user-id}/federated-associations' \ + -H 'accept: */*' \ + -H 'Authorization: Bearer ' + /{user-id}/federated-associations/{id}: + delete: + tags: + - admin + summary: Delete the user's federated association + description: | + This API is used to delete a federated association of the user.
    + + Scope(Permission) required: `internal_org_user_association_delete` + parameters: + - name: user-id + in: path + required: true + schema: + type: string + - name: id + in: path + required: true + schema: + type: string + responses: + 204: + description: No content + content: {} + 401: + description: Unauthorized request + content: {} + 403: + description: Resource Forbidden + content: {} + 404: + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 500: + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'DELETE' \ + 'https://api.asgardeo.io/t/{organization-name}/o/api/users/v1/user-id/federated-associations/federated-association-id' \ + -H 'accept: */*' \ + -H 'Authorization: Bearer ' + /federated-associations/bulk: + post: + tags: + - admin + summary: Create and Delete users associations in bulk + description: | + This API is used to create and delete users association in bulk.
    + Maximum number of supported operations in a single request is 1000 by default. + It can be configured using a server level configuration. + Scope required: + * internal_user_fed_association_bulk + parameters: + - name: body + in: body + required: false + schema: + $ref: '#/definitions/BulkFederatedAssociationRequest' + responses: + 200: + description: Success + schema: + $ref: '#/definitions/BulkFederatedAssociationResponse' + 400: + description: Bad Request + schema: + $ref: '#/definitions/Error' + 401: + description: Unauthorized + schema: + $ref: '#/definitions/Error' + 403: + description: Forbidden + schema: + $ref: '#/definitions/Error' + 500: + description: Internal Server Error + schema: + $ref: '#/definitions/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{organization-name}/o/api/users/v1/federated-associations/bulk' \ + -H 'accept: */*' \ + -H 'Authorization: Bearer {bearer-token}' \ + -d '{ + "failOnErrors": 0, + "operations": [ + { + "method": "POST", + "bulkId": "qewvaewv", + "path": "/1ca49238-3ab0-474b-9d42-8067780a503c/federated-associations", + "data": { + "idp": "Google", + "federatedUserId": "sam@gmail,com" + } + }, + { + "method": "POST", + "bulkId": "fgnruyt", + "path": "/7589bffc-b315-4dbd-83a5-86f5b8aa4776/federated-associations", + "data": { + "idp": "Google", + "federatedUserId": "mike@gmail,com" + } + }, + { + "method": "DELETE", + "bulkId": "useffger", + "path": "/0a2d94e2-3b98-49ea-89d6-e8dd9e0ff89b/federated-associations" + }, + { + "method": "DELETE", + "bulkId": "eefvrtgnrtn", + "path": "/197fc0fa-c2b0-48e6-92a6-a551afc3d125/federated-associations/0dcc3f5a-3bee-4f36-a91f-8ee60dbae875" + } + ] + }' + +components: + schemas: + Error: + required: + - code + - message + type: object + properties: + code: + type: string + example: some_error_code + message: + type: string + example: Some Error Message + description: + type: string + example: Some Error Description + traceId: + type: string + example: Some Correlation for Error Instance + User: + type: object + properties: + userId: + type: string + example: 23e22434234234329jj9iin + username: + type: string + example: john + userStoreDomain: + type: string + example: PRIMARY + tenantDomain: + type: string + example: carbon.super + firstName: + type: string + example: john + lastName: + type: string + example: doe + email: + type: string + example: john.doe@wso2.com + FederatedAssociation: + type: object + properties: + id: + type: string + example: eeqweisfhkdfik + idp: + $ref: '#/components/schemas/Idp' + federatedUserId: + type: string + example: john@google.com + Idp: + type: object + properties: + id: + type: string + example: eeqweisfhkdfikaefcqwesfceqwqas + name: + type: string + example: google.com + displayName: + type: string + example: Google + imageUrl: + type: string + example: https://is.example.com/sample.jpg + Property: + type: object + properties: + key: + type: string + example: test-key + value: + type: string + example: test-value + AssociationUserRequest: + type: object + properties: + userId: + type: string + example: john + password: + type: string + example: userpassword + properties: + type: array + items: + $ref: '#/components/schemas/Property' + FederatedAssociationRequest: + type: object + properties: + idp: + type: string + example: exampleIdP + description: Name of the IdP + federatedUserId: + type: string + example: john@example.com + description: User identifier in the federated IdP + BulkFederatedAssociationRequest: + type: object + properties: + failOnErrors: + type: integer + example: 1 + description: | + This represents whether the API should stop processing the operations if any of them fail. The subsequent + operations after the the fail count is reached will not be processed. + If set to 0 or not set, the API will continue processing the operations even if some of them fail. + operations: + type: array + items: + $ref: '#/definitions/BulkFederatedAssociationOperation' + + BulkFederatedAssociationOperation: + type: object + required: + - method + - bulkId + - path + properties: + method: + type: string + enum: + - POST + - DELETE + example: POST + description: | + HTTP method to be used for the operation. Supported methods are POST and, DELETE. These values + If the method is not specified, the operation will be treated as a bad request. + bulkId: + type: string + example: "ytrewq" + path: + type: string + example: "/b1781d25-bde5-460a-a58a-8fe8dbfd8487/federated-associations" + description: | + The path to the resource to be operated on. The path should be relative to the base path of the API. + Full path for a federated association operation would be + `/t/{tenant-domain}/api/users/v1/{user-id}/federated-associations/{association-id}`. + data: + $ref: '#/definitions/UserFederatedAssociationData' + + UserFederatedAssociationData: + type: object + properties: + idp: + type: string + example: "exampleIdP" + description: Name of the IdP + federatedUserId: + type: string + example: "john@example.com" + description: User identifier in the federated IdP + + BulkFederatedAssociationResponse: + type: object + properties: + Operations: + type: array + items: + $ref: '#/definitions/BulkAssociationOperationResponse' + + BulkAssociationOperationResponse: + type: object + properties: + bulkId: + type: string + example: "qwerty" + status: + type: object + properties: + statusCode: + type: integer + example: "400" + errorCode: + type: string + example: "UAA-10012" + errorMessage: + type: string + example: "Error while adding federated user association: 1890c6c0-d1a0-4eb4-8075-320756d75946" + errorDescription: + type: string + example: "The federated association is already associated to a local user" + securitySchemes: + OAuth2: + type: oauth2 + flows: + authorizationCode: + authorizationUrl: https://api.asgardeo.io/t/{organization-name}/oauth2/authorize + tokenUrl: https://api.asgardeo.io/t/{organization-name}/oauth2/token + scopes: {} diff --git a/docusaurus-asgardeo/static/apis/organization-apis/restapis/authenticators.yaml b/docusaurus-asgardeo/static/apis/organization-apis/restapis/authenticators.yaml new file mode 100644 index 0000000000..9327924f7c --- /dev/null +++ b/docusaurus-asgardeo/static/apis/organization-apis/restapis/authenticators.yaml @@ -0,0 +1,618 @@ +openapi: 3.0.0 +info: + version: "v1" + title: 'Authenticators API' + description: 'This document specifies a **Organization level Authenticators RESTful API** for Asgardeo.' + +servers: + - url: 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1' +security: + - OAuth2: [] + +paths: + /authenticators: + get: + tags: + - Authenticators + summary: List all authenticators in the server + description: | + List all authenticators in the server. + + Scope(Permission) required: `internal_org_authenticator_view` + parameters: + - $ref: '#/components/parameters/filterQueryParam' + - $ref: '#/components/parameters/limitQueryParam' + - $ref: '#/components/parameters/offsetQueryParam' + responses: + '200': + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/Authenticators' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + '501': + $ref: '#/components/responses/NotImplemented' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/authenticators' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + /authenticators/{authenticator-id}/connected-apps: + get: + tags: + - Connected apps of local authenticators + summary: Get connected apps by authenticator ID + operationId: getConnectedAppsOfLocalAuthenticator + description: | + By passing in the appropriate authenticator ID, you can retrieve connected app details. + + Scope(Permission) required: `internal_org_authenticator_view` + parameters: + - $ref: '#/components/parameters/limitQueryParam' + - $ref: '#/components/parameters/offsetQueryParam' + - name: authenticator-id + in: path + description: ID of an authenticator + required: true + schema: + type: string + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectedApps' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/authenticators/meta/tags' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + /authenticators/meta/tags: + get: + tags: + - Authenticators + summary: List all authenticator tags + description: | + List all authenticator tags. + + Scope(Permission) required: `internal_org_authenticator_view` + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Tags' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/authenticators/{authenticator-id}/connected-apps' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + /authenticators/custom: + post: + tags: + - User defined local authenticators + summary: | + Create a new user defined local authenticator. + description: | + This API provides the capability to create a new user defined local authenticator. + + Scope(Permission) required: `internal_org_custom_authenticator_create` + operationId: addUserDefinedLocalAuthenticator + responses: + '201': + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/Authenticator' + examples: + example: + $ref: '#/components/examples/UserDefinedAuthenticatorExample' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/UserDefinedLocalAuthenticatorCreation' + description: This represents the user defined local authenticator to be created. + required: true + /authenticators/custom/{authenticator-id}: + put: + tags: + - User defined local authenticators + summary: | + Update a user defined local authenticator. + description: | + This API provides the capability to update a user defined local authenticator configurations. + + Scope(Permission) required: `internal_org_custom_authenticator_update` + operationId: updateUserDefinedLocalAuthenticator + parameters: + - name: authenticator-id + in: path + description: ID of an authenticator + required: true + schema: + type: string + responses: + '200': + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/Authenticator' + examples: + example: + $ref: '#/components/examples/UserDefinedAuthenticatorExample' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/UserDefinedLocalAuthenticatorUpdate' + description: This represents the user defined local authenticator to be created. + required: true + delete: + tags: + - User defined local authenticators + summary: | + Delete a user defined local authenticator. + description: | + This API provides the capability to delete a user defined local authenticator. + + Scope required: `internal_org_custom_authenticator_delete` + operationId: deleteUserDefinedLocalAuthenticator + parameters: + - name: authenticator-id + in: path + description: ID of an authenticator + required: true + schema: + type: string + responses: + '204': + description: Successful response + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + +components: + parameters: + filterQueryParam: + in: query + name: filter + required: false + description: | + Condition to filter the retrieval of records. + Only supports filtering based on the 'tag' and 'name' attribute. + For local authenticators and request path authenticators, the 'displayName' is considered as the 'name' attribute during filtering. + The 'name' attribute only supports 'eq' and 'sw operations. Filtering with multiple 'name' attributes is not supported. + The 'tag' attribute only supports 'eq' operation. Filtering with multiple 'tag' attributes is supported with only 'or' as the complex query operation. + E.g. /configs/authenticators?filter=name+sw+fi+and+(tag+eq+2FA+or+tag+eq+MFA) + + schema: + type: string + limitQueryParam: + in: query + name: limit + description: > + Maximum number of records to return. _This option is not yet + supported._ + schema: + type: integer + format: int32 + minimum: 0 + offsetQueryParam: + in: query + name: offset + description: > + Number of records to skip for pagination. _This option is not yet + supported._ + schema: + type: integer + format: int32 + minimum: 0 + schemas: + Error: + type: object + required: + - code + - message + properties: + code: + type: string + example: AUT-00000 + description: An error code. + message: + type: string + example: Some Error Message + description: An error message. + description: + type: string + example: Some Error Description + description: An error description. + traceId: + type: string + example: e0fbcfeb-3617-43c4-8dd0-7b7d38e13047 + description: An error trace identifier. + Tags: + type: array + description: The list of tags available for authenticators. + items: + type: string + example: [2FA, MFA] + Authenticators: + type: array + items: + $ref: '#/components/schemas/Authenticator' + Authenticator: + type: object + properties: + id: + type: string + example: QmFzaWNBdXRoZW50aWNhdG9y + readOnly: true + name: + type: string + example: BasicAuthenticator + displayName: + type: string + example: basic + isEnabled: + type: boolean + example: true + definedBy: + type: string + enum: + - SYSTEM + - USER + readOnly: true + type: + type: string + enum: + - LOCAL + - FEDERATED + readOnly: true + image: + type: string + example: basic-authenticator-logo-url + description: + type: string + example: The basic authenticator. + tags: + type: array + items: + type: string + example: [2FA, MFA] + readOnly: true + self: + type: string + example: /t/carbon.super/api/server/v1/configs/authenticators/eDUwOUNlcnRpZmljYXRlQXV0aGVudGljYXRvcg + UserDefinedLocalAuthenticatorCreation: + description: This represents the configuration for creating a user defined local authenticator. + type: object + properties: + name: + type: string + description: The name of the user defined local authenticator. It must be started with 'custom-'. + example: custom-authenticator + id: + type: string + example: Y3VzdG9tLWF1dGhlbnRpY2F0b3I + displayName: + type: string + example: Custom Local Authenticator + isEnabled: + type: boolean + example: true + authenticationType: + type: string + enum: + - IDENTIFICATION + - VERIFICATION + image: + type: string + example: https://custom-authenticator-logo-url + description: + type: string + example: The user defined custom local authenticator. + endpoint: + $ref: '#/components/schemas/Endpoint' + required: + - name + - displayName + - isEnabled + - endpoint + UserDefinedLocalAuthenticatorUpdate: + description: This represents the configuration for updating a user defined local authenticator. + type: object + properties: + displayName: + type: string + example: Custom Local Authenticator + isEnabled: + type: boolean + example: true + image: + type: string + example: https://custom-authenticator-logo-url-new + description: + type: string + example: The user defined custom local authenticator. + endpoint: + $ref: '#/components/schemas/Endpoint' + required: + - displayName + - isEnabled + - endpoint + Endpoint: + type: object + properties: + uri: + type: string + example: https://abc.com/token + pattern: '^https?://.+' + authentication: + $ref: '#/components/schemas/AuthenticationType' + allowedHeaders: + type: array + description: List of HTTP headers to forward to the extension. + items: + type: string + example: [ "x-geo-location", "host"] + allowedParameters: + type: array + description: List of parameters to forward to the extension. + items: + type: string + example: [ "device-id"] + AuthenticationType: + type: object + description: > + The type of authentication required by the action's endpoint. The following options are supported: + + - NONE: No authentication is required.
    + ``{ + "type": "NONE" + }`` + + - BASIC: Basic authentication with a username and password.
    + ``{ + "type": "BASIC", + "properties": { + "username": "auth_username", + "password": "auth_password" + } + }`` + + - API_KEY: API key-based authentication, where the key is provided in an HTTP header.
    + ``{ + "type": "API_KEY", + "properties": { + "header": "X-API-Key", + "value": "12345-abcde-67890" + } + }`` + + - BEARER: Bearer token-based authentication.
    + ``{ + "type": "BEARER", + "properties": { + "accessToken": "0d6fed02-eac0-332b-8998-213a543139a0" + } + }`` + required: + - type + - properties + properties: + type: + type: string + enum: + - NONE + - BEARER + - API_KEY + - BASIC + example: BASIC + properties: + type: object + additionalProperties: true + example: + username: "auth_username" + password: "auth_password" + ConnectedApps: + type: object + properties: + totalResults: + type: integer + example: 10 + startIndex: + type: integer + example: 1 + count: + type: integer + example: 10 + links: + type: array + items: + $ref: '#/components/schemas/Link' + example: + [ + { + "href": "authenticator/123e4567-e89b-12d3-a456-556642440000/connected-apps?offset=50&limit=10", + "rel": "next" + }, { + "href": "authenticator/provider/123e4567-e89b-12d3-a456-556642440000/connected-apps?offset=30&limit=10", + "rel": "previous" + } + ] + connectedApps: + type: array + items: + $ref: '#/components/schemas/ConnectedApp' + ConnectedApp: + type: object + properties: + appId: + type: string + example: app-id + self: + type: string + example: /t/org/api/server/v1/applications/c74d74b2-cb62-4abd-ad66-6c45daeb561c + Link: + type: object + properties: + href: + type: string + description: Path to the target resource. + example: >- + '/t/carbon.super/api/server/v1/authenticators/394b8adcce24c64a8a09a8d80abf8c337bd253de' + rel: + type: string + description: Describes how the current context is related to the target resource. + example: authenticators + readOnly: true + #----------------------------------------------------- + # Descriptions of Authenticators API responses. + #----------------------------------------------------- + responses: + BadRequest: + description: Invalid input in the request. + content: + 'application/json': + schema: + $ref: '#/components/schemas/Error' + NotFound: + description: Requested resource is not found. + content: + 'application/json': + schema: + $ref: '#/components/schemas/Error' + Unauthorized: + description: Authentication information is missing or invalid. + Forbidden: + description: Access forbidden. + ServerError: + description: Internal server error. + content: + 'application/json': + schema: + $ref: '#/components/schemas/Error' + NotImplemented: + description: Not Implemented. + content: + 'application/json': + schema: + $ref: '#/components/schemas/Error' + #----------------------------------------------------- + # Applicable authentication mechanisms. + #----------------------------------------------------- + securitySchemes: + OAuth2: + type: oauth2 + flows: + authorizationCode: + authorizationUrl: 'https://api.asgardeo.io/t/{root-organization-name}/oauth2/authorize' + tokenUrl: 'https://api.asgardeo.io/t/{root-organization-name}/oauth2/token' + scopes: {} + examples: + UserDefinedAuthenticatorExample: + summary: "Response for user defined authenticator" + value: + id: "Y3VzdG9tLWF1dGhlbnRpY2F0b3I" + name: "custom-authenticator" + displayName: "Custom Local Authenticator" + definedBy: "USER" + type: "LOCAL" + isEnabled: true + tags: [ Custom ] + self: "/o/api/server/v1/configs/authenticators/Y3VzdG9tLWF1dGhlbnRpY2F0b3I=" diff --git a/docusaurus-asgardeo/static/apis/organization-apis/restapis/branding-management.yaml b/docusaurus-asgardeo/static/apis/organization-apis/restapis/branding-management.yaml new file mode 100644 index 0000000000..bd7fb1f6b4 --- /dev/null +++ b/docusaurus-asgardeo/static/apis/organization-apis/restapis/branding-management.yaml @@ -0,0 +1,642 @@ +openapi: 3.0.0 +info: + title: Branding Preferences API + description: | + This document specifies a RESTful API for **Managing Branding Preferences of Organizations** in Asgardeo. + version: v1 +servers: + - url: 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1' + +security: + - OAuth2: [] + +paths: + '/branding-preference': + post: + tags: + - Branding Preference + operationId: addBrandingPreference + summary: Add branding preferences for a tenant. + description: | + This API provides the capability to add a custom branding preference for an organization for the first time insted of the inherited branding from the root organization.
    + Currently this API provides the capability to only configure organization wise branding preference for 'en-US' locale.
    + + Scope(Permission) required: `internal_org_branding_preference_update` + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/BrandingPreferenceModel' + description: This represents the branding preferences to be added. + required: true + responses: + '201': + description: Successfully created. + content: + application/json: + schema: + $ref: '#/components/schemas/BrandingPreferenceModel' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + "409": + $ref: '#/components/responses/Conflict' + '500': + $ref: '#/components/responses/ServerError' + '501': + $ref: '#/components/responses/NotImplemented' + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/branding-preference' \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "type": "ORG", + "name": "WSO2", + "locale": "en-US", + "preference": { + "organizationDetails": { + "displayName": "Ballerina.io", + "siteTitle": "Login - Ballerina", + "copyrightText": "© 2021 WSO2", + "supportEmail": "support@ballerina.io" + }, + "images": { + "logo": { + "imgURL": "https://ballerina.io/img/ballerina-logo.svg", + "altText": "Ballerina.io Logo" + }, + "favicon": { + "imgURL": "https://central.ballerina.io/favicon.ico" + } + }, + "urls": { + "privacyPolicyURL": "https://ballerina.io/privacy-policy", + "termsOfUseURL": "https://ballerina.io/terms-of-service/", + "cookiePolicyURL": "https://ballerina.io/privacy-policy/#cookie-policy" + }, + "stylesheets": { + "accountApp": "https://firebasestorage.googleapis.com/v0/b/asgardeo-branding.appspot.com/o/ballerina%2Flogin-portal.overrides.css?alt=media&token=0315462e-534e-4f33-83f9-e4c092d0273d", + "myAccountApp": "https://asgardeo-branding/user-portal.css" + }, + "configs": { + "isBrandingEnabled": true, + "removeDefaultBranding": false, + "selfSignUpEnabled": true + } + } + }' + put: + tags: + - Branding Preference + operationId: updateBrandingPreference + summary: Update branding preferences of an organization. + description: | + This API provides the capability to update the branding preference of an organization.
    + + Scope(Permission) required: `internal_org_branding_preference_update` + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/BrandingPreferenceModel' + description: This represents the branding preferences to be updated. + required: true + responses: + '200' : + description: Successfully updated + content: + application/json: + schema: + $ref: '#/components/schemas/BrandingPreferenceModel' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PUT' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/branding-preference' \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "type": "ORG", + "name": "WSO2", + "locale": "en-US", + "preference": { + "organizationDetails": { + "displayName": "Ballerina.io", + "siteTitle": "Login - Ballerina", + "copyrightText": "© 2021 WSO2", + "supportEmail": "support@ballerina.io" + }, + "images": { + "logo": { + "imgURL": "https://ballerina.io/img/ballerina-logo.svg", + "altText": "Ballerina.io Logo" + }, + "favicon": { + "imgURL": "https://central.ballerina.io/favicon.ico" + } + }, + "urls": { + "privacyPolicyURL": "https://ballerina.io/privacy-policy", + "termsOfUseURL": "https://ballerina.io/terms-of-service/", + "cookiePolicyURL": "https://ballerina.io/privacy-policy/#cookie-policy" + }, + "stylesheets": { + "accountApp": "https://firebasestorage.googleapis.com/v0/b/asgardeo-branding.appspot.com/o/ballerina%2Flogin-portal.overrides.css?alt=media&token=0315462e-534e-4f33-83f9-e4c092d0273d", + "myAccountApp": "https://asgardeo-branding/user-portal.css" + }, + "configs": { + "isBrandingEnabled": true, + "removeDefaultBranding": false, + "selfSignUpEnabled": true + } + } + }' + delete: + tags: + - Branding Preference + operationId: deleteBrandingPreference + summary: Deletes branding preferences of a tenant. + description: | + This API provides the capability to delete the branding preferences of an orgnization.
    + + Scope(Permission) required: `internal_org_branding_preference_update` + parameters: + - $ref: '#/components/parameters/typeQueryParam' + - $ref: '#/components/parameters/nameQueryParam' + - $ref: '#/components/parameters/localeQueryParam' + responses: + '204' : + description: Successfully deleted. + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X 'DELETE' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/branding-preference?type=ORG&name=WSO2&locale=en-US' \ + -H 'accept: */*' + '/branding-preference/resolve': + get: + tags: + - Branding Preference + operationId: resolveBrandingPreference + summary: Resolve branding preference of an organization. + description: | + This API provides the capability to retrieve the branding preference of an organization.
    + If there is no branding preference available for the requested locale, API will check for the default locale('en-US') and return it.
    + + Scope(Permission) required: None + parameters: + - $ref: '#/components/parameters/typeQueryParam' + - $ref: '#/components/parameters/nameQueryParam' + - $ref: '#/components/parameters/localeQueryParam' + - $ref: '#/components/parameters/restrictToPublishedQueryParam' + responses: + '200': + description: OK + content: + 'application/json': + schema: + $ref: '#/components/schemas/BrandingPreferenceModel' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/{organization-id}/api/server/v1/branding-preference/resolve?type=ORG&name=WSO2&locale=en-US' \ + -H 'accept: application/json' + '/branding-preference/text': + post: + tags: + - Custom Text + operationId: addCustomText + summary: Add custom text for a tenant. + description: | + This API provides the capability to add custom texts for the specified screen & locale.
    + + Scope(Permission) required: `internal_org_branding_preference_update` + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/CustomTextModel' + description: This represents the custom text to be added. + required: true + responses: + '201': + description: Successfully created. + content: + application/json: + schema: + $ref: '#/components/schemas/CustomTextModel' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + "409": + $ref: '#/components/responses/Conflict' + '500': + $ref: '#/components/responses/ServerError' + '501': + $ref: '#/components/responses/NotImplemented' + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/branding-preference/text' \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + -d '{ + "type": "ORG", + "name": "WSO2", + "locale": "en-US", + "screen": "login", + "preference": { + "login": "Sign In", + "welcome": "Welcome", + "account.linking": "Account Linking", + "username": "Username", + "email.username": "Email address", + "back.to.sign.in": "Back to Sign In", + "or": "Or", + "dont.have.an.account": "Don'\''t have an account?" + } + }' \ + -H 'Authorization: Bearer {bearer_token}' + put: + tags: + - Custom Text + operationId: updateCustomText + summary: Update custom text of a tenant. + description: | + This API provides the capability to update the custom texts for the specified screen & locale.
    + + Scope(Permission) required: `internal_org_branding_preference_update` + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/CustomTextModel' + description: This represents the custom text content to be updated for the specified screen & locale. + required: true + responses: + '200' : + description: Successfully updated + content: + application/json: + schema: + $ref: '#/components/schemas/CustomTextModel' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PUT' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/branding-preference/text' \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + -d '{ + "type": "ORG", + "name": "WSO2", + "locale": "en-US", + "screen": "login", + "preference": { + "login": "Sign In", + "welcome": "Welcome", + "account.linking": "Account Linking", + "username": "Username", + "email.username": "Email address", + "back.to.sign.in": "Back to Sign In", + "or": "Or", + "dont.have.an.account": "Don'\''t have an account?" + } + }' \ + -H 'Authorization: Bearer {bearer_token}' + delete: + tags: + - Custom Text + operationId: deleteCustomText + summary: Deletes custom text. + description: | + This API provides the capability to delete the custom texts for the specified screen & locale of an organization.
    + If no query parameter was specified in the delete request, all the custom texts configured in the organization will be deleted.
    + + Scope(Permission) required: `internal_org_branding_preference_update` + parameters: + - $ref: '#/components/parameters/typeQueryParam' + - $ref: '#/components/parameters/nameQueryParam' + - $ref: '#/components/parameters/localeQueryParam' + - $ref: '#/components/parameters/screenQueryParam' + responses: + '204' : + description: Successfully deleted. + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X 'DELETE' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/branding-preference/text?type=ORG&name=WSO2&locale=en-US&screen=login' \ + -H 'accept: */*' + '/branding-preference/text/resolve': + get: + tags: + - Custom Text + operationId: resolveCustomText + summary: Resolve custom text of an organization. + description: | + This API provides the capability to retrieve the custom text configurations of an organization/specific application.
    + If there is no custom text available for the requested locale, API will check for the default locale('en-US') and return it.
    + If there is no custom text available for the requested organization, API will check for the parent organization's custom text configurations and return it.
    + + Scope(Permission) required: None + parameters: + - $ref: '#/components/parameters/typeQueryParam' + - $ref: '#/components/parameters/nameQueryParam' + - $ref: '#/components/parameters/localeQueryParam' + - $ref: '#/components/parameters/screenQueryParam' + responses: + '200': + description: OK + content: + 'application/json': + schema: + $ref: '#/components/schemas/CustomTextModel' + '400': + $ref: '#/components/responses/BadRequest' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/{organization-id}/api/server/v1/branding-preference/text/resolve?type=ORG&name=WSO2&locale=en-US&screen=login' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' +components: + parameters: + typeQueryParam: + in: query + name: type + required: false + description: Type to filter the retrieval of customizations. + schema: + type: string + enum: + - ORG + - APP + - CUSTOM + example: "ORG" + nameQueryParam: + in: query + name: name + required: false + description: Tenant/Application name to filter the retrieval of customizations. + schema: + type: string + example: "WSO2" + localeQueryParam: + in: query + name: locale + required: false + description: Locale to filter the retrieval of customizations. + schema: + type: string + example: "en-US" + screenQueryParam: + in: query + name: screen + required: false + description: Screen to filter the retrieval of customizations. + schema: + type: string + example: "login" + restrictToPublishedQueryParam: + in: query + name: restrictToPublished + required: false + description: | + Specifies whether to limit resolving to published branding preferences. + If set to true, branding preference will be resolved only using published branding preferences. + If set to false, branding preference will be resolved using both published and unpublished branding preferences. + schema: + type: boolean + default: false + example: true + + schemas: + BrandingPreferenceModel: + required: + - type + - preference + type: object + properties: + type: + type: string + enum: + - ORG + - APP + - CUSTOM + example: "ORG" + name: + type: string + example: "WSO2" + locale: + type: string + example: "en-US" + default: "en-US" + preference: + type: object + description: "This is the JSON structured branding preference" + example: { + "organizationDetails": { + "displayName": "Ballerina.io", + "siteTitle": "Login - Ballerina", + "copyrightText": "© 2021 WSO2", + "supportEmail": "support@ballerina.io" + }, + "images": { + "logo": { + "imgURL": "https://ballerina.io/img/ballerina-logo.svg", + "altText": "Ballerina.io Logo" + }, + "favicon": { + "imgURL": "https://central.ballerina.io/favicon.ico" + } + }, + "urls": { + "privacyPolicyURL": "https://ballerina.io/privacy-policy", + "termsOfUseURL": "https://ballerina.io/terms-of-service/", + "cookiePolicyURL": "https://ballerina.io/privacy-policy/#cookie-policy" + }, + "stylesheets": { + "accountApp": "https://firebasestorage.googleapis.com/v0/b/asgardeo-branding.appspot.com/o/ballerina%2Flogin-portal.overrides.css?alt=media&token=0315462e-534e-4f33-83f9-e4c092d0273d", + "myAccountApp": "https://asgardeo-branding/user-portal.css" + }, + "configs": { + "isBrandingEnabled": true, + "removeDefaultBranding": false, + "selfSignUpEnabled": true + } + } + + CustomTextModel: + required: + - type + - screen + - preference + type: object + properties: + type: + type: string + enum: + - ORG + - APP + - CUSTOM + example: "ORG" + name: + type: string + example: "WSO2" + locale: + type: string + example: "en-US" + default: "en-US" + screen: + type: string + example: "login" + preference: + type: object + description: "This is the JSON structured branding preference" + example: { + "login": "Sign In", + "welcome": "Welcome", + "account.linking": "Account Linking", + "username": "Username", + "email.username": "Email address", + "back.to.sign.in": "Back to Sign In", + "or": "Or", + "dont.have.an.account": "Don't have an account?" + } + + Error: + type: object + required: + - code + - message + properties: + code: + type: string + example: BPM-60001 + message: + type: string + example: Some Error Message + description: + type: string + example: Some Error Description + traceId: + type: string + example: 3erfee-232-efewv-2321-43ferfe24r + + #----------------------------------------------------- + # Descriptions of Branding Preference API responses. + #----------------------------------------------------- + responses: + BadRequest: + description: Invalid input in the request. + content: + 'application/json': + schema: + $ref: '#/components/schemas/Error' + Unauthorized: + description: Authentication information is missing or invalid. + Forbidden: + description: Access forbidden. + NotFound: + description: Requested resource is not found. + content: + 'application/json': + schema: + $ref: '#/components/schemas/Error' + Conflict: + description: Conflict. + content: + 'application/json': + schema: + $ref: '#/components/schemas/Error' + ServerError: + description: Internal server error. + content: + 'application/json': + schema: + $ref: '#/components/schemas/Error' + NotImplemented: + description: Not Implemented. + content: + 'application/json': + schema: + $ref: '#/components/schemas/Error' + + #----------------------------------------------------- + # Applicable authentication mechanisms. + #----------------------------------------------------- + securitySchemes: + OAuth2: + type: oauth2 + flows: + authorizationCode: + authorizationUrl: 'https://api.asgardeo.io/t/{root-organization-name}/oauth2/authorize' + tokenUrl: 'https://api.asgardeo.io/t/{root-organization-name}/oauth2/token' + scopes: {} diff --git a/docusaurus-asgardeo/static/apis/organization-apis/restapis/claim-management.yaml b/docusaurus-asgardeo/static/apis/organization-apis/restapis/claim-management.yaml new file mode 100644 index 0000000000..3fa57c9b68 --- /dev/null +++ b/docusaurus-asgardeo/static/apis/organization-apis/restapis/claim-management.yaml @@ -0,0 +1,677 @@ +openapi: 3.0.1 +info: + title: Claim Management API + description: | + This document specifies an **Organization level Claim Management RESTful API** for Asgardeo. + + This API allows retrieving local/external claims and claim dialects. Organizations have the default claims/claim dialtect defined in Asgardeo and custom claims used by B2B shared apps. + version: v1 +servers: + - url: https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1 + +security: + - OAuth2: [] + +tags: + - name: management + description: Secured Admin-only calls +paths: + /claim-dialects/local/claims: + get: + tags: + - management + summary: Retrieve local claims + description: | + Retrieve local claims.
    + + Scope(Permission) required: `internal_org_claim_meta_view` + operationId: getLocalClaims + parameters: + - name: attributes + in: query + description: Define only the required attributes to be sent in the response + object.
    This option is not yet supported. + schema: + type: string + - name: limit + in: query + description: Maximum number of records to return.
    This option is not yet supported. + schema: + type: integer + format: int32 + - name: offset + in: query + description: Number of records to skip for pagination.
    This option is not yet supported. + schema: + type: integer + format: int32 + - name: filter + in: query + description: Condition to filter the retrieval of records.
    This option is not yet supported. + schema: + type: string + - name: sort + in: query + description: Define the order by which the retrieved records should be sorted.
    This option is not yet supported. + schema: + type: string + responses: + 200: + description: Local claims. + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/LocalClaimRes' + 401: + description: Unauthorized. + content: {} + 500: + description: Internal Server Error. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 501: + description: Not Implemented. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/claim-dialects/local/claims' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + /claim-dialects/local/claims/{claim-id}: + get: + tags: + - management + summary: Retrieve local claim by ID + description: | + Retrieve a local claim matching the given claim ID.
    + + Scope(Permission) required: `internal_org_claim_meta_view` + operationId: getLocalClaim + parameters: + - name: claim-id + in: path + description: Id of the claim. + required: true + schema: + type: string + responses: + 200: + description: Requested claim. + content: + application/json: + schema: + $ref: '#/components/schemas/LocalClaimRes' + 400: + description: Invalid input request. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 401: + description: Unauthorized. + content: {} + 403: + description: Resource Forbidden. + content: {} + 404: + description: The specified resource is not found. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 500: + description: Internal Server Error. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/claim-dialects/local/claims/{claim-id}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + /claim-dialects: + get: + tags: + - management + summary: Retrieve claim dialects + description: | + Retrieve claim dialects.
    + + Scope(Permission) required: `internal_org_claim_meta_view` + operationId: getClaimDialects + parameters: + - name: limit + in: query + description: Maximum number of records to return.
    This option is not yet supported. + schema: + type: integer + format: int32 + - name: offset + in: query + description: Number of records to skip for pagination.
    This option is not yet supported. + schema: + type: integer + format: int32 + - name: filter + in: query + description: Condition to filter the retrieval of records.
    This option is not yet supported. + schema: + type: string + - name: sort + in: query + description: Define the order by which the retrieved records should be sorted.
    This option is not yet supported. + schema: + type: string + responses: + 200: + description: Claim dialects. + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/ClaimDialectRes' + 401: + description: Unauthorized. + content: {} + 500: + description: Internal Server Error. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 501: + description: Not Implemented. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/claim-dialects' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + /claim-dialects/{dialect-id}: + get: + tags: + - management + summary: Retrieve claim dialect + description: | + Retrieve a claim dialect matching the given dialect id.
    + + Scope(Permission) required: `internal_org_claim_meta_view`
    + operationId: getClaimDialect + parameters: + - name: dialect-id + in: path + description: Id of the claim dialect. + required: true + schema: + type: string + responses: + 200: + description: Requested claim dialect. + content: + application/json: + schema: + $ref: '#/components/schemas/ClaimDialectRes' + 400: + description: Invalid input request. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 401: + description: Unauthorized. + content: {} + 403: + description: Resource Forbidden. + content: {} + 404: + description: The specified resource is not found. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 500: + description: Internal Server Error. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/claim-dialects/{dialect-id}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + /claim-dialects/{dialect-id}/claims: + get: + tags: + - management + summary: Retrieve external claims + description: | + Retrieve External claims.
    + + Scope(Permission) required: `internal_org_claim_meta_view` + operationId: getExternalClaims + parameters: + - name: dialect-id + in: path + description: Id of the claim dialect. + required: true + schema: + type: string + - name: limit + in: query + description: Maximum number of records to return.
    This option is not yet supported. + schema: + type: integer + format: int32 + - name: offset + in: query + description: Number of records to skip for pagination.
    This option is not yet supported. + schema: + type: integer + format: int32 + - name: filter + in: query + description: Condition to filter the retrieval of records.
    This option is not yet supported. + schema: + type: string + - name: sort + in: query + description: Define the order by which the retrieved records should be sorted.
    This option is not yet supported. + schema: + type: string + responses: + 200: + description: External claims. + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/ExternalClaimRes' + 401: + description: Unauthorized. + content: {} + 404: + description: The specified resource is not found. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 500: + description: Internal Server Error. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 501: + description: Not Implemented. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/claim-dialects/{dialect-id}/claims' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + /claim-dialects/{dialect-id}/claims/{claim-id}: + get: + tags: + - management + summary: Retrieve external claim + description: | + Retrieve an external claim matching the given dialect ID and claim ID.
    + + Scope(Permission) required: `internal_org_claim_meta_view` + operationId: getExternalClaim + parameters: + - name: dialect-id + in: path + description: ID of the claim dialect. + required: true + schema: + type: string + - name: claim-id + in: path + description: ID of the claim. + required: true + schema: + type: string + responses: + 200: + description: Requested claim. + content: + application/json: + schema: + $ref: '#/components/schemas/ExternalClaimRes' + 400: + description: Invalid input request. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 401: + description: Unauthorized. + content: {} + 403: + description: Resource Forbidden. + content: {} + 404: + description: The specified resource is not found. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 500: + description: Internal Server Error. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/claim-dialects/{dialect-id}/claims/{claim-id}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' +components: + schemas: + LocalClaimRes: + type: object + properties: + id: + type: string + description: claim ID. + example: 394b8adcce24c64a8a09a8d80abf8c337bd253de + claimURI: + type: string + description: A unique URI specific to the claim. + example: http://wso2.org/claims/username + dialectURI: + type: string + description: URI of the claim dialect. + example: http://wso2.org/claims + description: + type: string + description: Description of the claim. + example: Some description about the claim. + displayOrder: + type: integer + description: The order in which the claim is displayed among other claims + under the same dialect. + example: 10 + displayName: + type: string + description: Name of the claim to be displayed in the UI. + example: Username + readOnly: + type: boolean + description: Specifies if the claim is read-only. + example: true + regEx: + type: string + description: Regular expression used to validate inputs. + example: ^([a-zA-Z)$ + required: + type: boolean + description: Specifies if the claim is required for user registration. + example: true + supportedByDefault: + type: boolean + description: Specifies if the claim will be prompted during user registration + and displayed on the user profile. + example: true + uniquenessScope: + type: string + description: Specifies the scope of uniqueness validation for the claim value. + enum: + - NONE + - WITHIN_USERSTORE + - ACROSS_USERSTORES + example: "NONE" + sharedProfileValueResolvingMethod: + type: string + description: Specifies claim value resolving method for shared user profile. + enum: + - FromOrigin + - FromSharedProfile + - FromFirstFoundInHierarchy + example: "FromOrigin" + attributeMapping: + type: array + description: Userstore attribute mappings. + items: + $ref: '#/components/schemas/AttributeMapping' + properties: + type: array + description: Define any additional properties if required. + items: + $ref: '#/components/schemas/Property' + description: Local claim response. + AttributeMapping: + required: + - mappedAttribute + - userstore + type: object + properties: + mappedAttribute: + type: string + description: Userstore attribute to be mapped to. + example: username + userstore: + type: string + description: Userstore domain name. + example: SECONDARY + description: Claim user store attribute mapping. + ClaimDialectRes: + type: object + properties: + id: + type: string + description: Dialect id. + example: 394b8adcce24c64a8a09a0d80abf8c337bd253de + dialectURI: + type: string + description: URI of the claim dialect. + example: urn:ietf:params:scim:schemas:core:2.0:User + link: + $ref: '#/components/schemas/Link' + description: Claim dialect response. + ExternalClaimRes: + type: object + properties: + id: + type: string + description: External claim ID. + example: 394b8adcce24c64a8a09a0d80abf8c337dd255de + claimURI: + type: string + description: Claim URI of the external claim. + example: ' urn:ietf:params:scim:schemas:core:2.0:User:userName' + claimDialectURI: + type: string + description: Dialect URI of the external claim. + example: urn:ietf:params:scim:schemas:core:2.0:User + mappedLocalClaimURI: + type: string + description: The local claim URI to map with the external claim. + example: http://wso2.org/claims/username + properties: + type: array + description: Define any additional properties if required. + items: + $ref: '#/components/schemas/Property' + description: External claim response. + Property: + required: + - key + - value + type: object + properties: + key: + type: string + value: + type: string + Link: + type: object + properties: + href: + type: string + description: Relative path to the target resource. + example: 394b8adcce24c64a8a09a8d80abf8c337bd253de/claims + rel: + type: string + description: Describes how the current context is related to the target + resource. + example: claims + Error: + required: + - code + - message + type: object + properties: + code: + type: string + example: AAA-00000 + message: + type: string + example: Some Error Message + description: + type: string + example: Some Error Description + traceId: + type: string + example: e0fbcfeb-3617-43c4-8dd0-7b7d38e13047 + responses: + Conflict: + description: Element Already Exists. + content: + '*/*': + schema: + $ref: '#/components/schemas/Error' + Created: + description: Item Created. + headers: + Location: + description: URI of the created resource. + schema: + type: string + content: {} + Forbidden: + description: Resource Forbidden. + content: {} + InvalidInput: + description: Invalid input request. + content: + '*/*': + schema: + $ref: '#/components/schemas/Error' + NoContent: + description: No Content. + content: {} + NotFound: + description: The specified resource is not found. + content: + '*/*': + schema: + $ref: '#/components/schemas/Error' + NotImplemented: + description: Not Implemented. + content: + '*/*': + schema: + $ref: '#/components/schemas/Error' + OK: + description: OK. + content: {} + ServerError: + description: Internal Server Error. + content: + '*/*': + schema: + $ref: '#/components/schemas/Error' + Unauthorized: + description: Unauthorized. + content: {} + parameters: + limitQueryParam: + name: limit + in: query + description: Maximum number of records to return. + schema: + type: integer + format: int32 + offsetQueryParam: + name: offset + in: query + description: Number of records to skip for pagination. + schema: + type: integer + format: int32 + filterQueryParam: + name: filter + in: query + description: Condition to filter the retrieval of records. + schema: + type: string + sortQueryParam: + name: sort + in: query + description: Define the order by which the retrieved records should be sorted. + schema: + type: string + attributesQueryParam: + name: attributes + in: query + description: Define only the required attributes to be sent in the response + object. + schema: + type: string + dialectIdPathParam: + name: dialect-id + in: path + description: Id of the claim dialect. + required: true + schema: + type: string + claimIdPathParam: + name: claim-id + in: path + description: Id of the claim. + required: true + schema: + type: string + securitySchemes: + OAuth2: + type: oauth2 + flows: + authorizationCode: + authorizationUrl: https://api.asgardeo.io/t/{root-organization-name}/oauth/authorize + tokenUrl: https://api.asgardeo.io/t/{root-organization-name}/oauth/token + scopes: + read: Grants read access + write: Grants write access + admin: Grants read and write access to administrative information diff --git a/docusaurus-asgardeo/static/apis/organization-apis/restapis/end-user-credential-management.yaml b/docusaurus-asgardeo/static/apis/organization-apis/restapis/end-user-credential-management.yaml new file mode 100644 index 0000000000..51626a6f6e --- /dev/null +++ b/docusaurus-asgardeo/static/apis/organization-apis/restapis/end-user-credential-management.yaml @@ -0,0 +1,198 @@ +openapi: 3.0.0 +info: + description: | + The Credential Management REST API provides a comprehensive interface to list and delete + credentials enrolled by end-users within the WSO2 Identity Server. The administrators who are assigned with privileges to list and delete + users (with scopes internal_user_mgt_view and internal_user_mgt_delete) are able to perform these operations. This API currently supports passkey and push + authentication credentials. + + version: '1.0' + title: WSO2 Identity Server - User Credential Management Rest API + +security: + - OAuth2: [] + - BasicAuth: [] + +servers: + - url: https://{server-url}/t/{tenant-domain}/api/server/v1 + variables: + tenant-domain: + default: carbon.super + server-url: + default: localhost:9443 + +paths: + /users/{user-id}/credentials: + get: + summary: List end-user enrolled credentials + description: "Retrieves a list of all user-enrolled credentials. + \n\n Scope (Permission) required: ``internal_user_mgt_view``\n\n" + operationId: getUserCredentialsById + tags: + - List User Credentials + parameters: + - name: user-id + in: path + description: The unique identifier of the user. + required: true + schema: + type: string + responses: + '200': + description: OK + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Credential' + examples: + response: + value: + [ + { + "credentialId": "TJwhlvGKrEk7xSSKLrhoCsaA", + "displayName": "My Security Key", + "type": "PASSKEY" + }, + { + "credentialId": "996a12a0-b9aab-48ab-8016-d0ffd99ebe1b", + "displayName": "My phone", + "type": "PUSH_AUTH" + } + ] + '400': + description: Bad Request. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '403': + description: Forbidden. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '404': + description: User Not Found. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Internal Server Error. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + + /users/{user-id}/credentials/{type}/{credential-id}: + delete: + summary: Delete a user-enrolled credential. + description: "Deletes a specific enrolled credential for a user. + \n\n Scope (Permission) required: ``internal_user_mgt_delete``\n\n" + operationId: deleteUserCredentialById + tags: + - Delete User Credential + parameters: + - name: user-id + in: path + description: The unique identifier of the user. + required: true + schema: + type: string + - name: type + in: path + description: The type of the credential. + required: true + schema: + type: string + enum: [passkey, push-auth] + - name: credential-id + in: path + description: The unique identifier of the device to be deleted. + required: true + schema: + type: string + responses: + '204': + description: User Credential Deleted. + '400': + description: Bad Request. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '403': + description: Forbidden. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Internal Server Error. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' +components: + securitySchemes: + BasicAuth: + type: http + scheme: basic + OAuth2: + type: oauth2 + flows: + authorizationCode: + authorizationUrl: 'https://localhost:9443/oauth2/authorize' + tokenUrl: 'https://localhost:9443/oauth2/token' + scopes: + read: internal_user_mgt_view + delete: internal_user_mgt_delete + schemas: + Credential: + type: object + properties: + credentialId: + type: string + description: The unique identifier for the credential. + example: 'a5a81c76-27a3-42d4-82a8-55285d82a4a1' + displayName: + type: string + description: A user-friendly name for the credential. + example: "YubiKey 5C" + type: + type: string + description: The type of the credential. + enum: [passkey, push-auth] + Error: + type: object + properties: + code: + type: string + description: Some error description. + example: 'CM-00001' + message: + type: string + description: Some error message. + example: 'Some error message.' + description: + type: string + description: A more detailed explanation of the error. + example: 'Some error description.' + traceId: + type: string + description: The unique identifier for the request. + example: '8a5f5d4e-1d2c-4f3b-9c6e-7d8f9a0b1c2d' diff --git a/docusaurus-asgardeo/static/apis/organization-apis/restapis/idle-account-identification.yaml b/docusaurus-asgardeo/static/apis/organization-apis/restapis/idle-account-identification.yaml new file mode 100644 index 0000000000..db3e198d0b --- /dev/null +++ b/docusaurus-asgardeo/static/apis/organization-apis/restapis/idle-account-identification.yaml @@ -0,0 +1,135 @@ +openapi: 3.0.0 +info: + description: + "This document specifies a RESTful API for identifying idle business user accounts in Asgardeo. The API provides the capability to retrieve a list of inactive users after a specified date. + \n\n To access the idle account identification API in Asgardeo, you need to first get an access token from your organization." + version: "v1" + title: Asgardeo - Idle Account Identification Rest API +security: + - OAuth2: [] +servers: + - url: 'https://api.asgardeo.io/t/{root-organization-name}/o/api/idle-account-identification/v1' +paths: + /inactive-users: + get: + tags: + - Get inactive users + description: "Get inactive users after a specified date. \n\n Scope required: ``internal_org_user_mgt_list``" + operationId: getInactiveUsers + parameters: + - in: query + name: inactiveAfter + schema: + type: string + description: Users without login activity after this date are considered inactive. + example: 2023-01-31 + required: true + - in: query + name: excludeBefore + schema: + type: string + description: Users whose last login activity is before the specified date will be excluded from the list of inactive users included in the response. + example: 2023-01-01 + responses: + '200': + $ref: '#/components/responses/Success' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/idle-account-identification/v1/inactive-users?inactiveAfter=2023-01-31&excludeBefore=2023-01-01' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' +components: + schemas: + Error: + type: object + required: + - code + - message + properties: + code: + type: string + example: 80001 + message: + type: string + example: Some error message + description: + type: string + example: Some error description + Unauthorized: + type: object + required: + - code + - message + properties: + code: + type: string + example: 401 + message: + type: string + example: Unauthorized + description: + type: string + example: You are unauthorized to make this request + InactiveUsersList: + type: array + items: + $ref: '#/components/schemas/InactiveUser' + InactiveUser: + type: object + properties: + userId: + type: string + username: + type: string + userStoreDomain: + type: string + required: + - username + example: + userId: 3c780e73-9ca6-4e49-811e-8e697df22a91 + username: JohnDoe + userStoreDomain: DEFAULT + responses: + Unauthorized: + description: Unauthorized + content: + 'application/json': + schema: + $ref: '#/components/schemas/Unauthorized' + Forbidden: + description: Resource Forbidden + ServerError: + description: Internal Server Error + content: + 'application/json': + schema: + $ref: '#/components/schemas/Error' + BadRequest: + description: Invalid Input Request. + content: + 'application/json': + schema: + $ref: '#/components/schemas/Error' + Success: + description: Inactive users returned successfully. + content: + 'application/json': + schema: + $ref: '#/components/schemas/InactiveUsersList' + securitySchemes: + OAuth2: + type: oauth2 + description: "**Authorization code OAuth flow** + **Organization Switch** + \n\n Scopes: + \n\n - ```internal_org_user_mgt_list```: Grant permissions to read user records." + diff --git a/docusaurus-asgardeo/static/apis/organization-apis/restapis/idp.yaml b/docusaurus-asgardeo/static/apis/organization-apis/restapis/idp.yaml new file mode 100644 index 0000000000..8908d08ec6 --- /dev/null +++ b/docusaurus-asgardeo/static/apis/organization-apis/restapis/idp.yaml @@ -0,0 +1,3171 @@ +openapi: 3.0.0 +info: + description: > + This document specifies the **Identity Provider Management API** for organizations in Asgardeo. The APIs provide the capability to add/update/delete/patch identity providers. + In addition, APIs are available to retrieve metadata about federated authenticators and outbound provisioning connectors that can be configured for any given identity provider. + version: "v1" + title: Asgardeo - Identity provider management API definition +security: + - OAuth2: [] +paths: + /identity-providers: + get: + tags: + - Identity Providers + summary: | + List identity providers + description: > + This API provides the capability to retrieve the list of identity + providers.
    + Scope required: `internal_org_idp_view` + operationId: getIDPs + parameters: + - $ref: '#/components/parameters/limitQueryParam' + - $ref: '#/components/parameters/offsetQueryParam' + - $ref: '#/components/parameters/filterQueryParam' + - $ref: '#/components/parameters/sortQueryParam' + - $ref: '#/components/parameters/sortByQueryParam' + - $ref: '#/components/parameters/requiredAttributesQueryParam' + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/IdentityProviderListResponse' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '501': + description: Not Implemented + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/identity-providers' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + post: + tags: + - Identity Providers + summary: | + Add a new identity provider + description: | + This API provides the capability to create a new identity provider.
    + Scope required: `internal_org_idp_create` + operationId: addIDP + responses: + '201': + description: Successful response + headers: + Location: + description: Location of the newly created identity provider. + schema: + type: string + content: + application/json: + schema: + $ref: '#/components/schemas/IdentityProviderResponse' + examples: + identityProviderWithSystemDefinedAuthenticator: + $ref: '#/components/examples/SystemDefinedIdentityProviderResponseExample' + identityProviderWithUserDefineAuthenticator: + $ref: '#/components/examples/UserDefinedIdentityProviderResponseExample' + application/xml: + schema: + $ref: '#/components/schemas/IdentityProviderResponse' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + application/xml: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '409': + description: Conflict + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + application/xml: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + application/xml: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/identity-providers' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -H 'Content-Type: application/json' \ + -d '{ + "name": "google", + "description": "IdP for Google Federation", + "image": "google-logo-url", + "isPrimary": false, + "isFederationHub": false, + "homeRealmIdentifier": "localhost", + "certificate": { + "certificates": [ + "string" + ], + "jwksUri": "jwks endpoint of IDP" + }, + "claims": { + "userIdClaim": { + "uri": "http://wso2.org/claims/username" + }, + "mappings": [ + { + "idpClaim": "country", + "localClaim": { + "uri": "http://wso2.org/claims/username" + } + } + ], + "provisioningClaims": [ + { + "claim": { + "uri": "http://wso2.org/claims/username" + }, + "defaultValue": "sathya" + } + ] + }, + "federatedAuthenticators": { + "defaultAuthenticatorId": "U0FNTDJBdXRoZW50aWNhdG9y", + "authenticators": [ + { + "authenticatorId": "U0FNTDJBdXRoZW50aWNhdG9y", + "isEnabled": true, + "isDefault": false, + "properties": [ + { + "key": "somePropertyKey", + "value": "somePropertyValue" + } + ] + } + ] + }, + "provisioning": { + "jit": { + "isEnabled": true, + "scheme": "PROVISION_SILENTLY", + "userstore": "DEFAULT", + "attributeSyncMethod": "OVERRIDE_ALL", + "associateLocalUser": true, + "accountLookupAttributeMappings": [ + { + "federatedAttribute": "email", + "localAttribute": "http://wso2.org/claims/email" + }, + { + "federatedAttribute": "mobile", + "localAttribute": "http://wso2.org/claims/mobile" + } + ] + }, + "outboundConnectors": { + "defaultConnectorId": "U0NJTQ", + "connectors": [ + { + "connectorId": "U0NJTQ", + "isEnabled": true, + "isDefault": false, + "blockingEnabled": false, + "rulesEnabled": false, + "properties": [ + { + "key": "somePropertyKey", + "value": "somePropertyValue" + } + ] + } + ] + } + } + }' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/IdentityProviderPOSTRequest' + examples: + identityProviderWithSystemDefinedAuthenticator: + $ref: '#/components/examples/IdentityProviderWithSystemDefinedAuthenticatorPOSTRequestExample' + identityProviderWithUserDefineAuthenticator: + $ref: '#/components/examples/IdentityProviderWithUserDefinedAuthenticatorPOSTRequestExample' + application/xml: + schema: + $ref: '#/components/schemas/IdentityProviderPOSTRequest' + description: This represents the identity provider to be created. + required: true + /identity-providers/meta/federated-authenticators: + get: + tags: + - Metadata + summary: | + Metadata about supported federated authenticators of identity providers + description: >- + This API provides the list of supported federated authenticators for an identity provider in Asgardeo.
    + Scope required: `internal_org_idp_view` + operationId: getMetaFederatedAuthenticators + responses: + '200': + description: OK + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/MetaFederatedAuthenticatorListItem' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://localhost:9443/o/api/server/v1/identity-providers/meta/federated-authenticators' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + /identity-providers/meta/federated-authenticators/{federated-authenticator-id}: + get: + tags: + - Metadata + summary: | + Metadata about a supported federated authenticator + description: > + This API provides the details of a single supported federated + authenticator for an identity provider in Asgardeo.
    + Scope required: `internal_org_idp_view` + operationId: getMetaFederatedAuthenticator + parameters: + - name: federated-authenticator-id + in: path + description: ID of a federated authenticator + required: true + schema: + type: string + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/MetaFederatedAuthenticator' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://localhost:9443/o/api/server/v1/identity-providers/meta/federated-authenticators/{federated-authenticator-id}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + /identity-providers/meta/outbound-provisioning-connectors: + get: + tags: + - Metadata + summary: > + Metadata about supported outbound provisioning connectors by identity providers in Asgardeo + description: >- + This API provides the list of supported federated authenticators for an + IdP in Asgardeo.
    + Scope required: `internal_org_idp_view` + operationId: getMetaOutboundConnectors + responses: + '200': + description: OK + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/MetaOutboundConnectorListItem' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://localhost:9443/o/api/server/v1/identity-providers/meta/outbound-provisioning-connectors' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + /identity-providers/meta/outbound-provisioning-connectors/{outbound-provisioning-connector-id}: + get: + tags: + - Metadata + summary: | + Metadata about supported outbound provisioning connectors + description: >- + This API provides the details of a single supported outbound + provisioning connector for an IdP in Asgardeo.
    + Scope required: `internal_org_idp_view` + operationId: getMetaOutboundConnector + parameters: + - name: outbound-provisioning-connector-id + in: path + description: ID of an Outbound Provisioning Connector + required: true + schema: + type: string + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/MetaOutboundConnector' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://localhost:9443/o/api/server/v1/identity-providers/meta/outbound-provisioning-connectors/{outbound-provisioning-connector-id}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + /identity-providers/{identity-provider-id}: + get: + tags: + - Identity Providers + summary: | + Retrieve identity provider by identity provider's ID + description: > + This API provides the capability to retrieve the identity provider + details by using its ID. Furthermore, by specifying the "Accept : + application/xml" header, it provides the ability to export IdP data as + XML.
    + Scope required: `internal_org_idp_view` + operationId: getIDP + parameters: + - name: identity-provider-id + in: path + description: ID of the identity provider. + required: true + schema: + type: string + responses: + '200': + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/IdentityProviderResponse' + examples: + identityProviderWithSystemDefinedAuthenticator: + $ref: '#/components/examples/SystemDefinedIdentityProviderResponseExample' + identityProviderWithUserDefineAuthenticator: + $ref: '#/components/examples/UserDefinedIdentityProviderResponseExample' + application/xml: + schema: + $ref: '#/components/schemas/IdentityProviderResponse' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + application/xml: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + application/xml: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + application/xml: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://localhost:9443/o/api/server/v1/identity-providers/{identity-provider-id}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + patch: + tags: + - Identity Providers + summary: > + Patch an identity provider property by ID + description: > + This API provides the capability to update an identity provider property using a patch request. IdP patch is supported only for key-value pairs.
    + Scope required: `internal_org_idp_update` + operationId: patchIDP + parameters: + - name: identity-provider-id + in: path + description: ID of the identity provider. + required: true + schema: + type: string + responses: + '200': + description: Successful response + headers: + Location: + description: Location of the updated identity provider. + schema: + type: string + content: + application/json: + schema: + $ref: '#/components/schemas/IdentityProviderResponse' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PATCH' \ + 'https://localhost:9443/o/api/server/v1/identity-providers/{identity-provider-id}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -H 'Content-Type: application/json' \ + -d '[ + { + "operation": "REPLACE", + "path": "/homeRealmIdentifier", + "value": "google" + } + ]' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchRequest' + required: true + delete: + tags: + - Identity Providers + summary: | + Delete an identity provider by ID + description: > + This API provides the capability to delete an identity provider by + giving its ID.
    + Scope required: `internal_org_idp_delete` + operationId: deleteIDP + parameters: + - name: identity-provider-id + in: path + description: ID of the identity provider + required: true + schema: + type: string + - $ref: '#/components/parameters/forceQueryParam' + responses: + '204': + description: Successfully Deleted + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'DELETE' \ + 'https://localhost:9443/o/api/server/v1/identity-providers/{identity-provider-id}?force=false' \ + -H 'accept: */*' \ + -H 'Authorization: Bearer {bearer_token}' + /identity-providers/{identity-provider-id}/export: + get: + tags: + - Identity Providers + summary: | + Export identity provider in XML, YAML, or JSON file formats + description: | + This API provides the capability to retrieve the identity provider by ID. The identity provider is retrieved as an `XML`, `YAML`, or `JSON` file. Use `LOCAL` as the ID to export resident IdP configurations.
    + Scope required: `internal_org_idp_view` + operationId: exportIDPToFile + parameters: + - name: identity-provider-id + in: path + description: ID of the identity provider. + required: true + schema: + type: string + - $ref: '#/components/parameters/excludeSecretsQueryParam' + - $ref: '#/components/parameters/fileTypeHeaderParam' + responses: + '200': + description: Successful response + content: + application/json: + schema: + type: string + example: 'Sample application configuration in the requested format' + application/yaml: + schema: + type: string + example: 'Sample application configuration in the requested format' + application/xml: + schema: + type: string + example: 'Sample application configuration in the requested format' + application/octet-stream: + schema: + type: string + example: 'Sample application configuration in the requested format' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://localhost:9443/o/api/server/v1/identity-providers/{identity-provider-id}/export?excludeSecrets=true' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + '/identity-providers/{identity-provider-id}/import': + put: + tags: + - Identity Providers + summary: | + Update identity provider from an exported YAML, XML or JSON file + description: > + This API provides the capability to update an existing identity provider from + the information provided as a file. Use `LOCAL` as the ID to update resident IDP configurations.
    + Scope required: `internal_org_idp_update` + operationId: updateIDPFromFile + parameters: + - name: identity-provider-id + in: path + description: ID of the identity provider. + required: true + schema: + type: string + requestBody: + content: + multipart/form-data: + schema: + $ref: '#/components/schemas/FileUpload' + description: This represents the application to be updated. + responses: + '200': + description: Successfully Updated. + headers: + Location: + description: Location of the updated application. + schema: + type: string + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '409': + description: Conflict + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PUT' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/identity-providers/{identity-provider-id}/import' \ + -H 'accept: */*' \ + -H 'Content-Type: multipart/form-data' \ + -H 'Authorization: Bearer {bearer_token}' \ + -F 'file=@file-name.xml;type=text/xml' + /identity-providers/import: + post: + tags: + - Identity Providers + summary: | + Create an IdP from an exported XML, YAML, or JSON file + description: > + This API provides the capability to import an identity provider from + the information provided as a file.
    + Scope required: `internal_org_idp_create` + operationId: importIDPFromFile + requestBody: + content: + multipart/form-data: + schema: + $ref: '#/components/schemas/FileUpload' + description: This represents the identity provider to be created. + responses: + '201': + description: Successfully created. + headers: + Location: + description: Location of the newly created identity provider. + schema: + type: string + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '409': + description: Conflict + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/identity-providers/import' \ + -H 'accept: */*' \ + -H 'Content-Type: multipart/form-data' \ + -H 'Authorization: Bearer {bearer_token}' \ + -F 'file=@file-name.xml;type=text/xml' + /identity-providers/{identity-provider-id}/federated-authenticators: + get: + tags: + - Federated Authenticators + summary: | + Federated authenticators of an identity provider + description: > + This API provides a list of federated authenticators enabled for a + specific identity provider identified by its ID.
    + Scope required: `internal_org_idp_view` + operationId: getFederatedAuthenticators + parameters: + - name: identity-provider-id + in: path + description: ID of the identity provider. + required: true + schema: + type: string + responses: + '200': + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/FederatedAuthenticatorListResponse' + examples: + systemDefinedAuthenticatorsExample: + $ref: '#/components/examples/SystemDefinedAuthenticatorListResponseExample' + userDefinedAuthenticators: + $ref: '#/components/examples/UserDefinedAuthenticatorListResponseExample' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/identity-providers/{identity-provider-id}/federated-authenticators' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + put: + tags: + - Federated Authenticators + summary: | + Update Federated authenticators of an identity provider + description: > + This API updates federated authenticators enabled for a + specific identity provider identified by its ID.
    + Scope required: `internal_org_idp_update` + operationId: updateFederatedAuthenticators + parameters: + - name: identity-provider-id + in: path + description: ID of the identity provider. + required: true + schema: + type: string + responses: + '200': + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/FederatedAuthenticatorListResponse' + examples: + systemDefinedAuthenticatorsExample: + $ref: '#/components/examples/SystemDefinedAuthenticatorListResponseExample' + userDefinedAuthenticators: + $ref: '#/components/examples/UserDefinedAuthenticatorListResponseExample' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PUT' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/identity-providers/{identity-provider-id}/federated-authenticators' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -H 'Content-Type: application/json' \ + -d '{ + "defaultAuthenticatorId": "U0FNTDJBdXRoZW50aWNhdG9y", + "authenticators": [ + { + "authenticatorId": "U0FNTDJBdXRoZW50aWNhdG9y", + "isEnabled": true, + "isDefault": false, + "properties": [ + { + "key": "somePropertyKey", + "value": "somePropertyValue" + } + ] + } + ] + }' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/FederatedAuthenticatorRequest' + examples: + systemDefinedAuthenticatorsExample: + $ref: '#/components/examples/SystemDefinedAuthenticatorsListPUTRequestExample' + userDefinedAuthenticators: + $ref: '#/components/examples/UserDefinedAuthenticatorsListPUTRequestExample' + description: This represents the federated authenticators to be updated + required: true + /identity-providers/{identity-provider-id}/federated-authenticators/{federated-authenticator-id}: + get: + tags: + - Federated Authenticators + summary: | + Retrieve the federated authenticator config of an identity provider + description: > + This API provides the capability to retrieve the federated authenticator information of an identity provider by giving the federated authenticator's ID.
    + Scope required: `internal_org_idp_view` + operationId: getFederatedAuthenticator + parameters: + - name: identity-provider-id + in: path + description: ID of the identity provider. + required: true + schema: + type: string + - name: federated-authenticator-id + in: path + description: ID of the federated authenticator. + required: true + schema: + type: string + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/FederatedAuthenticator' + examples: + systemDefinedAuthenticatorsExample: + $ref: '#/components/examples/SystemDefinedAuthenticatorResponseExample' + userDefinedAuthenticators: + $ref: '#/components/examples/UserDefinedAuthenticatorResponseExample' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/identity-providers/{identity-provider-id}/federated-authenticators/{federated-authenticator-id}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + put: + tags: + - Federated Authenticators + summary: > + Update a federated authenticator of an IdP using authenticator id + description: > + This API provides the capability to update an identity provider's + federated authenticator config by specifying the authenticator ID.
    + Scope required: `internal_org_idp_update` + operationId: updateFederatedAuthenticator + parameters: + - name: identity-provider-id + in: path + description: ID of the identity provider. + required: true + schema: + type: string + - name: federated-authenticator-id + in: path + description: ID of the federated authenticator. + required: true + schema: + type: string + responses: + '200': + description: Successful response + headers: + Location: + description: Location of the updated federated authenticator. + schema: + type: string + content: + application/json: + schema: + $ref: '#/components/schemas/FederatedAuthenticator' + examples: + systemDefinedAuthenticatorsExample: + $ref: '#/components/examples/SystemDefinedAuthenticatorResponseExample' + userDefinedAuthenticators: + $ref: '#/components/examples/UserDefinedAuthenticatorResponseExample' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PUT' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/identity-providers/{identity-provider-id}/federated-authenticators/{federated-authenticator-id}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -H 'Content-Type: application/json' \ + -d '{ + "isEnabled": true, + "isDefault": false, + "properties": [ + { + "key": "somePropertyKey", + "value": "somePropertyValue" + } + ] + }' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/FederatedAuthenticatorPUTRequest' + description: This represents the federated authenticator to be updated + required: true + '/identity-providers/{identity-provider-id}/provisioning': + get: + tags: + - Provisioning + summary: | + Provisioning entities of an identity provider + description: > + This API provides a list of available provisioning entities for an + identity provider. This includes just-in-time provisioning config and + outbound provisioning connectors
    + Scope required: `internal_org_idp_view` + operationId: getProvisioningConfig + parameters: + - name: identity-provider-id + in: path + description: ID of the identity provider. + required: true + schema: + type: string + responses: + '200': + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/ProvisioningResponse' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/identity-providers/{identity-provider-id}/provisioning' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + /identity-providers/{identity-provider-id}/provisioning/outbound-connectors: + get: + tags: + - Provisioning + summary: | + Outbound provisioning connectors of an identity provider + description: > + This API provides a list of outbound provisioning connectors enabled for + an identity provider.
    + Scope required: `internal_org_idp_view` + operationId: getOutboundConnectors + parameters: + - name: identity-provider-id + in: path + description: ID of the identity provider. + required: true + schema: + type: string + responses: + '200': + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/OutboundConnectorListResponse' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/identity-providers/{identity-provider-id}/provisioning/outbound-connectors' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + put: + tags: + - Provisioning + summary: | + Update outbound provisioning connectors of an identity provider + description: > + This API provides updates the list of outbound provisioning connectors enabled for an identity provider.
    + Scope required: `internal_org_idp_update` + operationId: updateOutboundConnectors + parameters: + - name: identity-provider-id + in: path + description: ID of the identity provider. + required: true + schema: + type: string + responses: + '200': + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/OutboundConnectorListResponse' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PUT' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/identity-providers/identity-provider-id/provisioning/outbound-connectors' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -H 'Content-Type: application/json' \ + -d '{ + "defaultConnectorId": "U0NJTQ", + "connectors": [ + { + "connectorId": "U0NJTQ", + "isEnabled": true, + "isDefault": false, + "blockingEnabled": false, + "rulesEnabled": false, + "properties": [ + { + "key": "somePropertyKey", + "value": "somePropertyValue" + } + ] + } + ] + }' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OutboundProvisioningRequest' + description: This represents the outbound provisioning connectors to be updated + required: true + /identity-providers/{identity-provider-id}/provisioning/outbound-connectors/{outbound-provisioning-connector-id}: + get: + tags: + - Provisioning + summary: | + Retrieve the outbound provisioning connector of an identity provider + description: > + This API provides the capability to retrieve the outbound provisioning + connector information of an identity provider by specifying the provisioning + connector's ID.
    + Scope required: `internal_org_idp_view` + operationId: getOutboundConnector + parameters: + - name: identity-provider-id + in: path + description: ID of the identity provider. + required: true + schema: + type: string + - name: outbound-provisioning-connector-id + in: path + description: ID of the outbound provisioning connector. + required: true + schema: + type: string + responses: + '200': + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/OutboundConnector' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/identity-providers/{identity-provider-id}/provisioning/outbound-connectors/{outbound-provisioning-connector-id}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + put: + tags: + - Provisioning + summary: | + Update an outbound provisioning connector of an identity provider + description: > + This API provides the capability to update an outbound provisioning + connector config of an identity provider by specifying the provisioning + connector's ID.
    + Scope required: `internal_org_idp_update` + operationId: updateOutboundConnector + parameters: + - name: identity-provider-id + in: path + description: ID of the identity provider. + required: true + schema: + type: string + - name: outbound-provisioning-connector-id + in: path + description: ID of the outbound provisioning connector. + required: true + schema: + type: string + responses: + '200': + description: Successful response + headers: + Location: + description: Location of the updated outbound provisioning connector. + schema: + type: string + content: + application/json: + schema: + $ref: '#/components/schemas/OutboundConnector' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PUT' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/identity-providers/{identity-provider-id}/provisioning/outbound-connectors/{outbound-provisioning-connector-id}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -H 'Content-Type: application/json' \ + -d '{ + "isEnabled": true, + "isDefault": false, + "blockingEnabled": false, + "rulesEnabled": false, + "properties": [ + { + "key": "somePropertyKey", + "value": "somePropertyValue" + } + ] + }' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OutboundConnectorPUTRequest' + description: This represents the outbound provisioning connector to be updated + required: true + /identity-providers/{identity-provider-id}/claims: + get: + tags: + - Claims + summary: | + Claim config of an identity provider + description: > + This API provides the claim config for an identity provider. This + includes idp-to-local claim mappings, claims to be outbound + provisioned, userID claim URI, and role claim URI.
    + Scope required: `internal_org_idp_view` + operationId: getClaimConfig + parameters: + - name: identity-provider-id + in: path + description: ID of the identity provider. + required: true + schema: + type: string + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Claims' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/identity-providers/{identity-provider-id}/claims' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + put: + tags: + - Claims + summary: | + Update the claims of an identity provider + description: > + This API provides the capability to update the claim config of an + existing identity provider.
    + Scope required: `internal_org_idp_update` + operationId: updateClaimConfig + parameters: + - name: identity-provider-id + in: path + description: ID of the identity provider. + required: true + schema: + type: string + responses: + '200': + description: Successful response + headers: + Location: + description: Location of the updated claim config. + schema: + type: string + content: + application/json: + schema: + $ref: '#/components/schemas/Claims' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PUT' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/identity-providers/{identity-provider-id}/claims' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -H 'Content-Type: application/json' \ + -d '{ + "userIdClaim": { + "uri": "http://wso2.org/claims/username" + }, + "roleClaim": { + "uri": "http://wso2.org/claims/username" + }, + "mappings": [ + { + "idpClaim": "country", + "localClaim": { + "uri": "http://wso2.org/claims/username" + } + } + ], + "provisioningClaims": [ + { + "claim": { + "uri": "http://wso2.org/claims/username" + }, + "defaultValue": "sathya" + } + ] + }' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/Claims' + description: This represents the claim config to be updated + required: true + '/identity-providers/{identity-provider-id}/provisioning/jit': + get: + tags: + - Provisioning + summary: | + Just-In-Time provisioning config of an identity provider + description: > + This API retrieves the Just-In-Time provisioning config of an identity + provider by specifying the identity provider ID.
    + Scope required: `internal_org_idp_view` + operationId: getJITConfig + parameters: + - name: identity-provider-id + in: path + description: ID of the identity provider. + required: true + schema: + type: string + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/JustInTimeProvisioning' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/identity-providers/{identity-provider-id}/provisioning/jit' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + put: + tags: + - Provisioning + summary: | + Update the just-in-time provisioning config of an identity provider + description: > + This API provides the capability to update the just-in-time provisioning + config of an identity provider by specifying the identity provider's ID. This includes the ability to enable/disable JIT provisioning, change provisioning user store, and enable/disable user prompts for username, password, and consent.
    + Scope required: `internal_org_idp_update` + operationId: updateJITConfig + parameters: + - name: identity-provider-id + in: path + description: ID of the identity provider. + required: true + schema: + type: string + responses: + '200': + description: Successful response + headers: + Location: + description: Location of the updated just-in-time provisioning config. + schema: + type: string + content: + application/json: + schema: + $ref: '#/components/schemas/JustInTimeProvisioning' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PUT' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/identity-providers/{identity-provider-id}/provisioning/jit' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -H 'Content-Type: application/json' \ + -d '{ + "isEnabled": true, + "scheme": "PROVISION_SILENTLY", + "userstore": "DEFAULT", + "attributeSyncMethod": "OVERRIDE_ALL", + "associateLocalUser": true, + "accountLookupAttributeMappings": [ + { + "federatedAttribute": "email", + "localAttribute": "http://wso2.org/claims/email" + }, + { + "federatedAttribute": "mobile", + "localAttribute": "http://wso2.org/claims/mobile" + } + ] + }' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/JustInTimeProvisioning' + description: This represents the just-in-time provisioning config to be updated. + required: true + '/identity-providers/{identity-provider-id}/connected-apps': + get: + tags: + - Connected Apps + summary: | + Connected applications of an identity provider + description: > + This API provides the list of applications that use this identity provider for federated authentication/provisioning.
    + Scope required: `internal_org_idp_view` + operationId: getConnectedApps + parameters: + - $ref: '#/components/parameters/limitQueryParam' + - $ref: '#/components/parameters/offsetQueryParam' + - name: identity-provider-id + in: path + description: ID of the identity provider. + required: true + schema: + type: string + responses: + '200': + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectedApps' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/identity-providers/{identity-provider-id}/connected-apps' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' +servers: + - url: 'https://api.asgardeo.io/{root-organization-name}/o/api/server/v1' + variables: + server-url: + default: https://api.asgardeo.io/{root-organization-name}/o/ + root-organization-name: + default: {root-organization-name} +components: + parameters: + limitQueryParam: + in: query + name: limit + required: false + description: | + Maximum number of records to return. + schema: + type: integer + format: int32 + offsetQueryParam: + in: query + name: offset + required: false + description: | + Number of records to skip for pagination. + schema: + type: integer + format: int32 + filterQueryParam: + in: query + name: filter + required: false + description: > + Condition to filter the retrieval of records. Supports 'sw', 'co', 'ew' + and 'eq' operations and also complex queries with 'and' operations. E.g. + /identity-providers?filter=name+sw+"google"+and+isEnabled+eq+"true" + schema: + type: string + sortQueryParam: + in: query + name: sortOrder + required: false + description: | + Defines the order in which the retrieved records should be sorted. + _This parameter is not supported yet_ + schema: + type: string + enum: + - ASC + - DESC + sortByQueryParam: + in: query + name: sortBy + required: false + description: | + Attribute by which the retrieved records should be sorted. + _This parameter is not supported yet_ + schema: + type: string + requiredAttributesQueryParam: + in: query + name: requiredAttributes + required: false + description: | + Specifies the required parameters in the response. + _This parameter is not supported yet_ + schema: + type: string + forceQueryParam: + in: query + name: force + required: false + description: > + Enforces the forceful deletion of an identity provider, + federated authenticator or an outbound provisioning connector even though + it is referred by a service provider. + schema: + type: boolean + default: false + excludeSecretsQueryParam: + in: query + name: excludeSecrets + required: false + description: | + Specifies whether to exclude secrets when exporting an identity provider. + schema: + type: boolean + default: true + fileTypeHeaderParam: + in: header + name: Accept + required: false + description: | + Content type of the file. + schema: + type: string + default: application/yaml + enum: + - application/json + - application/xml + - application/yaml + - application/x-yaml + - text/yaml + - text/xml + - text/json + securitySchemes: + OAuth2: + type: oauth2 + description: "**Authorization code OAuth flow** + **Organization Switch**" + schemas: + Error: + type: object + properties: + code: + type: string + example: AAA-00000 + message: + type: string + example: Some Error Message + description: + type: string + example: Some Error Description + traceId: + type: string + example: e0fbcfeb-3617-43c4-8dd0-7b7d38e13047 + MetaProperty: + type: object + required: + - key + properties: + key: + type: string + example: 'httpBinding' + displayName: + type: string + example: 'HTTP Binding' + description: + type: string + example: 'Choose the HTTP Binding or decide from incoming request' + type: + type: string + enum: + - STRING + - BOOLEAN + - INTEGER + example: STRING + displayOrder: + type: integer + example: 10 + regex: + type: string + example: '[a-zA-Z]{3,30}' + isMandatory: + type: boolean + default: false + example: false + isConfidential: + type: boolean + default: false + options: + type: array + items: + type: string + example: ['HTTP-Redirect', 'HTTP-POST', 'As Per Request'] + defaultValue: + type: string + example: HTTP-Redirect + subProperties: + type: array + items: + $ref: '#/components/schemas/MetaProperty' + Property: + required: + - key + type: object + properties: + key: + type: string + example: somePropertyKey + value: + type: string + example: somePropertyValue + PatchRequest: + type: array + items: + $ref: '#/components/schemas/Patch' + Patch: + description: A JSONPatch as defined by RFC 6902. Patch operation is supported only for root-level attributes of + an identity provider. + required: + - operation + - path + properties: + operation: + type: string + description: The operation to be performed. + enum: + - ADD + - REMOVE + - REPLACE + example: REPLACE + path: + type: string + description: A JSON-Pointer + example: '/homeRealmIdentifier' + value: + type: string + description: The value to be used within the operations. + example: 'google' + Link: + type: object + properties: + href: + type: string + description: Path to the target resource. + example: >- + '/api/server/v1/identity-providers/394b8adcce24c64a8a09a8d80abf8c337bd253de' + rel: + type: string + description: Describes how the current context is related to the target resource. + example: identity-providers + readOnly: true + Certificate: + type: object + properties: + certificates: + type: array + items: + type: string + jwksUri: + type: string + example: "https://api.asgardeo.io/t/{organization-name}/oauth2/jwks" + IdentityProviderPOSTRequest: + type: object + required: + - name + properties: + name: + type: string + example: google + description: + type: string + example: "IdP for Google Federation" + image: + type: string + example: "google-logo-url" + isPrimary: + type: boolean + default: false + isFederationHub: + type: boolean + default: false + homeRealmIdentifier: + type: string + example: localhost + certificate: + $ref: '#/components/schemas/Certificate' + alias: + type: string + example: 'https://api.asgardeo.io/t/{organization-name}/oauth2/token' + claims: + $ref: '#/components/schemas/Claims' + roles: + $ref: '#/components/schemas/Roles' + federatedAuthenticators: + $ref: '#/components/schemas/FederatedAuthenticatorRequest' + provisioning: + $ref: '#/components/schemas/ProvisioningRequest' + IdentityProviderResponse: + type: object + properties: + id: + type: string + example: '123e4567-e89b-12d3-a456-556642440000' + name: + type: string + example: google + description: + type: string + isEnabled: + type: boolean + default: true + example: true + isPrimary: + type: boolean + default: false + image: + type: string + example: "google-logo-url" + isFederationHub: + type: boolean + example: false + homeRealmIdentifier: + type: string + example: localhost + certificate: + $ref: '#/components/schemas/Certificate' + alias: + type: string + example: 'https://api.asgardeo.io/t/{organization-name}/oauth2/token' + claims: + $ref: '#/components/schemas/Claims' + roles: + $ref: '#/components/schemas/Roles' + federatedAuthenticators: + $ref: '#/components/schemas/FederatedAuthenticatorListResponse' + provisioning: + $ref: '#/components/schemas/ProvisioningResponse' + IdentityProviderListResponse: + type: object + properties: + totalResults: + type: integer + example: 10 + startIndex: + type: integer + example: 1 + count: + type: integer + example: 10 + links: + type: array + items: + $ref: '#/components/schemas/Link' + example: + [ + { + "href": "identity-provider?offset=50&limit=10", + "rel": "next", + }, { + "href": "identity-provider?offset=30&limit=10", + "rel": "previous", + } + ] + identityProviders: + type: array + items: + $ref: '#/components/schemas/IdentityProviderListItem' + IdentityProviderListItem: + type: object + properties: + id: + type: string + example: 123e4567-e89b-12d3-a456-556642440000 + name: + type: string + example: google + description: + type: string + example: identity provider for google federation + isEnabled: + type: boolean + default: true + example: true + image: + type: string + example: "google-logo-url" + isPrimary: + type: boolean + example: false + isFederationHub: + type: boolean + example: false + homeRealmIdentifier: + type: string + example: localhost + certificate: + $ref: '#/components/schemas/Certificate' + alias: + type: string + example: 'https://localhost:9444/oauth2/token' + claims: + $ref: '#/components/schemas/Claims' + roles: + $ref: '#/components/schemas/Roles' + federatedAuthenticators: + $ref: '#/components/schemas/FederatedAuthenticatorListResponse' + provisioning: + $ref: '#/components/schemas/ProvisioningResponse' + self: + type: string + example: /api/server/v1/identity-providers/123e4567-e89b-12d3-a456-556642440000 + MetaFederatedAuthenticatorListItem: + type: object + properties: + authenticatorId: + type: string + example: U0FNTDJBdXRoZW50aWNhdG9y + name: + type: string + example: SAML2Authenticator + definedBy: + type: string + enum: + - SYSTEM + - USER + self: + type: string + example: /t/{root-organization-name}/o/api/server/v1/identity-providers/meta/federated-authenticators/U0FNTFNTT0F1dGhlbnRpY2F0b3I + MetaFederatedAuthenticator: + type: object + properties: + authenticatorId: + type: string + example: U0FNTFNTT0F1dGhlbnRpY2F0b3I + name: + type: string + example: SAML2Authenticator + displayName: + type: string + example: 'SAML2 Web SSO Configuration' + definedBy: + type: string + enum: + - SYSTEM + - USER + properties: + type: array + items: + $ref: '#/components/schemas/MetaProperty' + FederatedAuthenticatorRequest: + type: object + required: + - defaultAuthenticatorId + properties: + defaultAuthenticatorId: + type: string + description: >- + ID of the federated authenticator to be used as the default + authenticator for the respective identity provider. + example: U0FNTDJBdXRoZW50aWNhdG9y + authenticators: + type: array + items: + $ref: '#/components/schemas/FederatedAuthenticator' + description: >- + Includes the list of federated authenticators supported by the + respective identity provider. This should include the authenticator + specified as the defaultAuthenticator. + FederatedAuthenticator: + type: object + required: + - authenticatorId + properties: + authenticatorId: + type: string + example: U0FNTDJBdXRoZW50aWNhdG9y + name: + type: string + example: "SAML2Authenticator" + readOnly: true + isEnabled: + type: boolean + default: false + example: true + definedBy: + type: string + enum: + - SYSTEM + - USER + isDefault: + type: boolean + default: false + properties: + type: array + items: + $ref: '#/components/schemas/Property' + endpoint: + $ref: '#/components/schemas/Endpoint' + Endpoint: + type: object + required: + - uri + - authentication + properties: + uri: + type: string + example: https://abc.com/token + pattern: '^https?://.+' + authentication: + $ref: '#/components/schemas/AuthenticationType' + allowedHeaders: + type: array + description: List of HTTP headers to forward to the extension. + items: + type: string + example: [ "x-geo-location", "host"] + allowedParameters: + type: array + description: List of parameters to forward to the extension. + items: + type: string + example: [ "device-id"] + AuthenticationType: + type: object + description: > + The type of authentication required by the action's endpoint. The following options are supported: + + - NONE: No authentication is required.
    + ``{ + "type": "NONE" + }`` + + - BASIC: Basic authentication with a username and password.
    + ``{ + "type": "BASIC", + "properties": { + "username": "auth_username", + "password": "auth_password" + } + }`` + + - API_KEY: API key-based authentication, where the key is provided in an HTTP header.
    + ``{ + "type": "API_KEY", + "properties": { + "header": "X-API-Key", + "value": "12345-abcde-67890" + } + }`` + + - BEARER: Bearer token-based authentication.
    + ``{ + "type": "BEARER", + "properties": { + "accessToken": "0d6fed02-eac0-332b-8998-213a543139a0" + } + }`` + required: + - type + properties: + type: + type: string + enum: + - NONE + - BEARER + - API_KEY + - BASIC + example: BASIC + properties: + type: object + additionalProperties: true + example: + username: "auth_username" + password: "auth_password" + FederatedAuthenticatorPUTRequest: + type: object + properties: + authenticatorId: + type: string + example: + readOnly: true + name: + type: string + example: "SAML2Authenticator" + readOnly: true + isEnabled: + type: boolean + default: false + example: true + isDefault: + type: boolean + default: false + example: false + definedBy: + type: string + enum: + - SYSTEM + - USER + properties: + type: array + items: + $ref: '#/components/schemas/Property' + endpoint: + $ref: '#/components/schemas/Endpoint' + FederatedAuthenticatorListResponse: + type: object + properties: + defaultAuthenticatorId: + type: string + example: U0FNTFNTT0F1dGhlbnRpY2F0b3I + authenticators: + type: array + items: + $ref: '#/components/schemas/FederatedAuthenticatorListItem' + FederatedAuthenticatorListItem: + type: object + properties: + authenticatorId: + type: string + example: U0FNTFNTT0F1dGhlbnRpY2F0b3I + name: + type: string + example: SAML2Authenticator + isEnabled: + type: boolean + default: false + example: true + self: + type: string + example: /t/{root-organization-name}/o/api/server/v1/identity-providers/123e4567-e89b-12d3-a456-556642440000/federated-authenticators/U0FNTDJBdXRoZW50aWNhdG9y + MetaOutboundConnectorListItem: + type: object + properties: + connectorId: + type: string + example: U0NJTQ + name: + type: string + example: SCIM + self: + type: string + example: /t/{root-organization-name}/o/api/server/v1/identity-providers/meta/outbound-provisioning-connectos/U0NJTQ + MetaOutboundConnector: + type: object + properties: + connectorId: + type: string + example: U0NJTQ + name: + type: string + example: SCIM + displayName: + type: string + example: SCIM Outbound Provisioning Connector + blockingEnabled: + type: boolean + default: false + rulesEnabled: + type: boolean + default: false + properties: + type: array + items: + $ref: '#/components/schemas/MetaProperty' + ProvisioningRequest: + type: object + properties: + jit: + $ref: '#/components/schemas/JustInTimeProvisioning' + outboundConnectors: + $ref: '#/components/schemas/OutboundProvisioningRequest' + ProvisioningResponse: + type: object + properties: + jit: + $ref: '#/components/schemas/JustInTimeProvisioning' + outboundConnectors: + $ref: '#/components/schemas/OutboundConnectorListResponse' + OutboundProvisioningRequest: + type: object + required: + - defaultConnectorId + properties: + defaultConnectorId: + type: string + example: U0NJTQ + connectors: + type: array + items: + $ref: '#/components/schemas/OutboundConnector' + OutboundConnector: + type: object + required: + - connectorId + properties: + connectorId: + type: string + example: U0NJTQ + name: + type: string + example: SCIM + readOnly: true + isEnabled: + type: boolean + default: false + example: true + isDefault: + type: boolean + default: false + blockingEnabled: + type: boolean + default: false + rulesEnabled: + type: boolean + default: false + properties: + type: array + items: + $ref: '#/components/schemas/Property' + OutboundConnectorPUTRequest: + type: object + properties: + connectorId: + type: string + example: U0NJTQ + readOnly: true + name: + type: string + example: SCIM + readOnly: true + isEnabled: + type: boolean + default: false + example: true + isDefault: + type: boolean + default: false + blockingEnabled: + type: boolean + default: false + rulesEnabled: + type: boolean + default: false + properties: + type: array + items: + $ref: '#/components/schemas/Property' + OutboundConnectorListResponse: + type: object + properties: + defaultConnectorId: + type: string + example: U0NJTQ + connectors: + type: array + items: + $ref: '#/components/schemas/OutboundConnectorListItem' + OutboundConnectorListItem: + type: object + properties: + connectorId: + type: string + example: U0NJTQ + name: + type: string + example: SCIM + readOnly: true + isEnabled: + type: boolean + default: false + example: true + self: + type: string + example: /t/{root-organization-name}/o/api/server/v1/identity-providers/123e4567-e89b-12d3-a456-556642440000/provisioning/outbound-connectors/U0NJTQ + Roles: + type: object + properties: + mappings: + type: array + items: + $ref: '#/components/schemas/RoleMapping' + outboundProvisioningRoles: + type: array + items: + type: string + example: + - manager + - hr-admin + RoleMapping: + type: object + properties: + idpRole: + type: string + example: google-manager + localRole: + type: string + example: manager + Claims: + type: object + properties: + userIdClaim: + $ref: '#/components/schemas/Claim' + roleClaim: + $ref: '#/components/schemas/Claim' + mappings: + type: array + items: + $ref: '#/components/schemas/ClaimMapping' + provisioningClaims: + type: array + items: + $ref: '#/components/schemas/ProvisioningClaim' + ProvisioningClaim: + type: object + properties: + claim: + $ref: '#/components/schemas/Claim' + defaultValue: + type: string + example: sathya + ClaimMapping: + type: object + properties: + idpClaim: + type: string + example: country + localClaim: + $ref: '#/components/schemas/Claim' + Claim: + type: object + required: + - uri + properties: + id: + type: string + example: aHR0cDovL3dzbzIub3JnL2NsYWltcy91c2VybmFtZQ + readOnly: true + uri: + type: string + example: 'http://wso2.org/claims/username' + displayName: + type: string + example: Username + readOnly: true + JustInTimeProvisioning: + type: object + required: + - isEnabled + properties: + isEnabled: + type: boolean + default: false + example: true + scheme: + type: string + enum: + - PROMPT_USERNAME_PASSWORD_CONSENT + - PROMPT_PASSWORD_CONSENT + - PROMPT_CONSENT + - PROVISION_SILENTLY + default: PROVISION_SILENTLY + userstore: + type: string + default: PRIMARY + example: PRIMARY + associateLocalUser: + type: boolean + default: false + example: true + skipJITForLookupFailure: + type: boolean + default: false + example: true + accountLookupAttributeMappings: + type: array + items: + $ref: '#/components/schemas/AccountLookupAttributeMapping' + description: > + List of local and federated attributes to be used for account lookup. + The maximum number of mappings is 2. + attributeSyncMethod: + type: string + enum: + - OVERRIDE_ALL + - NONE + - PRESERVE_LOCAL + default: OVERRIDE_ALL + AccountLookupAttributeMapping: + type: object + properties: + localAttribute: + type: string + example: http://wso2.org/claims/emailaddress + federatedAttribute: + type: string + example: email + ConnectedApps: + type: object + properties: + totalResults: + type: integer + example: 10 + startIndex: + type: integer + example: 1 + count: + type: integer + example: 10 + links: + type: array + items: + $ref: '#/components/schemas/Link' + example: + [ + { + "href": "identity-provider/123e4567-e89b-12d3-a456-556642440000/connected-apps?offset=50&limit=10", + "rel": "next" + }, { + "href": "identity-provider/123e4567-e89b-12d3-a456-556642440000/connected-apps?offset=30&limit=10", + "rel": "previous" + } + ] + connectedApps: + type: array + items: + $ref: '#/components/schemas/ConnectedApp' + ConnectedApp: + type: object + properties: + appId: + type: string + example: app-id + self: + type: string + example: connected-app-url + IdentityProviderTemplateListResponse: + type: object + properties: + totalResults: + type: integer + example: 10 + startIndex: + type: integer + example: 1 + count: + type: integer + example: 10 + links: + type: array + items: + $ref: '#/components/schemas/Link' + example: + [ + { + "href": "identity-provider/templates?offset=50&limit=10", + "rel": "next", + }, { + "href": "identity-provider/templates?offset=30&limit=10", + "rel": "previous", + } + ] + templates: + type: array + items: + $ref: '#/components/schemas/IdentityProviderTemplateListItem' + IdentityProviderTemplateListItem: + type: object + properties: + id: + type: string + readOnly: true + example: 123e4567-e89b-12d3-a456-556642440000 + name: + type: string + example: 'google' + description: + type: string + example: 'Identity provider template for google federation' + image: + type: string + example: 'google-logo-url' + category: + type: string + enum: [DEFAULT, CUSTOM] + example: 'DEFAULT' + displayOrder: + type: integer + example: 10 + services: + type: array + items: + $ref: '#/components/schemas/Service' + self: + type: string + example: '/api/server/v1/identity-providers/templates/123e4567-e89b-12d3-a456-556642440000' + IdentityProviderTemplate: + type: object + properties: + id: + type: string + readOnly: true + example: 123e4567-e89b-12d3-a456-556642440000 + name: + type: string + example: google + description: + type: string + example: 'Google federated connector' + image: + type: string + example: 'google-logo-url' + category: + type: string + enum: [DEFAULT, CUSTOM] + example: 'DEFAULT' + displayOrder: + type: integer + example: 10 + idp: + $ref : '#/components/schemas/IdentityProviderPOSTRequest' + required: + - name + - idp + Service: + type: string + example: 'Authentication' + FileUpload: + type: object + properties: + file: + type: string + format: binary + description: file to upload + examples: + UserDefinedAuthenticatorPUTRequestExample: + summary: Put request for user defined authenticators + value: + authenticatorId: "Y3VzdG9tLWF1dGhlbnRpY2F0b3I" + name: "custom-authenticator" + default: true + definedBy: "USER" + endpoint: + uri: "https://abc.com/token" + authentication: + type: "BASIC" + properties: + username: "auth_username" + password: "auth_password" + allowedHeaders: + - x-geo-location + - host + allowedParameters: + - device-id + SystemDefinedAuthenticatorPUTRequestExample: + summary: "Put request for system defined authenticators" + value: + authenticatorId: "U0FNTDJBdXRoZW50aWNhdG9y" + isEnabled: true + isDefault: true + properties: + - key: "somePropertyKey" + value: "somePropertyValue" + UserDefinedAuthenticatorsListPUTRequestExample: + summary: "Put request for user defined authenticators list" + value: + defaultAuthenticatorId: "Y3VzdG9tLWF1dGhlbnRpY2F0b3I" + authenticators: + - authenticatorId: "Y3VzdG9tLWF1dGhlbnRpY2F0b3I" + name: "custom-authenticator" + default: true + definedBy: "USER" + endpoint: + uri: "https://abc.com/token" + authentication: + type: "BASIC" + properties: + username: "auth_username" + password: "auth_password" + allowedHeaders: + - x-geo-location + - host + allowedParameters: + - device-id + SystemDefinedAuthenticatorsListPUTRequestExample: + summary: "Put request for system defined authenticators list" + value: + defaultAuthenticatorId: "U0FNTDJBdXRoZW50aWNhdG9y" + authenticators: + - authenticatorId: "U0FNTDJBdXRoZW50aWNhdG9y" + isEnabled: true + isDefault: true + properties: + - key: "somePropertyKey" + value: "somePropertyValue" + IdentityProviderWithSystemDefinedAuthenticatorPOSTRequestExample: + summary: "POST request for an identity provider with a system defined authenticator" + value: + name: "google" + description: "IdP for Google Federation" + image: "google-logo-url" + templateId: "8ea23303-49c0-4253-b81f-82c0fe6fb4a0" + isPrimary: false + isFederationHub: false + homeRealmIdentifier: "localhost" + certificate: + certificates: + - "string" + jwksUri: "https://api.asgardeo.io/t/{root-organization-name}/o/oauth2/jwks" + alias: "https://localhost:9444/api.asgardeo.io/t/{root-organization-name}/o/oauth2/token" + idpIssuerName: "https://www.idp.com" + claims: + userIdClaim: + uri: "http://wso2.org/claims/username" + roleClaim: + uri: "http://wso2.org/claims/username" + mappings: + - idpClaim: "country" + localClaim: + uri: "http://wso2.org/claims/username" + provisioningClaims: + - claim: + uri: "http://wso2.org/claims/username" + defaultValue: "sathya" + roles: + mappings: + - idpRole: "google-manager" + localRole: "manager" + outboundProvisioningRoles: + - "manager" + - "hr-admin" + groups: + - name: "google-admin" + id: "6b1f8513-3de0-4f28-9cad-b7400dbc94ae" + federatedAuthenticators: + defaultAuthenticatorId: "U0FNTDJBdXRoZW50aWNhdG9y" + authenticators: + - authenticatorId: "U0FNTDJBdXRoZW50aWNhdG9y" + isEnabled: true + isDefault: true + properties: + - key: "somePropertyKey" + value: "somePropertyValue" + provisioning: + jit: + isEnabled: true + scheme: "PROVISION_SILENTLY" + userstore: "PRIMARY" + associateLocalUser: true + attributeSyncMethod: "OVERRIDE_ALL" + accountLookupAttributeMappings: + - federatedAttribute: "email" + localAttribute: "http://wso2.org/claims/email" + - federatedAttribute: "mobile" + localAttribute: "http://wso2.org/claims/mobile" + outboundConnectors: + defaultConnectorId: "U0NJTQ" + connectors: + - connectorId: "U0NJTQ" + isEnabled: true + isDefault: true + blockingEnabled: false + rulesEnabled: false + properties: + - key: "somePropertyKey" + value: "somePropertyValue" + implicitAssociation: + isEnabled: false + lookupAttribute: + - "email" + IdentityProviderWithUserDefinedAuthenticatorPOSTRequestExample: + summary: "POST request for an identity provider with a user defined authenticator" + value: + name: "Custom IDP" + description: "IDP with custom federated authenticator" + image: "https://custom-authenticator-logo-url" + templateId: "external-custom-authenticator" + isPrimary: false + isFederationHub: false + homeRealmIdentifier: "" + certificate: + certificates: + - "" + jwksUri: "" + claims: + userIdClaim: + uri: "http://wso2.org/claims/username" + roleClaim: + uri: "" + mappings: [] + provisioningClaims: [] + roles: + mappings: [ ] + outboundProvisioningRoles: [ ] + federatedAuthenticators: + defaultAuthenticatorId: "Y3VzdG9tLWF1dGhlbnRpY2F0b3I" + authenticators: + - authenticatorId: "Y3VzdG9tLWF1dGhlbnRpY2F0b3I" + isEnabled: true + isDefault: true + definedBy: "USER" + endpoint: + uri: "https://abc.com/token" + authentication: + type: "BASIC" + properties: + username: "auth_username" + password: "auth_password" + allowedHeaders: + - x-geo-location + - host + allowedParameters: + - device-id + provisioning: + jit: + isEnabled: true + scheme: "PROVISION_SILENTLY" + userstore: "PRIMARY" + associateLocalUser: true + attributeSyncMethod: "OVERRIDE_ALL" + accountLookupAttributeMappings: + - federatedAttribute: "email" + localAttribute: "http://wso2.org/claims/email" + - federatedAttribute: "mobile" + localAttribute: "http://wso2.org/claims/mobile" + SystemDefinedIdentityProviderResponseExample: + summary: "Response for identity provider creation with system defined authenticator" + value: + id: "123e4567-e89b-12d3-a456-556642440000" + name: "google" + description: "string" + isEnabled: true + isPrimary: false + image: "google-logo-url" + isFederationHub: false + homeRealmIdentifier: "localhost" + certificate: + certificates: + - "string" + jwksUri: "https://api.asgardeo.io/t/{root-organization-name}/o/oauth2/jwks" + alias: "https://api.asgardeo.io/t/{root-organization-name}/o/oauth2/token" + claims: + userIdClaim: + id: "aHR0cDovL3dzbzIub3JnL2NsYWltcy91c2VybmFtZQ" + uri: "http://wso2.org/claims/username" + displayName: "Username" + roleClaim: + id: "aHR0cDovL3dzbzIub3JnL2NsYWltcy91c2VybmFtZQ" + uri: "http://wso2.org/claims/username" + displayName: "Username" + mappings: + - idpClaim: "country" + localClaim: + id: "aHR0cDovL3dzbzIub3JnL2NsYWltcy91c2VybmFtZQ" + uri: "http://wso2.org/claims/username" + displayName: "Username" + provisioningClaims: + - claim: + id: "aHR0cDovL3dzbzIub3JnL2NsYWltcy91c2VybmFtZQ" + uri: "http://wso2.org/claims/username" + displayName: "Username" + defaultValue: "sathya" + roles: + mappings: + - idpRole: "google-manager" + localRole: "manager" + outboundProvisioningRoles: + - "manager" + - "hr-admin" + federatedAuthenticators: + defaultAuthenticatorId: "U0FNTFNTT0F1dGhlbnRpY2F0b3I" + authenticators: + - authenticatorId: "U0FNTFNTT0F1dGhlbnRpY2F0b3I" + name: "SAML2Authenticator" + isEnabled: true + definedBy: "SYSTEM" + tags: + - "Social Login" + - "OIDC" + self: "/o/api/server/v1/identity-providers/123e4567-e89b-12d3-a456-556642440000/federated-authenticators/U0FNTDJBdXRoZW50aWNhdG9y" + provisioning: + jit: + isEnabled: true + scheme: "PROMPT_USERNAME_PASSWORD_CONSENT" + userstore: "PRIMARY" + associateLocalUser: true + attributeSyncMethod: "OVERRIDE_ALL" + accountLookupAttributeMappings: + - federatedAttribute: "email" + localAttribute: "http://wso2.org/claims/email" + - federatedAttribute: "mobile" + localAttribute: "http://wso2.org/claims/mobile" + outboundConnectors: + defaultConnectorId: "U0NJTQ" + connectors: + - connectorId: "U0NJTQ" + name: "SCIM" + isEnabled: true + self: "/o/api/server/v1/identity-providers/123e4567-e89b-12d3-a456-556642440000/provisioning/outbound-connectors/U0NJTQ" + UserDefinedIdentityProviderResponseExample: + summary: "Response for identity provider creation with user defined authenticator" + value: + name: "Custom IDP" + description: "IDP with custom federated authenticator" + image: "https://custom-authenticator-logo-url" + templateId: "external-custom-authenticator" + isEnabled: true + isPrimary: false + isFederationHub: false + homeRealmIdentifier: "" + alias: "" + idpIssuerName: "" + claims: + userIdClaim: + id: "aHR0cDovL3dzbzIub3JnL2NsYWltcy91c2VybmFtZQ" + uri: "http://wso2.org/claims/username" + displayName: "Username" + roleClaim: + uri: "" + mappings: [ ] + provisioningClaims: [ ] + roles: + mappings: [ ] + groups: [ ] + federatedAuthenticators: + defaultAuthenticatorId: "Y3VzdG9tLWF1dGhlbnRpY2F0b3I" + authenticators: + - authenticatorId: "Y3VzdG9tLWF1dGhlbnRpY2F0b3I" + name: "custom-authenticator" + isEnabled: true + definedBy: "USER" + tags: + - "Custom" + self: "/o/api/server/v1/identity-providers/123e4567-e89b-12d3-a456-556642440000/federated-authenticators/Y3VzdG9tLWF1dGhlbnRpY2F0b3I" + provisioning: + jit: + isEnabled: true + scheme: "PROVISION_SILENTLY" + userstore: "DEFAULT" + associateLocalUser: false + attributeSyncMethod: "OVERRIDE_ALL" + outboundConnectors: + connectors: [ ] + implicitAssociation: + isEnabled: false + lookupAttribute: [ ] + SystemDefinedAuthenticatorResponseExample: + summary: "System defined federated authenticator" + value: + authenticatorId: "U0FNTDJBdXRoZW50aWNhdG9y" + isEnabled: true + isDefault: true + definedBy: "SYSTEM" + tags: + - "Social Login" + - "OIDC" + properties: + - key: "somePropertyKey" + value: "somePropertyValue" + UserDefinedAuthenticatorResponseExample: + summary: "User defined federated authenticator" + value: + authenticatorId: "Y3VzdG9tLWF1dGhlbnRpY2F0b3I" + isEnabled: true + isDefault: true + definedBy: "USER" + tags: + - "Custom" + endpoint: + uri: "https://abc.com/token" + authentication: + type: "BASIC" + allowedHeaders: + - x-geo-location + - host + allowedParameters: + - device-id + SystemDefinedAuthenticatorListResponseExample: + summary: "List of authenticators with system defined authenticator" + value: + defaultAuthenticatorId: "U0FNTDJBdXRoZW50aWNhdG9y" + authenticators: + - authenticatorId: "U0FNTDJBdXRoZW50aWNhdG9y" + isEnabled: true + isDefault: true + definedBy: "SYSTEM" + tags: + - "Social Login" + - "OIDC" + self: "/o/api/server/v1/identity-providers/123e4567-e89b-12d3-a456-556642440000/federated-authenticators/U0FNTDJBdXRoZW50aWNhdG9y" + UserDefinedAuthenticatorListResponseExample: + summary: "List of authenticators with user defined authenticator" + value: + defaultAuthenticatorId: "Y3VzdG9tLWF1dGhlbnRpY2F0b3I" + authenticators: + - authenticatorId: "Y3VzdG9tLWF1dGhlbnRpY2F0b3I" + name: "custom-authenticator" + isEnabled: true + definedBy: "USER" + tags: + - "Custom" + self: "/o/api/server/v1/identity-providers/123e4567-e89b-12d3-a456-556642440000/federated-authenticators/Y3VzdG9tLWF1dGhlbnRpY2F0b3I" diff --git a/docusaurus-asgardeo/static/apis/organization-apis/restapis/notification-senders-v2.yaml b/docusaurus-asgardeo/static/apis/organization-apis/restapis/notification-senders-v2.yaml new file mode 100644 index 0000000000..2546575ae7 --- /dev/null +++ b/docusaurus-asgardeo/static/apis/organization-apis/restapis/notification-senders-v2.yaml @@ -0,0 +1,2274 @@ +openapi: 3.0.0 +info: + title: Notification Senders v2 API + description: This document specifies **Email, SMS and Push notification sender RESTful API** for **Asgardeo** organizations. + To access the notification sender organization APIs in Asgardeo, you need to first get an access token from your organization. + version: "v2" +servers: + - url: https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v2 + variables: + serverUrl: + default: https://api.asgardeo.io/t/{root-organization-name}/o/ + root-organization-name: + default: "{root-organization-name}" +security: + - OAuth2: [] +paths: + /notification-senders/email: + get: + tags: + - Email Senders + summary: Get a list of email senders + description: | + This API provides the capability to retrieve the list of email senders.
    + + Scope(Permission) required: `internal_org_notification_senders_view` + operationId: getEmailSenders + responses: + "200": + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/EmailProviderList' + examples: + basicAuthWithAuthTypeResponseExample: + $ref: '#/components/examples/SMTPBasedEmailSenderWithBasicAuthTypeListResponseExample' + clientCredentialResponseEXample: + $ref: '#/components/examples/SMTPBasedEmailSenderWithClientCredentialAuthTypeListResponseExample' + httpBasicAuthResponseExample: + $ref: '#/components/examples/HTTPBasedEmailSenderWithBasicAuthTypeListResponseExample' + httpClientCredentialResponseExample: + $ref: '#/components/examples/HTTPBasedEmailSenderWithClientCredentialAuthTypeListResponseExample' + httpBearerTokenResponseExample: + $ref: '#/components/examples/HTTPBasedEmailSenderWithBearerTokenAuthTypeListResponseExample' + httpApiKeyResponseExample: + $ref: '#/components/examples/HTTPBasedEmailSenderWithAPIKeyAuthTypeListResponseExample' + httpNoneAuthResponseExample: + $ref: '#/components/examples/HTTPBasedEmailSenderWithNoneAuthTypeListResponseExample' + "400": + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Unauthorized + "403": + description: Forbidden + "404": + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "405": + description: Method Not Allowed. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v2/notification-senders/email' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + post: + tags: + - Email Senders + summary: Create an email sender + description: | + This API provides the capability to create an email sender. If the 'name' is not defined, 'EmailPublisher' is taken as the default name. For SMTP-based providers, Basic and Client Credential authentication types are supported. For HTTP-based providers, Basic, Client Credential, Bearer Token, API Key, and None authentication types are supported.
    + + Scope(Permission) required: `internal_org_notification_senders_create` + operationId: createEmailSender + requestBody: + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/HTTPBasedEmailSenderAdd' + - $ref: '#/components/schemas/SMTPBasedEmailSenderAdd' + examples: + basicAuthWithAuthTypePOSTEXample: + $ref: '#/components/examples/SMTPBasedEmailSenderBasicAuthWithAuthTypePOSTRequestExample' + clientCredentialPOSTEXample: + $ref: '#/components/examples/SMTPBasedEmailSenderClientCredentialPOSTRequestExample' + httpBasicAuthPOSTExample: + $ref: '#/components/examples/HTTPBasedEmailSenderWithBasicAuthTypePOSTRequestExample' + httpClientCredentialPOSTExample: + $ref: '#/components/examples/HTTPBasedEmailSenderWithClientCredentialAuthTypePOSTRequestExample' + httpBearerTokenPOSTExample: + $ref: '#/components/examples/HTTPBasedEmailSenderWithBearerTokenAuthTypePOSTRequestExample' + httpApiKeyPOSTExample: + $ref: '#/components/examples/HTTPBasedEmailSenderWithAPIKeyAuthTypePOSTRequestExample' + httpNoneAuthPOSTExample: + $ref: '#/components/examples/HTTPBasedEmailSenderWithNoneAuthTypePOSTRequestExample' + responses: + "201": + description: Successful Response + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/HTTPBasedEmailSenderAdd' + - $ref: '#/components/schemas/SMTPBasedEmailSenderAdd' + examples: + basicAuthWithAuthTypeResponseExample: + $ref: '#/components/examples/SMTPBasedEmailSenderWithBasicAuthTypeResponseExample' + clientCredentialResponseExample: + $ref: '#/components/examples/SMTPBasedEmailSenderWithClientCredentialAuthTypeResponseExample' + httpBasicAuthResponseExample: + $ref: '#/components/examples/HTTPBasedEmailSenderWithBasicAuthTypeResponseExample' + httpClientCredentialResponseExample: + $ref: '#/components/examples/HTTPBasedEmailSenderWithClientCredentialAuthTypeResponseExample' + httpBearerTokenResponseExample: + $ref: '#/components/examples/HTTPBasedEmailSenderWithBearerTokenAuthTypeResponseExample' + httpApiKeyResponseExample: + $ref: '#/components/examples/HTTPBasedEmailSenderWithAPIKeyAuthTypeResponseExample' + httpNoneAuthResponseExample: + $ref: '#/components/examples/HTTPBasedEmailSenderWithNoneAuthTypeResponseExample' + "400": + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Unauthorized + "403": + description: Forbidden + "404": + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "405": + description: Method Not Allowed. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "409": + description: Conflict + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v2/notification-senders/email' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -H 'Content-Type: application/json' \ + -d '{ + "fromAddress": "iam@gmail.com", + "authType": "BASIC", + "properties": [ + { + "key": "mail.smtp.starttls.enable", + "value": true + }, + { + "key": "userName", + "value": "iam" + }, + { + "key": "password", + "value": "iam123" + } + ] + }' + /notification-senders/email/{sender-name}: + get: + tags: + - Email Senders + summary: Retrieve an email sender by name + description: | + This API provides the capability to retrieve an email sender by name. + The URL encoded email sender name is used as sender-name.
    + + Scope(Permission) required: `internal_org_notification_senders_view` + operationId: getEmailSender + parameters: + - name: sender-name + in: path + description: name of the email sender + required: true + style: simple + explode: false + schema: + type: string + responses: + "200": + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/EmailSender' + examples: + basicAuthWithAuthTypeResponseExample: + $ref: '#/components/examples/SMTPBasedEmailSenderWithBasicAuthTypeResponseExample' + clientCredentialResponseExample: + $ref: '#/components/examples/SMTPBasedEmailSenderWithClientCredentialAuthTypeResponseExample' + httpBasicAuthResponseExample: + $ref: '#/components/examples/HTTPBasedEmailSenderWithBasicAuthTypeResponseExample' + httpClientCredentialResponseExample: + $ref: '#/components/examples/HTTPBasedEmailSenderWithClientCredentialAuthTypeResponseExample' + httpBearerTokenResponseExample: + $ref: '#/components/examples/HTTPBasedEmailSenderWithBearerTokenAuthTypeResponseExample' + httpApiKeyResponseExample: + $ref: '#/components/examples/HTTPBasedEmailSenderWithAPIKeyAuthTypeResponseExample' + httpNoneAuthResponseExample: + $ref: '#/components/examples/HTTPBasedEmailSenderWithNoneAuthTypeResponseExample' + "400": + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Unauthorized + "403": + description: Forbidden + "404": + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "405": + description: Method Not Allowed. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v2/notification-senders/email/{email-sender-name}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + put: + tags: + - Email Senders + summary: Update an email sender + description: | + This API provides the capability to update an email sender by name. + The URL encoded email sender name is used as sender-name.
    + + Scope(Permission) required: `internal_org_notification_senders_update` + operationId: updateEmailSender + parameters: + - name: sender-name + in: path + description: name of the email sender + required: true + style: simple + explode: false + schema: + type: string + requestBody: + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/HTTPBasedEmailSenderUpdate' + - $ref: '#/components/schemas/SMTPBasedEmailSenderUpdate' + examples: + basicAuthWithAuthTypePUTEXample: + $ref: '#/components/examples/SMTPBasedEmailSenderBasicAuthWithAuthTypePUTRequestExample' + clientCredentialPUTEXample: + $ref: '#/components/examples/SMTPBasedEmailSenderClientCredentialPUTRequestExample' + httpBasicAuthPUTExample: + $ref: '#/components/examples/HTTPBasedEmailSenderWithBasicAuthTypePUTRequestExample' + httpClientCredentialPUTExample: + $ref: '#/components/examples/HTTPBasedEmailSenderWithClientCredentialAuthTypePUTRequestExample' + httpBearerTokenPUTExample: + $ref: '#/components/examples/HTTPBasedEmailSenderWithBearerTokenAuthTypePUTRequestExample' + httpApiKeyPUTExample: + $ref: '#/components/examples/HTTPBasedEmailSenderWithAPIKeyAuthTypePUTRequestExample' + httpNoneAuthPUTExample: + $ref: '#/components/examples/HTTPBasedEmailSenderWithNoneAuthTypePUTRequestExample' + + required: true + responses: + "200": + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/EmailSender' + examples: + basicAuthWithAuthTypeResponseExample: + $ref: '#/components/examples/SMTPBasedEmailSenderWithBasicAuthTypeResponseExample' + clientCredentialResponseExample: + $ref: '#/components/examples/SMTPBasedEmailSenderWithClientCredentialAuthTypeResponseExample' + httpBasicAuthResponseExample: + $ref: '#/components/examples/HTTPBasedEmailSenderWithBasicAuthTypeResponseExample' + httpClientCredentialResponseExample: + $ref: '#/components/examples/HTTPBasedEmailSenderWithClientCredentialAuthTypeResponseExample' + httpBearerTokenResponseExample: + $ref: '#/components/examples/HTTPBasedEmailSenderWithBearerTokenAuthTypeResponseExample' + httpApiKeyResponseExample: + $ref: '#/components/examples/HTTPBasedEmailSenderWithAPIKeyAuthTypeResponseExample' + httpNoneAuthResponseExample: + $ref: '#/components/examples/HTTPBasedEmailSenderWithNoneAuthTypeResponseExample' + "400": + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Unauthorized + "403": + description: Forbidden + "404": + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "405": + description: Method Not Allowed. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PUT' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v2/notification-senders/email' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -H 'Content-Type: application/json' \ + -d '{ + "fromAddress": "iam@gmail.com", + "authType": "BASIC", + "properties": [ + { + "key": "mail.smtp.starttls.enable", + "value": true + }, + { + "key": "userName", + "value": "iam" + }, + { + "key": "password", + "value": "iam123" + } + ] + }' + delete: + tags: + - Email Senders + summary: Delete an email sender by name + description: | + This API provides the capability to delete an email sender by name. + The URL encoded email sender name is used as sender-name.
    + + Scope(Permission) required: `internal_org_notification_senders_delete` + operationId: deleteEmailSender + parameters: + - name: sender-name + in: path + description: name of the email sender + required: true + style: simple + explode: false + schema: + type: string + responses: + "204": + description: No Content + "400": + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Unauthorized + "403": + description: Forbidden + "404": + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "405": + description: Method Not Allowed. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'DELETE' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v2/notification-senders/email/{email-sender-name}' \ + -H 'accept: */*' \ + -H 'Authorization: Bearer {bearer_token}' + /notification-senders/sms: + get: + tags: + - SMS Senders + summary: Get a list of SMS senders + description: | + This API provides the capability to retrieve a list of SMS notification senders.
    + + Scope(Permission) required: `internal_org_notification_senders_view` + operationId: getSMSSenders + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/SMSProviderList' + examples: + ListOfSMSProviderResponseExample: + $ref: '#/components/examples/SMSProvidersListResponseExample' + "400": + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Unauthorized + "403": + description: Forbidden + "404": + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "405": + description: Method Not Allowed. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v2/notification-senders/sms' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + post: + tags: + - SMS Senders + summary: Create a SMS sender + description: | + This API provides the capability to create a SMS sender. + If the 'name' is not defined, 'SMSPublisher' is taken as the default name.
    + + Scope(Permission) required: `internal_org_notification_senders_create` + operationId: createSMSSender + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/SMSSenderAdd' + examples: + TwilioSMSProviderRequestExample: + $ref: '#/components/examples/TwilioSMSProviderRequestExample' + VonageSMSProviderRequestExample: + $ref: '#/components/examples/VonageSMSProviderRequestExample' + CustomSMSProviderRequestExample: + $ref: '#/components/examples/CustomSMSProviderRequestExample' + responses: + "201": + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/SMSSender' + examples: + TwilioSMSProviderResponseExample: + $ref: '#/components/examples/TwilioSMSProviderResponseExample' + VonageSMSProviderResponseExample: + $ref: '#/components/examples/VonageSMSProviderResponseExample' + CustomSMSProviderResponseExample: + $ref: '#/components/examples/CustomSMSProviderResponseExample' + "400": + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Unauthorized + "403": + description: Forbidden + "404": + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "405": + description: Method Not Allowed. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "409": + description: Conflict + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v2/notification-senders/sms' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -H 'Content-Type: application/json' \ + -d '{ + "provider": "NEXMO", + "providerURL": "https://rest.nexmo.com/sms/json", + "key": "123**45", + "secret": "5tg**ssd", + "sender": "+94 775563324", + "type": "json", + "properties": [ + { + "key": "body.scope", + "value": "internal" + }, + { + "key": "http.headers", + "value": "X-Version: 1, Authorization: bearer ,Accept: application/json ,Content-Type: application/json" + } + ] + }' + /notification-senders/sms/{sender-name}: + get: + tags: + - SMS Senders + summary: Get a SMS sender by name + description: | + This API provides the capability to retrieve a SMS notification sender by name. + The URL encoded SMS sender name is used as sender-name.
    + + Scope(Permission) required: `internal_org_notification_senders_view` + operationId: getSMSSender + parameters: + - name: sender-name + in: path + description: name of the SMS sender + required: true + style: simple + explode: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/SMSSender' + examples: + TwilioSMSProviderResponseExample: + $ref: '#/components/examples/TwilioSMSProviderResponseExample' + VonageSMSProviderResponseExample: + $ref: '#/components/examples/VonageSMSProviderResponseExample' + CustomSMSProviderResponseExample: + $ref: '#/components/examples/CustomSMSProviderResponseExample' + "400": + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Unauthorized + "403": + description: Forbidden + "404": + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "405": + description: Method Not Allowed. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v2/notification-senders/sms/{sms-sender-name}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + put: + tags: + - SMS Senders + summary: Update a SMS sender + description: | + This API provides the capability to update a SMS Sender. + The URL encoded SMS sender name is used as sender-name.
    + + + Scope(Permission) required: `internal_org_notification_senders_update` + operationId: updateSMSSender + parameters: + - name: sender-name + in: path + description: name of the SMS sender + required: true + style: simple + explode: false + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/SMSSenderUpdateRequest' + examples: + TwilioSMSProviderRequestExample: + $ref: '#/components/examples/TwilioSMSProviderRequestExample' + VonageSMSProviderRequestExample: + $ref: '#/components/examples/VonageSMSProviderRequestExample' + CustomSMSProviderRequestExample: + $ref: '#/components/examples/CustomSMSProviderRequestExample' + required: true + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/SMSSender' + examples: + TwilioSMSProviderResponseExample: + $ref: '#/components/examples/TwilioSMSProviderResponseExample' + VonageSMSProviderResponseExample: + $ref: '#/components/examples/VonageSMSProviderResponseExample' + CustomSMSProviderResponseExample: + $ref: '#/components/examples/CustomSMSProviderResponseExample' + "400": + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Unauthorized + "403": + description: Forbidden + "404": + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "405": + description: Method Not Allowed. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PUT' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v2/notification-senders/sms/{sms-sender-name}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -H 'Content-Type: application/json' \ + -d '{ + "provider": "NEXMO", + "providerURL": "https://rest.nexmo.com/sms/json", + "key": "123**45", + "secret": "5tg**ssd", + "sender": "+94 775563324", + "type": "json", + "properties": [ + { + "key": "body.scope", + "value": "internal" + }, + { + "key": "http.headers", + "value": "X-Version: 1, Authorization: bearer ,Accept: application/json ,Content-Type: application/json" + } + ] + }' + delete: + tags: + - SMS Senders + summary: Delete a SMS sender by name + description: | + This API provides the capability to delete a SMS sender by name. + The URL encoded SMS sender name is used as sender-name.
    + + Scope(Permission) required: `internal_org_notification_senders_delete` + operationId: deleteSMSSender + parameters: + - name: sender-name + in: path + description: name of the SMS sender + required: true + style: simple + explode: false + schema: + type: string + responses: + "204": + description: No Content + "400": + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Unauthorized + "403": + description: Forbidden + "404": + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "405": + description: Method Not Allowed. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'DELETE' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v2/notification-senders/sms/{sms-sender-name}' \ + -H 'accept: */*' \ + -H 'Authorization: Bearer {bearer_token}' + /notification-senders/push: + get: + tags: + - Push Senders + summary: Get a list of push notification senders + description: | + This API provides the capability to retrieve the list of push notification senders.
    + + Scope(Permission) required: `internal_org_notification_senders_view` + operationId: getPushSenders + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/PushProviderList' + "400": + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Unauthorized + "403": + description: Forbidden + "404": + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "405": + description: Method Not Allowed. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v2/notification-senders/push' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + post: + tags: + - Push Senders + summary: Create a push notification sender + description: | + This API provides the capability to create a push notification sender. + If the 'name' is not defined, 'PushPublisher' is taken as the default name.
    + + Scope(Permission) required: `internal_org_notification_senders_create` + operationId: createSMSSender + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PushSenderAdd' + example: + provider: FCM + properties: + - key: serviceAccountContent + value: "base64EncodedServiceAccountJsonString" + responses: + "201": + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/PushSender' + "400": + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Unauthorized + "403": + description: Forbidden + "404": + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "405": + description: Method Not Allowed. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "409": + description: Conflict + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v2/notification-senders/push' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -H 'Content-Type: application/json' \ + -d '{ + "provider": "FCM", + "properties": [ + { + "key": "serviceAccountContent", + "value": "base64EncodedServiceAccountJsonString" + } + ] + }' + /notification-senders/push/{sender-name}: + get: + tags: + - Push Senders + summary: Get a push sender by name + description: | + This API provides the capability to retrieve a push notification sender by name. + The URL encoded push sender name is used as sender-name.
    + + Scope(Permission) required: `internal_org_notification_senders_view` + operationId: getPushSender + parameters: + - name: sender-name + in: path + description: name of the push sender + required: true + style: simple + explode: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/PushSender' + "400": + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Unauthorized + "403": + description: Forbidden + "404": + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "405": + description: Method Not Allowed. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v2/notification-senders/push/{push-sender-name}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + put: + tags: + - Push Senders + summary: Update a push notification sender + description: | + This API provides the capability to update a push notification sender. + The URL encoded push notification sender name is used as sender-name.
    + + + Scope(Permission) required: `internal_org_notification_senders_update` + operationId: updatePushSender + parameters: + - name: sender-name + in: path + description: name of the push notification sender + required: true + style: simple + explode: false + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PushSenderUpdateRequest' + example: + provider: FCM + properties: + - key: serviceAccountContent + value: "base64EncodedServiceAccountJsonString" + required: true + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/PushSender' + "400": + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Unauthorized + "403": + description: Forbidden + "404": + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "405": + description: Method Not Allowed. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PUT' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v2/notification-senders/push/{push-sender-name}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -H 'Content-Type: application/json' \ + -d '{ + "provider": "FCM", + "properties": [ + { + "key": "serviceAccountContent", + "value": "base64EncodedServiceAccountJsonString" + } + ] + }' + delete: + tags: + - Push Senders + summary: Delete a push notification sender by name + description: | + This API provides the capability to delete a push notification sender by name. + The URL encoded push notification sender name is used as sender-name.
    + + Scope(Permission) required: `internal_org_notification_senders_delete` + operationId: deletePushSender + parameters: + - name: sender-name + in: path + description: name of the push notification sender + required: true + style: simple + explode: false + schema: + type: string + responses: + "204": + description: No Content + "400": + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Unauthorized + "403": + description: Forbidden + "404": + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "405": + description: Method Not Allowed. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'DELETE' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v2/notification-senders/push/{push-sender-name}' \ + -H 'accept: */*' \ + -H 'Authorization: Bearer {bearer_token}' +components: + schemas: + Error: + type: object + properties: + code: + type: string + example: NSM-00000 + message: + type: string + example: Some Error Message + description: + type: string + example: Some Error Description + traceId: + type: string + example: e0fbcfeb-3617-43c4-8dd0-7b7d38e13047 + SMTPBasedEmailSenderAdd: + type: object + properties: + name: + type: string + provider: + type: string + example: SMTP + smtpServerHost: + type: string + smtpPort: + type: integer + fromAddress: + type: string + example: iam@gmail.com + authType: + type: string + example: CLIENT_CREDENTIAL + properties: + type: array + example: + - key: body.scope + value: "true" + - key: mail.smtp.starttls.enable + value: true + - key: clientId + value: "3e172dd2-901b-43a9-a26a-728466795f01" + - key: clientSecret + value: "83cdc120-ccf6-4163-a4a8-c1ba3e872daa" + - key: tokenEndpoint + value: "https://login.microsoftonline.com/da76d684-740f-4d94-8717-9d5fb21dd1f9/oauth2/v2.0/token" + - key: scopes + value: "https://graph.microsoft.com/.default" + items: + $ref: '#/components/schemas/Properties' + HTTPBasedEmailSenderAdd: + type: object + properties: + name: + type: string + provider: + type: string + example: HTTP + providerURL: + type: string + example: https://custom.email.provider/send + authType: + type: string + example: BASIC + properties: + type: array + example: + - key: http.client.method + value: POST + - key: contentType + value: JSON + - key: http.headers + value: "X-Version: 1, Header1: value1" + - key: body + value: "{\"subject\": \"{{subject}}\", \"body\": \"{{body}}\", \"footer\": \"{{footer}}\", \"to\": \"{{send-to}}\"}" + - key: clientId + value: "3e172dd2-901b-43a9-a26a-728466795f01" + - key: clientSecret + value: "83cdc120-ccf6-4163-a4a8-c1ba3e872daa" + - key: tokenEndpoint + value: "https://login.microsoftonline.com/da76d684-740f-4d94-8717-9d5fb21dd1f9/oauth2/v2.0/token" + - key: scopes + value: "https://graph.microsoft.com/.default" + items: + $ref: '#/components/schemas/Properties' + SMSSenderAdd: + required: + - provider + - contentType + type: object + properties: + name: + type: string + example: SMSPublisher + provider: + type: string + example: NEXMO + providerURL: + type: string + example: https://rest.nexmo.com/sms/json + key: + type: string + example: 123**45 + secret: + type: string + example: 5tg**ssd + authentication: + $ref: '#/components/schemas/Authentication' + sender: + type: string + example: +94 775563324 + contentType: + type: string + enum: + - JSON + - FORM + properties: + type: array + example: + - key: http.headers + value: "X-Version: 1, Authorization: bearer ,Accept: application/json ,Content-Type: application/json" + items: + $ref: '#/components/schemas/Properties' + PushSenderAdd: + required: + - provider + - properties + type: object + properties: + name: + type: string + example: PushPublisher + provider: + type: string + example: fcm + properties: + type: array + example: + - key: fcm.serviceAccount + value: jsonString + - key: aws.keyId + value: sampleKeyId + items: + $ref: '#/components/schemas/Properties' + EmailSender: + required: + - name + type: object + properties: + name: + type: string + example: EmailPublisher + provider: + type: string + example: SMTP + providerURL: + type: string + example: https://custom.email.provider/send + smtpServerHost: + type: string + example: smtp.gmail.com + smtpPort: + type: integer + example: 587 + fromAddress: + type: string + example: iam@gmail.com + authType: + type: string + example: BASIC + properties: + type: array + example: + - key: mail.smtp.starttls.enable + value: true + items: + $ref: '#/components/schemas/Properties' + SMSSender: + required: + - providerURL + - name + - provider + - contentType + type: object + properties: + name: + type: string + example: SMSPublisher + provider: + type: string + example: NEXMO + providerURL: + type: string + example: https://rest.nexmo.com/sms/json + key: + type: string + example: 123**45 + secret: + type: string + example: 5tg**ssd + sender: + type: string + example: +94 775563324 + authentication: + $ref: '#/components/schemas/Authentication' + contentType: + type: string + enum: + - JSON + - FORM + properties: + type: array + example: + - key: body.scope + value: "internal" + - key: http.headers + value: "X-Version: 1, Authorization: bearer ,Accept: application/json ,Content-Type: application/json" + items: + $ref: '#/components/schemas/Properties' + PushSender: + required: + - provider + - name + properties: + name: + type: string + example: PushPublisher + provider: + type: string + example: fcm + properties: + type: array + example: + - key: fcm.serviceAccount + value: "jsonString" + - key: aws.keyId + value: "sampleKeyId" + items: + $ref: '#/components/schemas/Properties' + SMSSenderUpdateRequest: + required: + - provider + - contentType + type: object + properties: + provider: + type: string + example: NEXMO + providerURL: + type: string + example: https://rest.nexmo.com/sms/json + key: + type: string + example: 123**45 + secret: + type: string + example: 5tg**ssd + authentication: + $ref: '#/components/schemas/Authentication' + sender: + type: string + example: +94 775563324 + contentType: + type: string + enum: + - JSON + - FORM + properties: + type: array + example: + - key: http.headers + value: "X-Version: 1, Authorization: bearer ,Accept: application/json ,Content-Type: application/json" + items: + $ref: '#/components/schemas/Properties' + SMTPBasedEmailSenderUpdate: + type: object + properties: + provider: + type: string + example: SMTP + smtpServerHost: + type: string + smtpPort: + type: integer + fromAddress: + type: string + example: iam@gmail.com + authType: + type: string + example: CLIENT_CREDENTIAL + properties: + type: array + example: + - key: body.scope + value: "true" + - key: mail.smtp.starttls.enable + value: true + - key: clientId + value: "3e172dd2-901b-43a9-a26a-728466795f01" + - key: clientSecret + value: "83cdc120-ccf6-4163-a4a8-c1ba3e872daa" + - key: tokenEndpoint + value: "https://login.microsoftonline.com/da76d684-740f-4d94-8717-9d5fb21dd1f9/oauth2/v2.0/token" + - key: scopes + value: "https://graph.microsoft.com/.default" + items: + $ref: '#/components/schemas/Properties' + HTTPBasedEmailSenderUpdate: + type: object + properties: + provider: + type: string + example: HTTP + providerURL: + type: string + example: https://custom.email.provider/send + authType: + type: string + example: BASIC + properties: + type: array + example: + - key: http.client.method + value: POST + - key: contentType + value: JSON + - key: http.headers + value: "X-Version: 1, Header1: value1" + - key: body + value: "{\"subject\": \"{{subject}}\", \"body\": \"{{body}}\", \"footer\": \"{{footer}}\", \"to\": \"{{send-to}}\"}" + - key: clientId + value: "3e172dd2-901b-43a9-a26a-728466795f01" + - key: clientSecret + value: "83cdc120-ccf6-4163-a4a8-c1ba3e872daa" + - key: tokenEndpoint + value: "https://login.microsoftonline.com/da76d684-740f-4d94-8717-9d5fb21dd1f9/oauth2/v2.0/token" + - key: scopes + value: "https://graph.microsoft.com/.default" + items: + $ref: '#/components/schemas/Properties' + PushSenderUpdateRequest: + required: + - provider + - properties + type: object + properties: + provider: + type: string + properties: + type: array + example: + - key: fcm.serviceAccount + value: "jsonString" + - key: aws.keyId + value: "sampleKeyId" + items: + $ref: '#/components/schemas/Properties' + Properties: + required: + - key + - value + type: object + properties: + key: + type: string + value: + type: string + example: + - key: email + value: iam@gmail.com + EmailProviderList: + type: array + items: + $ref: '#/components/schemas/EmailSender' + SMSProviderList: + type: array + items: + $ref: '#/components/schemas/SMSSender' + PushProviderList: + type: array + items: + $ref: '#/components/schemas/PushSender' + Schema: + type: object + properties: + id: + type: integer + format: int64 + Authentication: + type: object + description: > + The type of authentication required by the action's endpoint. The following options are supported: + + - CLIENT_CREDENTIAL: Client credential authentication.
    + ``{ + "type": "CLIENT_CREDENTIAL", + "properties": { + "clientId": "3e172dd2-901b-43a9-a26a-728466795f01", + "clientSecret": "83cdc120-ccf6-4163-a4a8-c1ba3e872daa", + "tokenEndpoint": "https://custom.sms.provider/auth/token", + "scopes": "send_scope" + } + }`` + - BASIC: Username and password based authentication.
    + ``{ + "type": "BASIC", + "properties": { + "username": "admin", + "password": "admin123" + } + }`` + - BEARER: Token based based authentication.
    + ``{ + "type": "BEARER", + "properties": { + "token": "83cdc120-ccf6-4163-a4a8-c1ba3e872daa" + } + }`` + - API_KEY: API key secret based authentication.
    + ``{ + "type": "API_KEY", + "properties": { + "header": "auth", + "value": "123ert45" + } + }`` + required: + - type + properties: + type: + type: string + enum: + - CLIENT_CREDENTIAL + - BASIC + - BEARER + - API_KEY + - NONE + example: CLIENT_CREDENTIAL + properties: + type: object + description: Authentication properties specific to the selected type. + additionalProperties: true + example: + type: CLIENT_CREDENTIAL + properties: + clientId: 3e172dd2-901b-43a9-a26a-728466795f01 + clientSecret: 83cdc120-ccf6-4163-a4a8-c1ba3e872daa + tokenEndpoint: https://custom.sms.provider/auth/token + scopes: send_scope + parameters: + typeQueryParam: + name: type + in: query + description: | + Type of authenticators. Can be either 'LOCAL' or 'REQUEST_PATH' + required: false + style: form + explode: true + schema: + type: string + securitySchemes: + BasicAuth: + type: http + scheme: basic + OAuth2: + type: oauth2 + flows: + authorizationCode: + authorizationUrl: https://api.asgardeo.io/t/{root-organization-name}/oauth2/authorize + tokenUrl: https://api.asgardeo.io/t/{root-organization-name}/oauth2/token + scopes: {} + examples: + SMTPBasedEmailSenderClientCredentialPOSTRequestExample: + summary: "Post request for SMTP based email providers with client credential authentication" + value: + name: "EmailPublisher" + provider: "SMTP" + smtpServerHost: "smtp.gmail.com" + smtpPort: 587 + fromAddress: "test@gmail.com" + authType: "CLIENT_CREDENTIAL" + properties: + - key: "mail.smtp.signature" + value: "Identity Server" + - key: "clientId" + value: "3e172dd2-901b-43a9-a26a-728466795f01" + - key: "clientSecret" + value: "83cdc120-ccf6-4163-a4a8-c1ba3e872daa" + - key: "tokenEndpoint" + value: "https://login.microsoftonline.com/da84-740f-9d5ff9/oauth2/token" + - key: "scopes" + value: "https://graph.microsoft.com/.default" + SMTPBasedEmailSenderBasicAuthWithAuthTypePOSTRequestExample: + summary: "Post request for SMTP based email providers with basic authentication" + value: + name: "EmailPublisher" + provider: "SMTP" + smtpServerHost: "smtp.gmail.com" + smtpPort: 587 + fromAddress: "test@gmail.com" + authType: "BASIC" + properties: + - key: "mail.smtp.signature" + value: "Identity Server" + - key: "userName" + value: "iam" + - key: "password" + value: "iam123" + HTTPBasedEmailSenderWithBasicAuthTypePOSTRequestExample: + summary: "Post request for HTTP based email providers with basic authentication" + value: + name: "EmailPublisher" + provider: "HTTP" + providerURL: "https://api.example.com/api/v1" + authType: "BASIC" + properties: + - key: "http.client.method" + value: "POST" + - key: contentType + value: "JSON" + - key: "http.headers" + value: "X-Version: 1, Custom-Header: value" + - key: "body" + value: "{\"subject\": \"{{subject}}\", \"body\": \"{{body}}\", \"footer\": \"{{footer}}\", \"to\": \"{{send-to}}\"}" + - key: "userName" + value: "iam" + - key: "password" + value: "iam123" + HTTPBasedEmailSenderWithClientCredentialAuthTypePOSTRequestExample: + summary: "Post request for HTTP based email providers with client credential authentication" + value: + name: "EmailPublisher" + provider: "HTTP" + providerURL: "https://api.example.com/api/v1" + authType: "CLIENT_CREDENTIAL" + properties: + - key: "http.client.method" + value: "POST" + - key: contentType + value: "JSON" + - key: "http.headers" + value: "X-Version: 1, Custom-Header: value" + - key: "body" + value: "{\"subject\": \"{{subject}}\", \"body\": \"{{body}}\", \"footer\": \"{{footer}}\", \"to\": \"{{send-to}}\"}" + - key: "clientId" + value: "client-id-123" + - key: "clientSecret" + value: "client-secret-abc" + - key: "tokenEndpoint" + value: "https://example.com/oauth2/token" + - key: "scopes" + value: "send_scope" + HTTPBasedEmailSenderWithBearerTokenAuthTypePOSTRequestExample: + summary: "Post request for HTTP based email providers with bearer token authentication" + value: + name: "EmailPublisher" + provider: "HTTP" + providerURL: "https://api.example.com/api/v1" + authType: "BEARER" + properties: + - key: "http.client.method" + value: "POST" + - key: contentType + value: "JSON" + - key: "http.headers" + value: "X-Version: 1, Custom-Header: value" + - key: "body" + value: "{\"subject\": \"{{subject}}\", \"body\": \"{{body}}\", \"footer\": \"{{footer}}\", \"to\": \"{{send-to}}\"}" + - key: "accessToken" + value: "bearer-token" + HTTPBasedEmailSenderWithAPIKeyAuthTypePOSTRequestExample: + summary: "Post request for HTTP based email providers with API key authentication" + value: + name: "EmailPublisher" + providerURL: "https://api.example.com/api/v1" + authType: "API_KEY" + properties: + - key: "http.client.method" + value: "POST" + - key: contentType + value: "JSON" + - key: "http.headers" + value: "X-Version: 1, Custom-Header: value" + - key: "body" + value: "{\"subject\": \"{{subject}}\", \"body\": \"{{body}}\", \"footer\": \"{{footer}}\", \"to\": \"{{send-to}}\"}" + - key: "apiKeyHeader" + value: "API-Key-Header" + - key: "apiKeyValue" + value: "api-key-value" + HTTPBasedEmailSenderWithNoneAuthTypePOSTRequestExample: + summary: "Post request for HTTP based email providers with no authentication" + value: + name: "EmailPublisher" + provider: "HTTP" + providerURL: "https://api.example.com/api/v1" + authType: "NONE" + properties: + - key: "http.client.method" + value: "POST" + - key: contentType + value: "JSON" + - key: "http.headers" + value: "X-Version: 1, Custom-Header: value" + - key: "body" + value: "{\"subject\": \"{{subject}}\", \"body\": \"{{body}}\", \"footer\": \"{{footer}}\", \"to\": \"{{send-to}}\"}" + SMTPBasedEmailSenderClientCredentialPUTRequestExample: + summary: "Put request for SMTP based email providers with client credential authentication" + value: + provider: "SMTP" + smtpServerHost: "smtp.gmail.com" + smtpPort: 587 + fromAddress: "test@gmail.com" + authType: "CLIENT_CREDENTIAL" + properties: + - key: "mail.smtp.signature" + value: "Identity Server" + - key: "clientId" + value: "3e172dd2-901b-43a9-a26a-728466795f01" + - key: "clientSecret" + value: "83cdc120-ccf6-4163-a4a8-c1ba3e872daa" + - key: "tokenEndpoint" + value: "https://login.microsoftonline.com/da84-740f-9d5ff9/oauth2/token" + - key: "scopes" + value: "https://graph.microsoft.com/.default" + SMTPBasedEmailSenderBasicAuthWithAuthTypePUTRequestExample: + summary: "Put request for SMTP based email providers with basic authentication" + value: + provider: "SMTP" + smtpServerHost: "smtp.gmail.com" + smtpPort: 587 + fromAddress: "test@gmail.com" + authType: "BASIC" + properties: + - key: "mail.smtp.signature" + value: "Identity Server" + - key: "userName" + value: "iam" + - key: "password" + value: "iam123" + HTTPBasedEmailSenderWithBasicAuthTypePUTRequestExample: + summary: "Put request for HTTP based email providers with basic authentication" + value: + provider: "HTTP" + providerURL: "https://api.example.com/api/v1" + authType: "BASIC" + properties: + - key: "http.client.method" + value: "POST" + - key: contentType + value: "JSON" + - key: "http.headers" + value: "X-Version: 1, Custom-Header: value" + - key: "body" + value: "{\"subject\": \"{{subject}}\", \"body\": \"{{body}}\", \"footer\": \"{{footer}}\", \"to\": \"{{send-to}}\"}" + - key: "userName" + value: "iam" + - key: "password" + value: "iam123" + HTTPBasedEmailSenderWithClientCredentialAuthTypePUTRequestExample: + summary: "Put request for HTTP based email providers with client credential authentication" + value: + provider: "HTTP" + providerURL: "https://api.example.com/api/v1" + authType: "CLIENT_CREDENTIAL" + properties: + - key: "http.client.method" + value: "POST" + - key: contentType + value: "JSON" + - key: "http.headers" + value: "X-Version: 1, Custom-Header: value" + - key: "body" + value: "{\"subject\": \"{{subject}}\", \"body\": \"{{body}}\", \"footer\": \"{{footer}}\", \"to\": \"{{send-to}}\"}" + - key: "clientId" + value: "client-id-123" + - key: "clientSecret" + value: "client-secret-abc" + - key: "tokenEndpoint" + value: "https://example.com/oauth2/token" + - key: "scopes" + value: "send_scope" + HTTPBasedEmailSenderWithBearerTokenAuthTypePUTRequestExample: + summary: "Put request for HTTP based email providers with bearer token authentication" + value: + provider: "HTTP" + providerURL: "https://api.example.com/api/v1" + authType: "BEARER" + properties: + - key: "http.client.method" + value: "POST" + - key: contentType + value: "JSON" + - key: "http.headers" + value: "X-Version: 1, Custom-Header: value" + - key: "body" + value: "{\"subject\": \"{{subject}}\", \"body\": \"{{body}}\", \"footer\": \"{{footer}}\", \"to\": \"{{send-to}}\"}" + - key: "accessToken" + value: "bearer-token" + HTTPBasedEmailSenderWithAPIKeyAuthTypePUTRequestExample: + summary: "Put request for HTTP based email providers with API key authentication" + value: + provider: "HTTP" + providerURL: "https://api.example.com/api/v1" + authType: "API_KEY" + properties: + - key: "http.client.method" + value: "POST" + - key: contentType + value: "JSON" + - key: "http.headers" + value: "X-Version: 1, Custom-Header: value" + - key: "body" + value: "{\"subject\": \"{{subject}}\", \"body\": \"{{body}}\", \"footer\": \"{{footer}}\", \"to\": \"{{send-to}}\"}" + - key: "apiKeyHeader" + value: "API-Key-Header" + - key: "apiKeyValue" + value: "api-key-value" + HTTPBasedEmailSenderWithNoneAuthTypePUTRequestExample: + summary: "Put request for HTTP based email providers with no authentication" + value: + provider: "HTTP" + providerURL: "https://api.example.com/api/v1" + authType: "NONE" + properties: + - key: "http.client.method" + value: "POST" + - key: contentType + value: "JSON" + - key: "http.headers" + value: "X-Version: 1, Custom-Header: value" + - key: "body" + value: "{\"subject\": \"{{subject}}\", \"body\": \"{{body}}\", \"footer\": \"{{footer}}\", \"to\": \"{{send-to}}\"}" + SMTPBasedEmailSenderWithClientCredentialAuthTypeResponseExample: + summary: "Response for SMTP based email providers with client credential authentication" + value: + name: "EmailPublisher" + provider: "SMTP" + smtpServerHost: "smtp.gmail.com" + smtpPort: 587 + fromAddress: "test@gmail.com" + authType: "CLIENT_CREDENTIAL" + properties: + - key: "mail.smtp.signature" + value: "Identity Server" + - key: "clientId" + value: "3e172dd2-901b-43a9-a26a-728466795f01" + - key: "tokenEndpoint" + value: "https://login.microsoftonline.com/da84-740f-9d5ff9/oauth2/token" + - key: "scopes" + value: "https://graph.microsoft.com/.default" + SMTPBasedEmailSenderWithBasicAuthTypeResponseExample: + summary: "Response for SMTP based email providers with basic authentication" + value: + name: "EmailPublisher" + provider: "SMTP" + smtpServerHost: "smtp.gmail.com" + smtpPort: 587 + fromAddress: "test@gmail.com" + authType: "BASIC" + properties: + - key: "mail.smtp.signature" + value: "Identity Server" + - key: "userName" + value: "iam" + HTTPBasedEmailSenderWithBasicAuthTypeResponseExample: + summary: "Response for HTTP based email providers with basic authentication" + value: + name: "EmailPublisher" + provider: "HTTP" + providerURL: "https://api.example.com/api/v1" + authType: "BASIC" + properties: + - key: "http.client.method" + value: "POST" + - key: contentType + value: "JSON" + - key: "http.headers" + value: "X-Version: 1, Custom-Header: value" + - key: "body" + value: "{\"subject\": \"{{subject}}\", \"body\": \"{{body}}\", \"footer\": \"{{footer}}\", \"to\": \"{{send-to}}\"}" + - key: "userName" + value: "iam" + HTTPBasedEmailSenderWithClientCredentialAuthTypeResponseExample: + summary: "Response for HTTP based email providers with client credential authentication" + value: + name: "EmailPublisher" + provider: "HTTP" + providerURL: "https://api.example.com/api/v1" + authType: "CLIENT_CREDENTIAL" + properties: + - key: "http.client.method" + value: "POST" + - key: contentType + value: "JSON" + - key: "http.headers" + value: "X-Version: 1, Custom-Header: value" + - key: "body" + value: "{\"subject\": \"{{subject}}\", \"body\": \"{{body}}\", \"footer\": \"{{footer}}\", \"to\": \"{{send-to}}\"}" + - key: "clientId" + value: "client-id-123" + - key: "tokenEndpoint" + value: "https://example.com/oauth2/token" + - key: "scopes" + value: "send_scope" + HTTPBasedEmailSenderWithBearerTokenAuthTypeResponseExample: + summary: "Response for HTTP based email providers with bearer token authentication" + value: + name: "EmailPublisher" + provider: "HTTP" + providerURL: "https://api.example.com/api/v1" + authType: "BEARER" + properties: + - key: "http.client.method" + value: "POST" + - key: contentType + value: "JSON" + - key: "http.headers" + value: "X-Version: 1, Custom-Header: value" + - key: "body" + value: "{\"subject\": \"{{subject}}\", \"body\": \"{{body}}\", \"footer\": \"{{footer}}\", \"to\": \"{{send-to}}\"}" + HTTPBasedEmailSenderWithAPIKeyAuthTypeResponseExample: + summary: "Response for HTTP based email providers with API key authentication" + value: + name: "EmailPublisher" + provider: "HTTP" + providerURL: "https://api.example.com/api/v1" + authType: "API_KEY" + properties: + - key: "http.client.method" + value: "POST" + - key: contentType + value: "JSON" + - key: "http.headers" + value: "X-Version: 1, Custom-Header: value" + - key: "body" + value: "{\"subject\": \"{{subject}}\", \"body\": \"{{body}}\", \"footer\": \"{{footer}}\", \"to\": \"{{send-to}}\"}" + - key: "apiKeyHeader" + value: "API-Key-Header" + HTTPBasedEmailSenderWithNoneAuthTypeResponseExample: + summary: "Response for HTTP based email providers with no authentication" + value: + name: "EmailPublisher" + provider: "HTTP" + providerURL: "https://api.example.com/api/v1" + authType: "NONE" + properties: + - key: "http.client.method" + value: "POST" + - key: contentType + value: "JSON" + - key: "http.headers" + value: "X-Version: 1, Custom-Header: value" + - key: "body" + value: "{\"subject\": \"{{subject}}\", \"body\": \"{{body}}\", \"footer\": \"{{footer}}\", \"to\": \"{{send-to}}\"}" + SMTPBasedEmailSenderWithBasicAuthTypeListResponseExample: + summary: "List response containing an SMTP-based email provider with basic authentication" + value: + - name: "EmailPublisher" + provider: "SMTP" + smtpServerHost: "smtp.gmail.com" + smtpPort: 587 + fromAddress: "test@gmail.com" + authType: "BASIC" + properties: + - key: "mail.smtp.signature" + value: "Identity Server" + - key: "userName" + value: "iam" + SMTPBasedEmailSenderWithClientCredentialAuthTypeListResponseExample: + summary: "List response containing an SMTP-based email provider with client credential authentication" + value: + - name: "EmailPublisher" + provider: "SMTP" + smtpServerHost: "smtp.gmail.com" + smtpPort: 587 + fromAddress: "test@gmail.com" + authType: "CLIENT_CREDENTIAL" + properties: + - key: "mail.smtp.signature" + value: "Identity Server" + - key: "clientId" + value: "3e172dd2-901b-43a9-a26a-728466795f01" + - key: "tokenEndpoint" + value: "https://login.microsoftonline.com/da84-740f-9d5ff9/oauth2/token" + - key: "scopes" + value: "https://graph.microsoft.com/.default" + HTTPBasedEmailSenderWithBasicAuthTypeListResponseExample: + summary: "List response containing an HTTP-based email provider with basic authentication" + value: + - name: "EmailPublisher" + provider: "HTTP" + providerURL: "https://api.example.com/api/v1" + authType: "BASIC" + properties: + - key: "http.client.method" + value: "POST" + - key: contentType + value: "JSON" + - key: "http.headers" + value: "X-Version: 1, Custom-Header: value" + - key: "body" + value: "{\"subject\": \"{{subject}}\", \"body\": \"{{body}}\", \"footer\": \"{{footer}}\", \"to\": \"{{send-to}}\"}" + - key: "userName" + value: "iam" + HTTPBasedEmailSenderWithClientCredentialAuthTypeListResponseExample: + summary: "List response containing an HTTP-based email provider with client credential authentication" + value: + - name: "EmailPublisher" + provider: "HTTP" + providerURL: "https://api.example.com/api/v1" + authType: "CLIENT_CREDENTIAL" + properties: + - key: "http.client.method" + value: "POST" + - key: contentType + value: "JSON" + - key: "http.headers" + value: "X-Version: 1, Custom-Header: value" + - key: "body" + value: "{\"subject\": \"{{subject}}\", \"body\": \"{{body}}\", \"footer\": \"{{footer}}\", \"to\": \"{{send-to}}\"}" + - key: "clientId" + value: "client-id-123" + - key: "tokenEndpoint" + value: "https://example.com/oauth2/token" + - key: "scopes" + value: "send_scope" + HTTPBasedEmailSenderWithBearerTokenAuthTypeListResponseExample: + summary: "List response containing an HTTP-based email provider with bearer token authentication" + value: + - name: "EmailPublisher" + provider: "HTTP" + providerURL: "https://api.example.com/api/v1" + authType: "BEARER" + properties: + - key: "http.client.method" + value: "POST" + - key: contentType + value: "JSON" + - key: "http.headers" + value: "X-Version: 1, Custom-Header: value" + - key: "body" + value: "{\"subject\": \"{{subject}}\", \"body\": \"{{body}}\", \"footer\": \"{{footer}}\", \"to\": \"{{send-to}}\"}" + - key: "accessToken" + value: "bearer-token" + HTTPBasedEmailSenderWithAPIKeyAuthTypeListResponseExample: + summary: "List response containing an HTTP-based email provider with API key authentication" + value: + - name: "EmailPublisher" + provider: "HTTP" + providerURL: "https://api.example.com/api/v1" + authType: "API_KEY" + properties: + - key: "http.client.method" + value: "POST" + - key: contentType + value: "JSON" + - key: "http.headers" + value: "X-Version: 1, Custom-Header: value" + - key: "body" + value: "{\"subject\": \"{{subject}}\", \"body\": \"{{body}}\", \"footer\": \"{{footer}}\", \"to\": \"{{send-to}}\"}" + - key: "apiKeyHeader" + value: "API-Key-Header" + - key: "apiKeyValue" + value: "api-key-value" + HTTPBasedEmailSenderWithNoneAuthTypeListResponseExample: + summary: "List response containing an HTTP-based email provider with no authentication" + value: + - name: "EmailPublisher" + provider: "HTTP" + providerURL: "https://api.example.com/api/v1" + authType: "NONE" + properties: + - key: "http.client.method" + value: "POST" + - key: contentType + value: "JSON" + - key: "http.headers" + value: "X-Version: 1, Custom-Header: value" + - key: "body" + value: "{\"subject\": \"{{subject}}\", \"body\": \"{{body}}\", \"footer\": \"{{footer}}\", \"to\": \"{{send-to}}\"}" + TwilioSMSProviderRequestExample: + summary: Post and PUT request for Twilio SMS Provider + value: + provider: Twilio + sender: +94 775563324 + type : json + properties: + - key: body.scope + value: "internal" + - key: http.headers + value: "X-Version: 1, Accept: application/json, Content-Type: application/json" + authentication: + type: BASIC + properties: + username: "123ert45" + password: "5tg-rts-ssd" + VonageSMSProviderRequestExample: + summary: Post and PUT request for Vonage SMS Provider + value: + provider: Vonage + sender: +94 775563324 + type: json + properties: + - key: body.scope + value: "internal" + - key: http.headers + value: "X-Version: 1, Accept: application/json, Content-Type: application/json" + authentication: + type: BASIC + properties: + username: "123ert45" + password: "5tg-rts-ssd" + CustomSMSProviderRequestExample: + summary: Post and PUT request for Custom SMS Provider + value: + provider: Custom + sender: +94 775563324 + type: json + properties: + - key: body.scope + value: "internal" + - key: http.headers + value: "X-Version: 1, Accept: application/json, Content-Type: application/json" + authentication: + type: CLIENT_CREDENTIAL + properties: + clientId: 3e172dd2-901b-43a9-a26a-728466795f01 + clientSecret: 83cdc120-ccf6-4163-a4a8-c1ba3e872daa + tokenEndpoint: https://custom.sms.provider/auth/token + scopes: send_scope + TwilioSMSProviderResponseExample: + summary: Response for Twilio SMS Provider + value: + name: SMSPublisher + provider: Twilio + key: 123ert45 + secret: 5tg-rts-ssd + sender: +94 775563324 + type: json + properties: + - key: body.scope + value: "internal" + - key: http.headers + value: "X-Version: 1, Accept: application/json, Content-Type: application/json" + authentication: + type: BASIC + properties: + username: "123ert45" + password: "5tg-rts-ssd" + VonageSMSProviderResponseExample: + summary: Response for Vonage SMS Provider + value: + name: SMSPublisher + provider: Vonage + key: 123ert45 + secret: 5tg-rts-ssd + sender: +94 775563324 + type: json + properties: + - key: body.scope + value: "internal" + - key: http.headers + value: "X-Version: 1, Accept: application/json, Content-Type: application/json" + authentication: + type: BASIC + properties: + username: "123ert45" + password: "5tg-rts-ssd" + CustomSMSProviderResponseExample: + summary: Response for Custom SMS Provider + description: This document specifies a **RESTful API** for **WSO2 Identity Server Notification Senders** + value: + name: SMSPublisher + provider: Custom + key: "" + secret: "" + sender: +94 775563324 + type: json + properties: + - key: body.scope + value: "internal" + - key: http.headers + value: "X-Version: 1, Accept: application/json, Content-Type: application/json" + authentication: + type: CLIENT_CREDENTIAL + properties: + clientId: 3e172dd2-901b-43a9-a26a-728466795f01 + clientSecret: 83cdc120-ccf6-4163-a4a8-c1ba3e872daa + tokenEndpoint: https://custom.sms.provider/auth/token + scopes: send_scope + SMSProvidersListResponseExample: + summary: Response for list of SMS Provider + value: + - name: SMSPublisher + provider: Custom + key: "" + secret: "" + sender: +94 775563324 + type: json + properties: + - key: body.scope + value: "internal" + - key: http.headers + value: "X-Version: 1, Accept: application/json, Content-Type: application/json" + authentication: + type: CLIENT_CREDENTIAL + properties: + clientId: 3e172dd2-901b-43a9-a26a-728466795f01 + clientSecret: 83cdc120-ccf6-4163-a4a8-c1ba3e872daa + tokenEndpoint: https://custom.sms.provider/auth/token + scopes: send_scope diff --git a/docusaurus-asgardeo/static/apis/organization-apis/restapis/notification-senders.yaml b/docusaurus-asgardeo/static/apis/organization-apis/restapis/notification-senders.yaml new file mode 100644 index 0000000000..20a6a6264b --- /dev/null +++ b/docusaurus-asgardeo/static/apis/organization-apis/restapis/notification-senders.yaml @@ -0,0 +1,1363 @@ +openapi: 3.0.0 +info: + title: Notification Senders API + description: This document specifies **Email, SMS and Push notification sender RESTful API** for **Asgardeo** organizations. + To access the notification sender organization APIs in Asgardeo, you need to first get an access token from your organization. + version: "v1" +servers: + - url: https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1 + variables: + serverUrl: + default: https://api.asgardeo.io/t/{root-organization-name}/o/ + root-organization-name: + default: "{root-organization-name}" +security: + - OAuth2: [] +paths: + /notification-senders/email: + get: + tags: + - Email Senders + summary: Get a list of email senders + description: | + This API provides the capability to retrieve the list of email senders.
    + + Scope(Permission) required: `internal_org_notification_senders_view` + operationId: getEmailSenders + responses: + "200": + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/EmailProviderList' + "400": + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Unauthorized + "403": + description: Forbidden + "404": + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "405": + description: Method Not Allowed. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/notification-senders/email' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + post: + tags: + - Email Senders + summary: Create an email sender + description: | + This API provides the capability to create an email sender.\n\nIf the 'name' is not defined, 'EmailPublisher' is taken as the default name.
    + + Scope(Permission) required: `internal_org_notification_senders_create` + operationId: createEmailSender + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/EmailSenderAdd' + example: + fromAddress: iam@gmail.com + userName: iam + password: iam123 + properties: + - key: mail.smtp.starttls.enable + value: true + responses: + "201": + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/EmailSender' + "400": + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Unauthorized + "403": + description: Forbidden + "404": + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "405": + description: Method Not Allowed. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "409": + description: Conflict + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/notification-senders/email' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -H 'Content-Type: application/json' \ + -d '{ + "fromAddress": "iam@gmail.com", + "userName": "iam", + "password": "iam123", + "properties": [ + { + "key": "mail.smtp.starttls.enable", + "value": true + } + ] + }' + /notification-senders/email/{sender-name}: + get: + tags: + - Email Senders + summary: Retrieve an email sender by name + description: | + This API provides the capability to retrieve an email sender by name. + The URL encoded email sender name is used as sender-name.
    + + Scope(Permission) required: `internal_org_notification_senders_view` + operationId: getEmailSender + parameters: + - name: sender-name + in: path + description: name of the email sender + required: true + style: simple + explode: false + schema: + type: string + responses: + "200": + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/EmailSender' + "400": + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Unauthorized + "403": + description: Forbidden + "404": + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "405": + description: Method Not Allowed. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/notification-senders/email/{email-sender-name}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + put: + tags: + - Email Senders + summary: Update an email sender + description: | + This API provides the capability to update an email sender by name. + The URL encoded email sender name is used as sender-name.
    + + Scope(Permission) required: `internal_org_notification_senders_update` + operationId: updateEmailSender + parameters: + - name: sender-name + in: path + description: name of the email sender + required: true + style: simple + explode: false + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/EmailSenderUpdateRequest' + example: + fromAddress: iam@gmail.com + userName: iam + password: iam123 + properties: + - key: mail.smtp.starttls.enable + value: true + required: true + responses: + "200": + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/EmailSender' + "400": + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Unauthorized + "403": + description: Forbidden + "404": + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "405": + description: Method Not Allowed. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PUT' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/notification-senders/email/{email-sender-name}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -H 'Content-Type: application/json' \ + -d '{ + "fromAddress": "iam@gmail.com", + "userName": "iam", + "password": "iam123", + "properties": [ + { + "key": "mail.smtp.starttls.enable", + "value": true + } + ] + }' + delete: + tags: + - Email Senders + summary: Delete an email sender by name + description: | + This API provides the capability to delete an email sender by name. + The URL encoded email sender name is used as sender-name.
    + + Scope(Permission) required: `internal_org_notification_senders_delete` + operationId: deleteEmailSender + parameters: + - name: sender-name + in: path + description: name of the email sender + required: true + style: simple + explode: false + schema: + type: string + responses: + "204": + description: No Content + "400": + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Unauthorized + "403": + description: Forbidden + "404": + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "405": + description: Method Not Allowed. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'DELETE' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/notification-senders/email/{email-sender-name}' \ + -H 'accept: */*' \ + -H 'Authorization: Bearer {bearer_token}' + /notification-senders/sms: + get: + tags: + - SMS Senders + summary: Get a list of SMS senders + description: | + This API provides the capability to retrieve a list of SMS notification senders.
    + + Scope(Permission) required: `internal_org_notification_senders_view` + operationId: getSMSSenders + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/SMSProviderList' + "400": + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Unauthorized + "403": + description: Forbidden + "404": + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "405": + description: Method Not Allowed. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/notification-senders/sms' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + post: + tags: + - SMS Senders + summary: Create a SMS sender + description: | + This API provides the capability to create a SMS sender. + If the 'name' is not defined, 'SMSPublisher' is taken as the default name.
    + + Scope(Permission) required: `internal_org_notification_senders_create` + operationId: createSMSSender + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/SMSSenderAdd' + example: + provider: NEXMO + providerURL: https://rest.nexmo.com/sms/json + key: 123**45 + secret: 5tg**ssd + sender: +94 775563324 + type : json + properties: + - key: body.scope + value: "internal" + - key: http.headers + value: "X-Version: 1, Authorization: bearer ,Accept: application/json ,Content-Type: application/json" + responses: + "201": + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/SMSSender' + "400": + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Unauthorized + "403": + description: Forbidden + "404": + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "405": + description: Method Not Allowed. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "409": + description: Conflict + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/notification-senders/sms' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -H 'Content-Type: application/json' \ + -d '{ + "provider": "NEXMO", + "providerURL": "https://rest.nexmo.com/sms/json", + "key": "123**45", + "secret": "5tg**ssd", + "sender": "+94 775563324", + "type": "json", + "properties": [ + { + "key": "body.scope", + "value": "internal" + }, + { + "key": "http.headers", + "value": "X-Version: 1, Authorization: bearer ,Accept: application/json ,Content-Type: application/json" + } + ] + }' + /notification-senders/sms/{sender-name}: + get: + tags: + - SMS Senders + summary: Get a SMS sender by name + description: | + This API provides the capability to retrieve a SMS notification sender by name. + The URL encoded SMS sender name is used as sender-name.
    + + Scope(Permission) required: `internal_org_notification_senders_view` + operationId: getSMSSender + parameters: + - name: sender-name + in: path + description: name of the SMS sender + required: true + style: simple + explode: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/SMSSender' + "400": + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Unauthorized + "403": + description: Forbidden + "404": + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "405": + description: Method Not Allowed. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/notification-senders/sms/{sms-sender-name}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + put: + tags: + - SMS Senders + summary: Update a SMS sender + description: | + This API provides the capability to update a SMS Sender. + The URL encoded SMS sender name is used as sender-name.
    + + + Scope(Permission) required: `internal_org_notification_senders_update` + operationId: updateSMSSender + parameters: + - name: sender-name + in: path + description: name of the SMS sender + required: true + style: simple + explode: false + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/SMSSenderUpdateRequest' + example: + provider: NEXMO + providerURL: https://rest.nexmo.com/sms/json + key: 123**45 + secret: 5tg**ssd + sender: +94 775563324 + type : json + properties: + - key: body.scope + value: "internal" + - key: http.headers + value: "X-Version: 1, Authorization: bearer ,Accept: application/json ,Content-Type: application/json" + required: true + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/SMSSender' + "400": + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Unauthorized + "403": + description: Forbidden + "404": + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "405": + description: Method Not Allowed. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PUT' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/notification-senders/sms/{sms-sender-name}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -H 'Content-Type: application/json' \ + -d '{ + "provider": "NEXMO", + "providerURL": "https://rest.nexmo.com/sms/json", + "key": "123**45", + "secret": "5tg**ssd", + "sender": "+94 775563324", + "type": "json", + "properties": [ + { + "key": "body.scope", + "value": "internal" + }, + { + "key": "http.headers", + "value": "X-Version: 1, Authorization: bearer ,Accept: application/json ,Content-Type: application/json" + } + ] + }' + delete: + tags: + - SMS Senders + summary: Delete a SMS sender by name + description: | + This API provides the capability to delete a SMS sender by name. + The URL encoded SMS sender name is used as sender-name.
    + + Scope(Permission) required: `internal_org_notification_senders_delete` + operationId: deleteSMSSender + parameters: + - name: sender-name + in: path + description: name of the SMS sender + required: true + style: simple + explode: false + schema: + type: string + responses: + "204": + description: No Content + "400": + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Unauthorized + "403": + description: Forbidden + "404": + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "405": + description: Method Not Allowed. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'DELETE' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/notification-senders/sms/{sms-sender-name}' \ + -H 'accept: */*' \ + -H 'Authorization: Bearer {bearer_token}' + /notification-senders/push: + get: + tags: + - Push Senders + summary: Get a list of push notification senders + description: | + This API provides the capability to retrieve the list of push notification senders.
    + + Scope(Permission) required: `internal_org_notification_senders_view` + operationId: getPushSenders + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/PushProviderList' + "400": + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Unauthorized + "403": + description: Forbidden + "404": + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "405": + description: Method Not Allowed. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/notification-senders/push' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + post: + tags: + - Push Senders + summary: Create a push notification sender + description: | + This API provides the capability to create a push notification sender. + If the 'name' is not defined, 'PushPublisher' is taken as the default name.
    + + Scope(Permission) required: `internal_org_notification_senders_create` + operationId: createSMSSender + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PushSenderAdd' + example: + provider: FCM + properties: + - key: serviceAccountContent + value: "base64EncodedServiceAccountJsonString" + responses: + "201": + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/PushSender' + "400": + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Unauthorized + "403": + description: Forbidden + "404": + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "405": + description: Method Not Allowed. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "409": + description: Conflict + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/notification-senders/push' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -H 'Content-Type: application/json' \ + -d '{ + "provider": "FCM", + "properties": [ + { + "key": "serviceAccountContent", + "value": "base64EncodedServiceAccountJsonString" + } + ] + }' + /notification-senders/push/{sender-name}: + get: + tags: + - Push Senders + summary: Get a push sender by name + description: | + This API provides the capability to retrieve a push notification sender by name. + The URL encoded push sender name is used as sender-name.
    + + Scope(Permission) required: `internal_org_notification_senders_view` + operationId: getPushSender + parameters: + - name: sender-name + in: path + description: name of the push sender + required: true + style: simple + explode: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/PushSender' + "400": + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Unauthorized + "403": + description: Forbidden + "404": + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "405": + description: Method Not Allowed. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/notification-senders/push/{push-sender-name}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + put: + tags: + - Push Senders + summary: Update a push notification sender + description: | + This API provides the capability to update a push notification sender. + The URL encoded push notification sender name is used as sender-name.
    + + + Scope(Permission) required: `internal_org_notification_senders_update` + operationId: updatePushSender + parameters: + - name: sender-name + in: path + description: name of the push notification sender + required: true + style: simple + explode: false + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PushSenderUpdateRequest' + example: + provider: FCM + properties: + - key: serviceAccountContent + value: "base64EncodedServiceAccountJsonString" + required: true + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/PushSender' + "400": + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Unauthorized + "403": + description: Forbidden + "404": + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "405": + description: Method Not Allowed. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PUT' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/notification-senders/push/{push-sender-name}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -H 'Content-Type: application/json' \ + -d '{ + "provider": "FCM", + "properties": [ + { + "key": "serviceAccountContent", + "value": "base64EncodedServiceAccountJsonString" + } + ] + }' + delete: + tags: + - Push Senders + summary: Delete a push notification sender by name + description: | + This API provides the capability to delete a push notification sender by name. + The URL encoded push notification sender name is used as sender-name.
    + + Scope(Permission) required: `internal_org_notification_senders_delete` + operationId: deletePushSender + parameters: + - name: sender-name + in: path + description: name of the push notification sender + required: true + style: simple + explode: false + schema: + type: string + responses: + "204": + description: No Content + "400": + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Unauthorized + "403": + description: Forbidden + "404": + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "405": + description: Method Not Allowed. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'DELETE' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/notification-senders/push/{push-sender-name}' \ + -H 'accept: */*' \ + -H 'Authorization: Bearer {bearer_token}' +components: + schemas: + Error: + type: object + properties: + code: + type: string + example: NSM-00000 + message: + type: string + example: Some Error Message + description: + type: string + example: Some Error Description + traceId: + type: string + example: e0fbcfeb-3617-43c4-8dd0-7b7d38e13047 + EmailSenderAdd: + required: + - fromAddress + type: object + properties: + name: + type: string + smtpServerHost: + type: string + smtpPort: + type: integer + fromAddress: + type: string + example: iam@gmail.com + userName: + type: string + example: iam + password: + type: string + example: iam123 + properties: + type: array + example: + - key: body.scope + value: "true" + - key: mail.smtp.starttls.enable + value: true + items: + $ref: '#/components/schemas/Properties' + SMSSenderAdd: + required: + - providerURL + - provider + - contentType + type: object + properties: + name: + type: string + example: SMSPublisher + provider: + type: string + example: NEXMO + providerURL: + type: string + example: https://rest.nexmo.com/sms/json + key: + type: string + example: 123**45 + secret: + type: string + example: 5tg**ssd + sender: + type: string + example: +94 775563324 + contentType: + type: string + enum: + - JSON + - FORM + properties: + type: array + example: + - key: http.headers + value: "X-Version: 1, Authorization: bearer ,Accept: application/json ,Content-Type: application/json" + items: + $ref: '#/components/schemas/Properties' + PushSenderAdd: + required: + - provider + - properties + type: object + properties: + name: + type: string + example: PushPublisher + provider: + type: string + example: fcm + properties: + type: array + example: + - key: fcm.serviceAccount + value: jsonString + items: + $ref: '#/components/schemas/Properties' + EmailSender: + required: + - fromAddress + - name + type: object + properties: + name: + type: string + example: EmailPublisher + smtpServerHost: + type: string + example: smtp.gmail.com + smtpPort: + type: integer + example: 587 + fromAddress: + type: string + example: iam@gmail.com + userName: + type: string + example: iam + password: + type: string + example: iam123 + properties: + type: array + example: + - key: mail.smtp.starttls.enable + value: true + items: + $ref: '#/components/schemas/Properties' + SMSSender: + required: + - providerURL + - name + - provider + - contentType + type: object + properties: + name: + type: string + example: SMSPublisher + provider: + type: string + example: NEXMO + providerURL: + type: string + example: https://rest.nexmo.com/sms/json + key: + type: string + example: 123**45 + secret: + type: string + example: 5tg**ssd + sender: + type: string + example: +94 775563324 + contentType: + type: string + enum: + - JSON + - FORM + properties: + type: array + example: + - key: body.scope + value: "internal" + - key: http.headers + value: "X-Version: 1, Authorization: bearer ,Accept: application/json ,Content-Type: application/json" + items: + $ref: '#/components/schemas/Properties' + PushSender: + required: + - provider + - name + properties: + name: + type: string + example: PushPublisher + provider: + type: string + example: fcm + properties: + type: array + example: + - key: fcm.serviceAccount + value: "jsonString" + items: + $ref: '#/components/schemas/Properties' + EmailSenderUpdateRequest: + required: + - fromAddress + type: object + properties: + smtpServerHost: + type: string + example: smtp.gmail.com + smtpPort: + type: integer + example: 587 + fromAddress: + type: string + example: iam@gmail.com + userName: + type: string + example: iam + password: + type: string + example: iam123 + properties: + type: array + example: + - key: body.scope + value: "true" + - key: mail.smtp.starttls.enable + value: true + items: + $ref: '#/components/schemas/Properties' + SMSSenderUpdateRequest: + required: + - providerURL + - provider + - contentType + type: object + properties: + provider: + type: string + example: NEXMO + providerURL: + type: string + example: https://rest.nexmo.com/sms/json + key: + type: string + example: 123**45 + secret: + type: string + example: 5tg**ssd + sender: + type: string + example: +94 775563324 + contentType: + type: string + enum: + - JSON + - FORM + properties: + type: array + example: + - key: http.headers + value: "X-Version: 1, Authorization: bearer ,Accept: application/json ,Content-Type: application/json" + items: + $ref: '#/components/schemas/Properties' + PushSenderUpdateRequest: + required: + - provider + - properties + type: object + properties: + provider: + type: string + properties: + type: array + example: + - key: fcm.serviceAccount + value: "jsonString" + items: + $ref: '#/components/schemas/Properties' + Properties: + required: + - key + - value + type: object + properties: + key: + type: string + value: + type: string + example: + - key: email + value: iam@gmail.com + EmailProviderList: + type: array + items: + $ref: '#/components/schemas/EmailSender' + SMSProviderList: + type: array + items: + $ref: '#/components/schemas/SMSSender' + PushProviderList: + type: array + items: + $ref: '#/components/schemas/PushSender' + parameters: + typeQueryParam: + name: type + in: query + description: | + Type of authenticators. Can be either 'LOCAL' or 'REQUEST_PATH' + required: false + style: form + explode: true + schema: + type: string + securitySchemes: + OAuth2: + type: oauth2 + flows: + authorizationCode: + authorizationUrl: https://api.asgardeo.io/t/{root-organization-name}/oauth2/authorize + tokenUrl: https://api.asgardeo.io/t/{root-organization-name}/oauth2/token + scopes: {} diff --git a/docusaurus-asgardeo/static/apis/organization-apis/restapis/org-application-mgt.yaml b/docusaurus-asgardeo/static/apis/organization-apis/restapis/org-application-mgt.yaml new file mode 100644 index 0000000000..ba030ebb94 --- /dev/null +++ b/docusaurus-asgardeo/static/apis/organization-apis/restapis/org-application-mgt.yaml @@ -0,0 +1,2569 @@ +openapi: 3.0.0 +info: + description: > + This document explains the RESTful API for application management of organizations in Asgardeo. + version: "v1" + title: Asgardeo - Application Management Rest API +security: + - OAuth2: [] +paths: + /applications: + get: + tags: + - Applications + operationId: getAllApplications + summary: | + List applications. + description: | + This API provides the capability to retrieve the list of applications in the organization. + Response will contain both the shared applications and the applications registered directly + at the organization.
    + Scope(Permission) required: `internal_org_application_mgt_view` + parameters: + - $ref: '#/components/parameters/limitQueryParam' + - $ref: '#/components/parameters/offsetQueryParam' + - $ref: '#/components/parameters/filterQueryParam' + - $ref: '#/components/parameters/sortOrderQueryParam' + - $ref: '#/components/parameters/sortByQueryParam' + - $ref: '#/components/parameters/attributesQueryParam' + - $ref: '#/components/parameters/excludeSystemPortalsQueryParam' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/ApplicationListResponse' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '501': + description: Not Implemented + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/applications?limit=30&offset=0' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + post: + tags: + - Applications + summary: | + Add application. + operationId: createApplication + description: > + This API provides the capability to store the application information that is provided by users. + In the organization only the OAuth2 applications can be created with limited number of configurations + which will facilitate to access the APIs in the organization.
    + Scope(Permission) required: `internal_org_application_mgt_create` + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ApplicationModel' + description: This represents the application to be created. + required: true + responses: + '201': + description: Successful response. + headers: + Location: + description: This denotes the location of the newly-created application. + schema: + type: string + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '409': + description: Conflict + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '501': + description: Not Implemented + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/applications' \ + -H 'accept: */*' \ + -H 'Authorization: Bearer {bearer_token}' \ + -H 'Content-Type: application/json' \ + -d '{ + "name": "pickup", + "description": "This is the configuration for Pickup application.", + "imageUrl": "https://example.com/logo/my-logo.png", + "claimConfiguration": { + "dialect": "LOCAL", + "claimMappings": [ + { + "applicationClaim": "firstname", + "localClaim": { + "uri": "http://wso2.org/claims/username" + } + } + ], + "requestedClaims": [ + { + "claim": { + "uri": "http://wso2.org/claims/username" + }, + "mandatory": false + } + ], + "subject": { + "claim": { + "uri": "http://wso2.org/claims/username" + }, + "includeUserDomain": false, + "includeTenantDomain": false, + "useMappedLocalSubject": false + } + }, + "inboundProtocolConfiguration": { + "oidc": { + "clientId": "string", + "clientSecret": "string", + "grantTypes": [ + "client_credentials", + "password" + ], + "publicClient": false, + "accessToken": { + "type": "JWT", + "userAccessTokenExpiryInSeconds": 3600, + "applicationAccessTokenExpiryInSeconds": 3600, + "bindingType": "cookie", + "revokeTokensWhenIDPSessionTerminated": true, + "validateTokenBinding": true + }, + "refreshToken": { + "expiryInSeconds": 86400, + "renewRefreshToken": true + }, + "idToken": { + "expiryInSeconds": 3600, + "audience": [ + "http://idp.xyz.com", + "http://idp.abc.com" + ], + "encryption": { + "enabled": false, + "algorithm": "RSA-OAEP", + "method": "A128CBC+HS256" + } + }, + "scopeValidators": [ + "Role based scope validator", + "XACML Scope Validator" + ] + } + } + }' + /applications/{applicationId}: + get: + tags: + - Applications + summary: | + Retrieve application by ID. + operationId: getApplication + description: > + This API provides the capability to retrieve the application information by ID.
    + Scope(Permission) required: `internal_org_application_mgt_view` + parameters: + - name: applicationId + in: path + description: ID of the application. + required: true + schema: + type: string + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/ApplicationResponseModel' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + application/xml: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + application/xml: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + application/xml: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/applications/{application-id}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + patch: + tags: + - Applications + summary: | + Partially update application by ID. + operationId: patchApplication + description: | + This API provides the capability to partially update an application by ID.
    + Scope(Permission) required: `internal_org_application_mgt_update` + parameters: + - name: applicationId + in: path + description: ID of the application. + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ApplicationPatchModel' + description: This represents the application details to be updated. + required: true + responses: + '200': + description: Successfully Updated + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '409': + description: Conflict + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PATCH' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/applications/{application-id}' \ + -H 'accept: */*' \ + -H 'Authorization: Bearer {bearer_token}' \ + -H 'Content-Type: application/json' \ + -d '{ + "name": "pickup", + "description": "This is the configuration for Pickup application.", + "imageUrl": "https://example.com/logo/my-logo.png", + "claimConfiguration": { + "dialect": "LOCAL", + "claimMappings": [ + { + "applicationClaim": "firstname", + "localClaim": { + "uri": "http://wso2.org/claims/username" + } + } + ], + "requestedClaims": [ + { + "claim": { + "uri": "http://wso2.org/claims/username" + }, + "mandatory": false + } + ], + "subject": { + "claim": { + "uri": "http://wso2.org/claims/username" + }, + "includeUserDomain": false, + "includeTenantDomain": false, + "useMappedLocalSubject": false + }, + "role": { + "mappings": [ + { + "localRole": "admin", + "applicationRole": "Administrator" + } + ], + "includeUserDomain": true, + "claim": { + "uri": "http://wso2.org/claims/username" + } + } + } + }' + delete: + tags: + - Applications + summary: | + Delete application by ID. + operationId: deleteApplication + description: | + This API provides the capability to delete an application by ID. + This operation will only be allowed for the applications which are registered + directly in the organization.
    + Scope(Permission) required: `internal_org_application_mgt_delete` + parameters: + - name: applicationId + in: path + description: ID of the application. + required: true + schema: + type: string + responses: + '204': + description: Successfully Deleted + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'DELETE' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/applications/{application-id}' \ + -H 'accept: */*' \ + -H 'Authorization: Bearer {bearer_token}' + /applications/{applicationId}/authorized-apis: + get: + tags: + - Authorized APIs + summary: | + Get authorized APIs of the application. + operationId: getAuthorizedAPIs + description: | + This API provides the capability to retrieve all the authorized APIs of the application.
    + Scope(Permission) required: `internal_org_application_mgt_view` + parameters: + - name: applicationId + in: path + description: ID of the application. + required: true + schema: + type: string + responses: + '200': + description: OK + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/AuthorizedAPIResponse' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/applications/{application-id}/authorized-apis' \ + -H 'Authorization: Bearer {bearer_token}' + post: + tags: + - Authorized APIs + summary: | + Authorized an API to the application. + operationId: addAuthorizedAPI + description: | + This API provides the capability to authorized an API to the application. + + Scope(Permission) required: + - `internal_org_application_mgt_update` + + ➕ Additional Scopes + + To authorize organization APIs and business APIs, you also need the following additional scopes: + + | Action | Scope | + |---------|--------| + | Authorize organization API | `internal_org_application_internal_api_update` | + | Authorize business APIs | `internal_org_application_business_api_update` | + parameters: + - name: applicationId + in: path + description: ID of the application. + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/AuthorizedAPICreationModel' + responses: + '201': + description: Created + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/applications/{application-id}/authorized-apis' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "id": "65b52595-9ca1-4539-aca2-56178643c58b", + "policyIdentifier": "RBAC", + "scopes": [ + "bookings:read" + ] + }' + x-codegen-request-body-name: body + /applications/{applicationId}/authorized-apis/{apiId}: + patch: + tags: + - Authorized APIs + summary: | + Update authorized API scopes. + operationId: patchAuthorizedAPI + description: | + This API provides the capability to update an authorized API of the application.
    + + Scope(Permission) required: + - `internal_org_application_mgt_update` + + ➕ Additional Scopes + + To update authorized organization APIs and business APIs, you also need the following additional scopes: + + | Action | Scope | + |---------|--------| + | Update authorized organization API | `internal_org_application_internal_api_update` | + | Update authorized business APIs | `internal_org_application_business_api_update` | + parameters: + - name: applicationId + in: path + description: ID of the application. + required: true + schema: + type: string + - name: apiId + in: path + description: ID of the API resource. + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/AuthorizedAPIPatchModel' + responses: + '200': + description: OK + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location --request PATCH 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/applications/{application-id}/authorized-apis/{api-id}' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "addedScopes": [ + "bookings:write" + ], + "removedScopes": [ + "bookings:read" + ] + }' + x-codegen-request-body-name: body + delete: + tags: + - Authorized APIs + summary: | + Remove API authorization from the application. + operationId: deleteAuthorizedAPI + description: | + This API provides the capability to delete an authorized API of the application.
    + + Scope(Permission) required: + - `internal_org_application_mgt_update` + + ➕ Additional Scopes + + To remove authorized organization APIs and business APIs, you also need the following additional scopes: + + | Action | Scope | + |---------|--------| + | Remove authorized organization API | `internal_org_application_internal_api_update` | + | Remove authorized business APIs | `internal_org_application_business_api_update` | + parameters: + - name: applicationId + in: path + description: ID of the application. + required: true + schema: + type: string + - name: apiId + in: path + description: ID of the API resource. + required: true + schema: + type: string + responses: + '204': + description: No Content + '401': + description: Unauthorized + '403': + description: Forbidden + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location --request DELETE 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/applications/{application-id}/authorized-apis/{api-id}' \ + -H 'Authorization: Bearer {bearer_token}' + /applications/{applicationId}/inbound-protocols/: + get: + tags: + - Inbound Protocols + summary: | + Retrieve inbound protocol configurations. + operationId: getInboundAuthenticationConfigurations + description: > + This API provides the capability to retrieve authentication protocol configurations of an application.
    + Scope(Permission) required: `internal_org_application_mgt_view` + parameters: + - name: applicationId + in: path + description: ID of the application. + required: true + schema: + type: string + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/InboundProtocolsListResponse' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/applications/{application-id}/inbound-protocols/' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + /applications/{applicationId}/inbound-protocols/oidc: + get: + tags: + - Inbound Protocols - OAuth / OIDC + summary: | + Retrieve OIDC authentication protocol parameters. + description: | + This API provides the capability to retrieve OIDC authentication protocol parameters of an application.
    + + Scope(Permission) required: + - `internal_org_application_mgt_view` + + ➕ Additional Scopes + + To view the client secret, you also need the following additional scope: + + | Action | Scope | + |---------|--------| + | View client secret | `internal_org_application_mgt_client_secret_view` | + operationId: getInboundOAuthConfiguration + parameters: + - name: applicationId + in: path + description: ID of the application + required: true + schema: + type: string + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/OpenIDConnectConfiguration' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/applications/{application-id}/inbound-protocols/oidc' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + put: + tags: + - Inbound Protocols - OAuth / OIDC + summary: | + Update OIDC authentication protocol parameters. + description: > + This API provides the capability to store OIDC authentication protocol parameters of an application.
    + Scope(Permission) required: `internal_org_application_mgt_update` + operationId: updateInboundOAuthConfiguration + parameters: + - name: applicationId + in: path + description: ID of the application. + required: true + schema: + type: string + responses: + '200': + description: Successful + '201': + description: Created + headers: + Location: + description: This is the location of the newly created OIDC Authentication Configuration. + schema: + type: string + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '409': + description: Conflict + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PUT' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/applications/{application-id}/inbound-protocols/oidc' \ + -H 'accept: */*' \ + -H 'Authorization: Bearer {bearer_token}' \ + -H 'Content-Type: application/json' \ + -d '{ + "clientId": "string", + "clientSecret": "string", + "grantTypes": [ + "client_credentials", + "password" + ], + "publicClient": false, + "accessToken": { + "type": "JWT", + "userAccessTokenExpiryInSeconds": 3600, + "applicationAccessTokenExpiryInSeconds": 3600, + "bindingType": "cookie", + "revokeTokensWhenIDPSessionTerminated": true, + "validateTokenBinding": true + }, + "refreshToken": { + "expiryInSeconds": 86400, + "renewRefreshToken": true + }, + "idToken": { + "expiryInSeconds": 3600, + "audience": [ + "http://idp.xyz.com", + "http://idp.abc.com" + ], + "encryption": { + "enabled": false, + "algorithm": "RSA-OAEP", + "method": "A128CBC+HS256" + } + }, + "scopeValidators": [ + "Role based scope validator", + "XACML Scope Validator" + ] + }' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OpenIDConnectConfiguration' + description: >- + This represents the OIDC authentication protocol parameters of an + application. + required: true + delete: + tags: + - Inbound Protocols - OAuth / OIDC + summary: | + Delete OIDC authentication protocol parameters. + description: > + This API provides the capability to delete OIDC authentication protocol parameters of an application.
    + Scope(Permission) required: `internal_org_application_mgt_delete` + operationId: deleteInboundOAuthConfiguration + parameters: + - name: applicationId + in: path + description: ID of the application. + required: true + schema: + type: string + responses: + '204': + description: Delete Success + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'DELETE' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/applications/{application-id}/inbound-protocols/oidc' \ + -H 'accept: */*' \ + -H 'Authorization: Bearer {bearer_token}' + /applications/{applicationId}/inbound-protocols/oidc/regenerate-secret: + post: + tags: + - Inbound Protocols - OAuth / OIDC + summary: | + Regenerate the OAuth2/OIDC client secret. + description: | + This API regenerates the OAuth2/OIDC client secret.
    + + Scope(Permission) required: `internal_org_application_mgt_client_secret_create` + operationId: regenerateOAuthClientSecret + parameters: + - name: applicationId + in: path + description: ID of the application + required: true + schema: + type: string + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/OpenIDConnectConfiguration' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/applications/{application-id}/inbound-protocols/oidc/regenerate-secret' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '' + /applications/meta/inbound-protocols: + get: + tags: + - Application Metadata + summary: | + Retrieve the list of inbound authentication protocols available. + description: > + This API provides the capability to retrieve the list of inbound authentication protocols available.
    + Scope(Permission) required: `internal_org_application_mgt_view` + operationId: getInboundProtocols + responses: + '200': + description: OK + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/AuthProtocolMetadata' + example: + - name: "saml" + displayName: "SAML2 Web SSO Configuration" + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/applications/meta/inbound-protocols?customOnly=true' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' +components: + parameters: + limitQueryParam: + in: query + name: limit + required: false + description: | + Maximum number of records to return. + schema: + type: integer + minimum: 1 + default: 30 + limitWithoutDefaultQueryParam: + in: query + name: limit + required: false + description: | + Maximum number of records to return. + schema: + type: integer + offsetQueryParam: + in: query + name: offset + required: false + description: | + Number of records to skip for pagination. + schema: + type: integer + default: 0 + offsetWithoutDefaultQueryParam: + in: query + name: offset + required: false + description: | + Number of records to skip for pagination. + schema: + type: integer + filterQueryParam: + in: query + name: filter + required: false + description: | + Condition to filter the retrieval of records. + Supports 'sw', 'co', 'ew', and 'eq' operations with 'and', 'or' logical operators. + Note that 'and' and 'or' operators in filters follow the general precedence of logical operators. + For example, A and B or C and D = (A and B) or (C and D)). + Currently supports only filtering based on the 'name', the 'clientId', and the 'issuer' attributes. + /applications?filter=name+eq+user_portal +
    + /applications?filter=name+co+prod+or+clientId+co+123 + schema: + type: string + sortOrderQueryParam: + in: query + name: sortOrder + required: false + description: | + Define the order in which the retrieved records should be sorted. + _This parameter is not supported yet._ + schema: + type: string + enum: + - ASC + - DESC + sortByQueryParam: + in: query + name: sortBy + required: false + description: | + Attribute by which the retrieved records should be sorted. + _This parameter is not supported yet._ + schema: + type: string + attributesQueryParam: + in: query + name: attributes + required: false + description: | + Specifies the required parameters in the response. + Only 'advancedConfigurations', 'templateId', 'templateVersion', 'clientId', 'issuer', + and 'associatedRoles.allowedAudience' attributes are currently supported. + /applications?attributes=advancedConfigurations,templateId,templateVersion,clientId,issuer, + associatedRoles.allowedAudience + schema: + type: string + excludeSystemPortalsQueryParam: + in: query + name: excludeSystemPortals + required: false + description: | + Specifies whether to include or exclude system portals in the response. + Default will be treated as false if parameter is not preset in the request. + /applications?excludeSystemPortals=true + schema: + type: boolean + exportSecretsQueryParam: + in: query + name: exportSecrets + required: false + description: | + Specifies whether to export secrets when exporting an application. + schema: + type: boolean + default: false + fileTypeHeaderParam: + in: header + name: Accept + required: false + description: | + Content type of the file. + schema: + type: string + default: application/xml + enum: + - application/json + - application/xml + - application/yaml + - application/x-yaml + - text/yaml + inboundProtocolsCustomOnly: + in: query + name: customOnly + required: false + description: | + Send only the custom inbound protocols. + schema: + type: boolean + example: true + default: false + templateIdPathParam: + in: path + name: template-id + required: true + description: | + Application template ID. This should be a valid locale. + schema: + type: string + securitySchemes: + OAuth2: + type: oauth2 + flows: + authorizationCode: + authorizationUrl: 'https://api.asgardeo.io/t/{root-organization-name}/oauth2/authorize' + tokenUrl: 'http://api.asgardeo.io/t/{root-organization-name}/oauth2/token' + scopes: {} + schemas: + Link: + type: object + properties: + href: + type: string + example: "applications?offset=10&limit=10" + rel: + type: string + example: "next" + ApplicationListResponse: + type: object + properties: + totalResults: + type: integer + description: "Number of results that match the listing operation." + example: 1 + startIndex: + type: integer + description: "Index of the first element of the page, which will be equal to offset + 1." + example: 1 + count: + type: integer + description: "Number of elements in the returned page." + example: 10 + applications: + type: array + items: + $ref: '#/components/schemas/ApplicationListItem' + links: + type: array + items: + $ref: '#/components/schemas/Link' + ApplicationListItem: + type: object + properties: + id: + type: string + example: "85e3f4b8-0d22-4181-b1e3-1651f71b88bd" + name: + type: string + example: "user-portal" + description: + type: string + example: Application representing user portal + applicationVersion: + type: string + example: "v1.0.0" + image: + type: string + example: 'https://example.com/logo/my-logo.png' + clientId: + type: string + example: 'SmrrDNXRYf1lMmDlnleeHTuXx_Ea' + realm: + type: string + example: 'PassiveSTSSampleApp' + access: + type: string + enum: + - READ + - WRITE + default: READ + self: + type: string + example: "t/{root-organization-name}/o/api/server/v1/applications/85e3f4b8-0d22-4181-b1e3-1651f71b88bd" + advancedConfigurations: + $ref: '#/components/schemas/AdvancedApplicationConfiguration' + associatedRoles: + type: object + $ref: '#/components/schemas/AssociatedRolesConfig' + applicationEnabled: + type: boolean + example: true + ApplicationModel: + type: object + required: + - name + properties: + id: + type: string + example: "394b8adcce24c64a8a09a0d80abf8c337bd253de" + readOnly: true + name: + type: string + example: pickup + description: + type: string + example: This is the configuration for Pickup application. + imageUrl: + type: string + example: 'https://example.com/logo/my-logo.png' + applicationEnabled: + default: true + type: boolean + example: true + description: Decides whether the application is enabled. + associatedRoles: + $ref: '#/components/schemas/AssociatedRolesConfig' + inboundProtocolConfiguration: + $ref: '#/components/schemas/InboundProtocols' + ApplicationResponseModel: + type: object + required: + - name + properties: + id: + type: string + example: "394b8adcce24c64a8a09a0d80abf8c337bd253de" + readOnly: true + name: + type: string + example: pickup + description: + type: string + example: This is the configuration for Pickup application. + applicationVersion: + type: string + example: "v1.0.0" + imageUrl: + type: string + example: 'https://example.com/logo/my-logo.png' + clientId: + type: string + example: 'SmrrDNXRYf1lMmDlnleeHTuXx_Ea' + isManagementApp: + type: boolean + example: false + description: Decides whether the application used to access System APIs + isB2BSelfServiceApp: + type: boolean + example: false + description: Decides whether the application used to for B2B self service + applicationEnabled: + type: boolean + example: true + description: Decides whether the application is enabled. + associatedRoles: + $ref: '#/components/schemas/AssociatedRolesConfig' + claimConfiguration: + $ref: '#/components/schemas/ClaimConfiguration' + inboundProtocols: + $ref: '#/components/schemas/InboundProtocolsListResponse' + advancedConfigurations: + $ref: '#/components/schemas/AdvancedApplicationConfiguration' + access: + type: string + enum: + - READ + - WRITE + default: READ + ApplicationPatchModel: + type: object + properties: + name: + type: string + example: pickup + description: + type: string + example: This is the configuration for Pickup application. + applicationVersion: + type: string + example: "v1.0.0" + imageUrl: + type: string + example: 'https://example.com/logo/my-logo.png' + accessUrl: + type: string + example: 'https://example.com/login' + logoutReturnUrl: + type: string + example: 'https://example.com/app/logout' + templateId: + type: string + example: "adwefi2429asdfdf94444rraf44" + templateVersion: + type: string + example: "v1.0.1" + description: Version of the template used to create the application. + applicationEnabled: + type: boolean + example: true + description: Decides whether the application is enabled. + associatedRoles: + $ref: '#/components/schemas/AssociatedRolesConfig' + claimConfiguration: + $ref: '#/components/schemas/ClaimConfiguration' + authenticationSequence: + $ref: '#/components/schemas/AuthenticationSequence' + advancedConfigurations: + $ref: '#/components/schemas/AdvancedApplicationConfiguration' + provisioningConfigurations: + $ref: '#/components/schemas/ProvisioningConfiguration' + ResidentApplication: + type: object + properties: + provisioningConfigurations: + $ref: '#/components/schemas/ProvisioningConfiguration' + ProvisioningConfiguration: + type: object + properties: + inboundProvisioning: + $ref: '#/components/schemas/InboundSCIMProvisioningConfiguration' + outboundProvisioningIdps: + type: array + items: + $ref: '#/components/schemas/OutboundProvisioningConfiguration' + InboundSCIMProvisioningConfiguration: + type: object + properties: + proxyMode: + type: boolean + example: false + provisioningUserstoreDomain: + type: string + example: PRIMARY + description: >- + This property becomes only applicable if the proxy-mode config is + set to false + OutboundProvisioningConfiguration: + type: object + properties: + idp: + type: string + example: Google + connector: + type: string + example: googleapps + blocking: + type: boolean + example: false + rules: + type: boolean + example: false + jit: + type: boolean + example: false + ConfiguredAuthenticatorsModal: + type: object + properties: + stepId: + type: integer + example: 1 + localAuthenticators: + type: array + items: + $ref: '#/components/schemas/ConfiguredAuthenticator' + federatedAuthenticators: + type: array + items: + $ref: '#/components/schemas/ConfiguredAuthenticator' + ConfiguredAuthenticator: + type: object + properties: + name: + type: string + example: sampleIdP + type: + type: string + example: SampleAuthenticator + AdvancedApplicationConfiguration: + type: object + properties: + saas: + type: boolean + example: false + description: Decides whether the application is accessible across tenants. + discoverableByEndUsers: + type: boolean + example: false + description: Decides whether the application is visible for end users. + certificate: + $ref: '#/components/schemas/Certificate' + skipLoginConsent: + type: boolean + example: false + description: Decides whether user consent needs to be skipped during login flows. + skipLogoutConsent: + type: boolean + example: false + description: Decides whether user consent needs to be skipped during logout flows. + useExternalConsentPage: + type: boolean + example: false + description: Decides whether users should be presented with an external consent page. + returnAuthenticatedIdpList: + type: boolean + example: false + description: Decides whether the list of authenticated identity providers need to be returned in the authentication response. + enableAuthorization: + type: boolean + description: Decides whether authorization policies needs to be engaged during authentication flows. + example: true + fragment: + type: boolean + description: Decides whether application is a fragment application. + example: false + enableAPIBasedAuthentication: + type: boolean + description: Decides whether API Based Authentication is enabled for this application. + example: false + attestationMetaData: + type: object + description: Decides the client attestation meta data for the application. + properties: + enableClientAttestation: + type: boolean + description: Decides whether client attestation enabled for this application. + example: false + androidPackageName: + type: string + description: Decides the android package name of the application. + example: "com.wso2.mobile.sample" + androidAttestationServiceCredentials: + type: object + description: Decides the credentials for the service account to access Google Play Integrity Service. + appleAppId: + type: string + description: Decides the apple app id which denotes {apple-teamId}.{bundleId}. + example: "APPLETEAMID.com.wso2.mobile.sample" + trustedAppConfiguration: + $ref: '#/components/schemas/TrustedAppConfiguration' + additionalSpProperties: + $ref: '#/components/schemas/AdditionalProperties' + AdditionalProperties: + type: array + description: Denotes additional properties of the application. It is only supported by getApplication and getAllApplications request. + items: + $ref: "#/components/schemas/AdditionalSpProperty" + AdditionalSpProperty: + type: object + required: + - name + - value + properties: + name: + type: string + example: "isInternalApp" + value: + type: string + example: "true" + displayName: + type: string + example: "Internal Application" + TrustedAppConfiguration: + type: object + description: Decides the trusted app configurations for the application. + properties: + isFIDOTrustedApp: + type: boolean + description: Decides whether the application is a FIDO trusted app. + example: false + isConsentGranted: + type: boolean + description: Decides whether consent is granted for the trusted app. + example: false + androidPackageName: + type: string + description: Decides the android package name for the application. + example: "com.wso2.mobile.sample" + androidThumbprints: + type: array + items: + type: string + example: + - "18:94:0A:DE:63:77:B6:84:43:1E:85:8F:03:CF:8A:14:87:9C:DE:DF:EA:7A:25:53:CD:53:5A:AF:C3:54:A5:56" + description: Decides the android thumbprints for the application. + appleAppId: + type: string + description: Decides the apple app id for the application. + example: "APPLETEAMID.com.org.mobile.sample" + Certificate: + type: object + properties: + type: + type: string + description: >- + Certificate type. This should be either JWKS or PEM. + value: + type: string + description: >- + Certificate value. If type is JWKS, value should be jwks URL. If + type is PEM, value should be the certificate in PEM format. + InboundProtocols: + type: object + properties: + oidc: + $ref: '#/components/schemas/OpenIDConnectConfiguration' + InboundProtocolsListResponse: + type: array + items: + $ref: '#/components/schemas/InboundProtocolListItem' + InboundProtocolListItem: + type: object + required: + - type + - name + - self + properties: + type: + type: string + example: "samlsso" + name: + type: string + example: "SAML2 Inbound" + self: + type: string + example: "/api/server/v1/applications/29048810-1447-4ea0-a348-30d15ab65fa3/inbound-protocols/saml" + ClaimConfiguration: + type: object + properties: + dialect: + type: string + enum: + - CUSTOM + - LOCAL + default: LOCAL + claimMappings: + type: array + items: + $ref: '#/components/schemas/ClaimMappings' + requestedClaims: + type: array + items: + $ref: '#/components/schemas/RequestedClaimConfiguration' + subject: + $ref: '#/components/schemas/SubjectConfig' + role: + $ref: '#/components/schemas/RoleConfig' + SubjectConfig: + type: object + properties: + claim: + $ref: '#/components/schemas/Claim' + includeUserDomain: + type: boolean + example: false + includeTenantDomain: + type: boolean + example: false + useMappedLocalSubject: + type: boolean + example: false + mappedLocalSubjectMandatory: + type: boolean + example: false + RoleConfig: + type: object + properties: + mappings: + type: array + items: + $ref: '#/components/schemas/RoleMapping' + includeUserDomain: + type: boolean + example: true + claim: + $ref: '#/components/schemas/Claim' + RoleMapping: + type: object + required: + - localRole + - applicationRole + properties: + localRole: + type: string + example: admin + applicationRole: + type: string + example: Administrator + AssociatedRolesConfig: + type: object + required: + - allowedAudience + properties: + allowedAudience: + type: string + example: "ORGANIZATION" + enum: + - ORGANIZATION + - APPLICATION + default: ORGANIZATION + roles: + type: array + items: + $ref: '#/components/schemas/Role' + Role: + type: object + required: + - id + properties: + id: + type: string + example: "bf5abd05-3667-4a2a-a6c2-2fb9f4d26e47" + name: + type: string + example: "RoleA" + RequestedClaimConfiguration: + type: object + required: + - claim + description: >- + User claims that need to be sent back to the application. If the + claim mappings are local, use local claim URIs. If the custom claim + mappings are configured, use the mapped application claim URI + properties: + claim: + $ref: '#/components/schemas/Claim' + mandatory: + type: boolean + example: false + ClaimMappings: + type: object + required: + - applicationClaim + - localClaim + properties: + applicationClaim: + type: string + description: "Claim URI received by the application" + example: firstname + localClaim: + $ref: '#/components/schemas/Claim' + Claim: + type: object + required: + - uri + properties: + id: + type: string + example: aHR0cDovL3dzbzIub3JnL2NsYWltcy91c2VybmFtZQ + readOnly: true + uri: + type: string + example: 'http://wso2.org/claims/username' + displayName: + type: string + example: Username + readOnly: true + SAML2Configuration: + type: object + properties: + metadataFile: + type: string + example: 'Base64 encoded metadata file content' + metadataURL: + type: string + example: 'https://example.com/samlsso/meta' + manualConfiguration: + $ref: '#/components/schemas/SAML2ServiceProvider' + SingleSignOnProfile: + type: object + properties: + bindings: + type: array + items: + type: string + enum: + - HTTP_POST + - HTTP_REDIRECT + - ARTIFACT + enableSignatureValidationForArtifactBinding: + type: boolean + description: Enables Signature validation for SAML Artifact Binding. Applicable only if SAML Artifact binding is enabled through the bindings option. + default: false + attributeConsumingServiceIndex: + type: string + readOnly: true + enableIdpInitiatedSingleSignOn: + type: boolean + default: false + assertion: + $ref: '#/components/schemas/SAMLAssertionConfiguration' + SAMLAttributeProfile: + type: object + properties: + enabled: + type: boolean + default: false + alwaysIncludeAttributesInResponse: + type: boolean + default: false + SingleLogoutProfile: + type: object + properties: + enabled: + type: boolean + default: true + logoutRequestUrl: + type: string + description: Single logout request accepting endpoint + logoutResponseUrl: + type: string + description: Single logout response accepting endpoint + logoutMethod: + type: string + enum: + - BACKCHANNEL + - FRONTCHANNEL_HTTP_REDIRECT + - FRONTCHANNEL_HTTP_POST + idpInitiatedSingleLogout: + $ref: '#/components/schemas/IdpInitiatedSingleLogout' + IdpInitiatedSingleLogout: + type: object + properties: + enabled: + type: boolean + default: false + returnToUrls: + type: array + items: + type: string + SAMLAssertionConfiguration: + type: object + properties: + nameIdFormat: + type: string + default: 'urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified' + example: 'urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress' + audiences: + type: array + description: Additional audience values to be added to the SAML Assertions + example: + - 'https://app.example.com/saml' + items: + type: string + recipients: + type: array + description: Additional recipient values to be added to the SAML Assertions + example: + - 'https://app.example.com/saml' + items: + type: string + digestAlgorithm: + type: string + default: "http://www.w3.org/2000/09/xmldsig#sha1" + example: "http://www.w3.org/2000/09/xmldsig#sha1" + encryption: + $ref: '#/components/schemas/AssertionEncryptionConfiguration' + AssertionEncryptionConfiguration: + type: object + properties: + enabled: + type: boolean + default: false + assertionEncryptionAlgorithm: + type: string + default: "http://www.w3.org/2001/04/xmlenc#aes256-cbc" + keyEncryptionAlgorithm: + type: string + default: "http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p" + SAMLRequestValidation: + type: object + properties: + enableSignatureValidation: + type: boolean + default: true + signatureValidationCertAlias: + type: string + SAMLResponseSigning: + type: object + properties: + enabled: + type: boolean + default: true + signingAlgorithm: + type: string + SAML2ServiceProvider: + type: object + required: + - issuer + - assertionConsumerUrls + properties: + issuer: + type: string + serviceProviderQualifier: + type: string + assertionConsumerUrls: + type: array + items: + type: string + minItems: 1 + defaultAssertionConsumerUrl: + type: string + description: "If not provided, the first assertion consumer URL on the assertionConsumerUrls will be picked as the default assertion consumer URL." + idpEntityIdAlias: + type: string + description: "Default value is the IdP Entity ID value specified in Resident IdP." + singleSignOnProfile: + $ref: '#/components/schemas/SingleSignOnProfile' + attributeProfile: + $ref: '#/components/schemas/SAMLAttributeProfile' + singleLogoutProfile: + $ref: '#/components/schemas/SingleLogoutProfile' + requestValidation: + $ref: '#/components/schemas/SAMLRequestValidation' + responseSigning: + $ref: '#/components/schemas/SAMLResponseSigning' + enableAssertionQueryProfile: + type: boolean + default: false + OpenIDConnectConfiguration: + type: object + required: + - grantTypes + properties: + clientId: + type: string + clientSecret: + type: string + state: + type: string + enum: + - ACTIVE + - REVOKED + readOnly: true + default: ACTIVE + grantTypes: + type: array + example: + - client_credentials + - password + items: + type: string + minItems: 1 + publicClient: + type: boolean + default: false + description: >- + Enabling this option will allow the client to authenticate without a + client secret. + example: false + accessToken: + $ref: '#/components/schemas/AccessTokenConfiguration' + refreshToken: + $ref: '#/components/schemas/RefreshTokenConfiguration' + idToken: + $ref: '#/components/schemas/IdTokenConfiguration' + scopeValidators: + type: array + example: + - Role based scope validator + - XACML Scope Validator + items: + type: string + clientAuthentication: + $ref: '#/components/schemas/ClientAuthenticationConfiguration' + subject: + $ref: '#/components/schemas/SubjectConfiguration' + isFAPIApplication: + type: boolean + default: false + description: Enabling this option will make the application FAPI conformant. + example: false + OAuth2PKCEConfiguration: + type: object + properties: + mandatory: + type: boolean + example: false + supportPlainTransformAlgorithm: + type: boolean + example: true + HybridFlowConfiguration: + type: object + properties: + enable: + type: boolean + example: true + responseType: + type: string + example: code id_token + AccessTokenConfiguration: + type: object + properties: + type: + type: string + example: JWT + userAccessTokenExpiryInSeconds: + type: integer + format: int64 + example: 3600 + applicationAccessTokenExpiryInSeconds: + type: integer + format: int64 + example: 3600 + bindingType: + type: string + description: "OAuth2 access token and refresh token can be bound to an external attribute during the token generation so that it can be optionally validated during the API invocation." + default: "None" + example: cookie + revokeTokensWhenIDPSessionTerminated: + type: boolean + description: "If enabled, when the IDP session is terminated, all the access tokens bound to the session will get revoked." + validateTokenBinding: + type: boolean + description: "If enabled, both access token and the token binding needs to be present for a successful API invocation." + accessTokenAttributes: + type: array + items: + type: string + enableJwtScopeAsArray: + type: boolean + description: "If enabled, the scope claim in JWT access tokens will be formatted as a JSON array instead of a space-separated string." + example: false + RefreshTokenConfiguration: + type: object + properties: + expiryInSeconds: + type: integer + format: int64 + example: 86400 + renewRefreshToken: + description: Decides whether the refresh token needs to be renewed during refresh grant flow. + type: boolean + example: true + SubjectTokenConfiguration: + type: object + properties: + enable: + type: boolean + description: "If enabled, subject token can be issued for token exchange grant type." + applicationSubjectTokenExpiryInSeconds: + type: integer + example: 3600 + IdTokenConfiguration: + type: object + properties: + expiryInSeconds: + type: integer + format: int64 + example: 3600 + audience: + type: array + example: + - 'http://idp.xyz.com' + - 'http://idp.abc.com' + items: + type: string + idTokenSignedResponseAlg: + type: string + example: 'PS256' + encryption: + $ref: '#/components/schemas/IdTokenEncryptionConfiguration' + IdTokenEncryptionConfiguration: + type: object + properties: + enabled: + type: boolean + default: false + example: false + algorithm: + type: string + example: RSA-OAEP + method: + type: string + example: A128CBC+HS256 + ClientAuthenticationConfiguration: + type: object + properties: + tokenEndpointAuthMethod: + type: string + example: 'client_secret_basic' + tokenEndpointAllowReusePvtKeyJwt: + type: boolean + example: false + tokenEndpointAuthSigningAlg: + type: string + example: 'PS256' + tlsClientAuthSubjectDn: + type: string + example: 'CN=John Doe,OU=OrgUnit,O=Organization,L=Colombo,ST=Western,C=LK' + RequestObjectConfiguration: + type: object + properties: + requestObjectSigningAlg: + type: string + example: 'PS256' + encryption: + $ref: '#/components/schemas/RequestObjectEncryptionConfiguration' + RequestObjectEncryptionConfiguration: + type: object + properties: + algorithm: + type: string + example: RSA-OAEP + method: + type: string + example: A128CBC+HS256 + PushAuthorizationRequestConfiguration: + type: object + properties: + requirePushAuthorizationRequest: + type: boolean + example: false + SubjectConfiguration: + type: object + properties: + subjectType: + type: string + example: 'public' + sectorIdentifierUri: + type: string + example: 'https://app.example.com' + OIDCLogoutConfiguration: + type: object + properties: + backChannelLogoutUrl: + type: string + example: 'https://app.example.com/backchannel/callback' + frontChannelLogoutUrl: + type: string + example: 'https://app.example.com/frontchannel/callback' + AuthenticationSequence: + type: object + properties: + type: + type: string + description: " +
      +
    • DEFAULT type indicates that the application will use the default authentication sequence specified at the organization level. When the DEFAULT type is used, the information given in the other fields of the `AuthenticationSequence` will be ignored and overriden with values defined at the organization level.
    • +
    • USER_DEFINED type indicates that the application will use a user-defined authentication sequence.
    • +
    " + enum: + - DEFAULT + - USER_DEFINED + default: DEFAULT + steps: + type: array + items: + $ref: '#/components/schemas/AuthenticationStepModel' + requestPathAuthenticators: + type: array + items: + type: string + script: + type: string + subjectStepId: + type: integer + default: 1 + example: 1 + attributeStepId: + type: integer + default: 1 + example: 1 + AuthenticationStepModel: + type: object + required: + - id + - options + properties: + id: + type: integer + minimum: 1 + example: 1 + options: + type: array + items: + $ref: '#/components/schemas/Authenticator' + minItems: 1 + Authenticator: + type: object + required: + - idp + - authenticator + properties: + idp: + type: string + example: LOCAL + authenticator: + type: string + example: basic + AuthProtocolMetadata: + type: object + properties: + name: + type: string + displayName: + type: string + MetadataProperty: + type: object + properties: + options: + type: array + items: + type: string + example: + - 'Option 1' + - 'Option 2' + defaultValue: + type: string + example: 'Option 1' + ClientAuthenticationMethodMetadata: + type: object + properties: + options: + type: array + items: + $ref: '#/components/schemas/ClientAuthenticationMethod' + FapiMetadata: + type: object + properties: + allowedSignatureAlgorithms: + $ref: '#/components/schemas/MetadataProperty' + allowedEncryptionAlgorithms: + $ref: '#/components/schemas/MetadataProperty' + tokenEndpointAuthMethod: + $ref: '#/components/schemas/ClientAuthenticationMethodMetadata' + ClientAuthenticationMethod: + type: object + properties: + name: + type: string + example: private_key_jwt + displayName: + type: string + example: Private Key JWT + GrantTypeMetaData: + type: object + properties: + options: + type: array + items: + $ref: '#/components/schemas/GrantType' + GrantType: + type: object + properties: + name: + type: string + example: authorization_code + displayName: + type: string + example: Code + SAMLMetaData: + type: object + properties: + defaultNameIdFormat: + type: string + example: 'urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress' + certificateAlias: + $ref: '#/components/schemas/MetadataProperty' + responseSigningAlgorithm: + $ref: '#/components/schemas/MetadataProperty' + responseDigestAlgorithm: + $ref: '#/components/schemas/MetadataProperty' + assertionEncryptionAlgorithm: + $ref: '#/components/schemas/MetadataProperty' + keyEncryptionAlgorithm: + $ref: '#/components/schemas/MetadataProperty' + OIDCMetaData: + type: object + properties: + allowedGrantTypes: + $ref: '#/components/schemas/GrantTypeMetaData' + defaultUserAccessTokenExpiryTime: + type: string + example: '3600' + defaultApplicationAccessTokenExpiryTime: + type: string + example: '3600' + defaultRefreshTokenExpiryTime: + type: string + example: '86400' + defaultIdTokenExpiryTime: + type: string + example: '3600' + idTokenEncryptionAlgorithm: + $ref: '#/components/schemas/MetadataProperty' + idTokenEncryptionMethod: + $ref: '#/components/schemas/MetadataProperty' + scopeValidators: + $ref: '#/components/schemas/MetadataProperty' + accessTokenType: + $ref: '#/components/schemas/MetadataProperty' + accessTokenBindingType: + $ref: '#/components/schemas/MetadataProperty' + tokenEndpointAuthMethod: + $ref: '#/components/schemas/ClientAuthenticationMethodMetadata' + tokenEndpointAllowReusePvtKeyJwt: + type: boolean + default: false + tokenEndpointSignatureAlgorithm: + $ref: '#/components/schemas/MetadataProperty' + idTokenSignatureAlgorithm: + $ref: '#/components/schemas/MetadataProperty' + requestObjectSignatureAlgorithm: + $ref: '#/components/schemas/MetadataProperty' + requestObjectEncryptionAlgorithm: + $ref: '#/components/schemas/MetadataProperty' + requestObjectEncryptionMethod: + $ref: '#/components/schemas/MetadataProperty' + subjectType: + $ref: '#/components/schemas/MetadataProperty' + fapiMetadata: + $ref: '#/components/schemas/FapiMetadata' + WSTrustMetaData: + type: object + properties: + certificateAlias: + $ref: '#/components/schemas/MetadataProperty' + CustomInboundProtocolMetaData: + type: object + properties: + displayName: + type: string + example: 'My Custom Protocol' + configName: + type: string + example: 'Custom Protocol' + properties: + type: array + items: + $ref: '#/components/schemas/CustomInboundProtocolProperty' + CustomInboundProtocolProperty: + type: object + properties: + name: + type: string + example: 'encryptionAlgorithm' + displayName: + type: string + example: 'Encryption Algorithm' + type: + type: string + enum: + - STRING + - BOOLEAN + - INTEGER + example: STRING + required: + type: boolean + example: true + availableValues: + type: array + items: + type: string + example: + - 'http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p' + - 'http://www.w3.org/2001/04/xmlenc#rsa-1_5' + defaultValue: + type: string + example: 'http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p' + validationRegex: + type: string + example: '^[a-b][A-B]*' + displayOrder: + type: integer + example: 1 + isConfidential: + type: boolean + default: false + AdaptiveAuthTemplates: + type: object + properties: + templatesJSON: + type: string + example: 'Adaptive Auth Templates JSON' + FileUpload: + type: object + properties: + file: + type: string + format: binary + description: file to upload + ApplicationTemplatesList: + type: object + properties: + templates: + type: array + items: + $ref: '#/components/schemas/ApplicationTemplatesListItem' + ApplicationTemplatesListItem: + type: object + properties: + id: + type: string + example: "85e3f4b8-0d22-4181-b1e3-1651f71b88bd" + name: + type: string + example: "OIDC Protocol Template" + description: + type: string + example: "Template to be used for Single Page Applications" + image: + type: string + example: "https://example.com/logo/my-logo.png" + authenticationProtocol: + type: string + example: "oidc" + types: + type: array + items: + type: string + example: + - react + - angular + category: + type: string + enum: [DEFAULT, VENDOR] + example: 'DEFAULT' + displayOrder: + type: integer + example: 2 + templateGroup: + type: string + example: "web-application" + self: + type: string + example: "/t/wso2.com/api/server/v1/applications/templates/85e3f4b8-0d22-4181-b1e3-1651f71b88bd" + ApplicationTemplateModel: + type: object + properties: + id: + type: string + readOnly: true + example: "85e3f4b8-0d22-4181-b1e3-1651f71b88bd" + name: + type: string + example: "OIDC Protocol Template" + description: + type: string + example: "Template to be used for Single Page Applications" + image: + type: string + example: "https://example.com/logo/my-logo.png" + authenticationProtocol: + type: string + example: "oidc" + types: + type: array + items: + type: string + example: + - react + - angular + category: + type: string + enum: [DEFAULT, VENDOR] + example: 'DEFAULT' + templateGroup: + type: string + example: "web-application" + displayOrder: + type: integer + example: 2 + application: + $ref: '#/components/schemas/ApplicationModel' + required: + - name + - application + ApplicationOwner: + type: object + properties: + id: + type: string + example: "85e3f4b8-0d22-4181-b1e3-1651f71b88bd" + required: + - id + AuthorizedAPIResponse: + type: object + properties: + id: + type: string + example: 65b52595-9ca1-4539-aca2-56178643c58b + identifier: + type: string + example: https://greetings.io/v1/greet + displayName: + type: string + example: Greetings API + policyId: + type: string + example: RBAC + type: + type: string + example: BUSINESS + authorizedScopes: + type: array + items: + $ref: '#/components/schemas/AuthorizedScope' + AuthorizedScope: + type: object + properties: + id: + type: string + example: 65b52595-9ca1-4539-aca2-56178643c58b + name: + type: string + example: bookings:read + displayName: + type: string + example: Read Bookings + AuthorizedAPICreationModel: + type: object + properties: + id : + type: string + example: 65b52595-9ca1-4539-aca2-56178643c58b + policyIdentifier: + type: string + example: RBAC + scopes: + type: array + items: + type: string + example: bookings:read + AuthorizedAPIPatchModel: + type: object + properties: + addedScopes: + type: array + items: + type: string + example: bookings:write + removedScopes: + type: array + items: + type: string + example: bookings:read + Error: + type: object + properties: + code: + type: string + example: AAA-00000 + message: + type: string + example: Some error message. + description: + type: string + example: Some error description. + traceId: + type: string + example: e0fbcfeb-3617-43c4-8dd0-7b7d38e13047 + ApplicationSharePOSTRequest: + type: object + properties: + shareWithAllChildren: + type: boolean + default: false + sharedOrganizations: + type: array + items: + type: string + example: + - 682edf68-4835-4bb8-961f-0a16bc6cc866 + - ghfbctgf-4318-46d4-8ee1-7t3s38e23098 + SharedOrganizationsResponse: + type: object + properties: + organizations: + type: array + items: + $ref: '#/components/schemas/BasicOrganizationResponse' + SharedApplicationsResponse: + type: object + properties: + sharedApplications: + type: array + items: + $ref: '#/components/schemas/SharedApplicationResponse' + SharedApplicationResponse: + type: object + properties: + applicationId: + type: string + description: Shared application's id. + example: 'ca322554-fe79-4c04-9c94-492855ef92a3' + organizationId: + type: string + description: Shared application residing organization id. + example: '682edf68-4835-4bb8-961f-0a16bc6cc866' + BasicOrganizationResponse: + type: object + required: + - id + - name + - status + - ref + properties: + id: + type: string + example: 'b4526d91-a8bf-43d2-8b14-c548cf73065b' + name: + type: string + example: 'ABC Builders' + status: + type: string + enum: [ ACTIVE, DISABLED ] + example: ACTIVE + ref: + type: string + example: '/t/wso2.com/api/server/v1/organizations/b4526d91-a8bf-43d2-8b14-c548cf73065b' +servers: + - url: 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1' + variables: + serverUrl: + default: "https://api.asgardeo.io/t/{root-organization-name}/o/" + root-organization-name: + default: "{root-organization-name}" diff --git a/docusaurus-asgardeo/static/apis/organization-apis/restapis/org-group-mgt.yaml b/docusaurus-asgardeo/static/apis/organization-apis/restapis/org-group-mgt.yaml new file mode 100644 index 0000000000..789e75e1b3 --- /dev/null +++ b/docusaurus-asgardeo/static/apis/organization-apis/restapis/org-group-mgt.yaml @@ -0,0 +1,937 @@ +openapi: 3.0.0 +info: + version: "v1" + title: Asgardeo - SCIM 2.0 Group Management API + description: + "This is the RESTful API for SCIM 2.0 Group Management in Asgardeo organizations. + This API allows creating, deleting, listing, and updating users. + \n To access the SCIM 2.0 Group Management APIs in Asgardeo, you need to first get an access token from your organization." +security: + - OAuth2: [] +servers: + - url: 'https://api.asgardeo.io/t/{root-organization-name}/o/scim2' + variables: + server-url: + default: https://api.asgardeo.io/t/{root-organization-name}/o/ + root-organization-name: + default: "{root-organization-name}" +tags: + - name: Groups Endpoint + description: This endpoint performs actions related to all groups in the organization +paths: + /Groups: + get: + tags: + - Groups Endpoint + summary: Filter Groups + description: "This API returns groups according to the specified filter, sort, and pagination parameters.\n\n + + Scope(Permission) required: ``internal_org_group_mgt_view`` \n\n" + operationId: getGroup + parameters: + - name: attributes + in: query + description: SCIM defined attributes parameter. + schema: + type: string + - name: excludedAttributes + in: query + description: SCIM defined excludedAttribute parameter. + schema: + type: string + - name: filter + in: query + description: Filter expression for filtering + schema: + type: string + - name: startIndex + in: query + description: The 1-based index of the first query result + schema: + type: integer + format: int32 + - name: count + in: query + description: Specifies the desired maximum number of query results per page. + schema: + type: integer + format: int32 + - name: domain + in: query + description: The name of the user store where filtering needs to be applied. + schema: + type: string + responses: + 200: + description: Valid groups are found / No Group found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/GroupsListResponseObject' + 401: + description: Unauthorized + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUnauthorized' + 403: + description: Forbidden + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorForbidden' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/scim2/Groups' \ + -H 'accept: application/scim+json' \ + -H 'Authorization: Bearer {bearer_token}' + post: + tags: + - Groups Endpoint + summary: Create Group + description: "This API creates a group and returns the details of the created group including its unique ID.\n\n + + Scope(Permission) required: ``internal_org_group_mgt_create``\n\n" + operationId: createGroup + parameters: + - name: attributes + in: query + description: SCIM defined attributes parameter. + schema: + type: string + - name: excludedAttributes + in: query + description: SCIM defined excludedAttribute parameter. + schema: + type: string + requestBody: + content: + application/scim+json: + schema: + $ref: '#/components/schemas/GroupRequestObject' + required: false + responses: + 201: + description: Valid group is created + content: + application/scim+json: + schema: + $ref: '#/components/schemas/GroupResponseObject' + 401: + description: Unauthorized + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUnauthorized' + 403: + description: Forbidden + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorForbidden' + 404: + description: Group is not found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorGroupNotAvailable' + 409: + description: Group already exist + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorGroupAlreadyAvailable' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/scim2/Groups' \ + -H 'accept: application/scim+json' \ + -H 'Authorization: Bearer {bearer_token}' + x-codegen-request-body-name: body + /Groups/.search: + post: + tags: + - Groups Endpoint + summary: Search Groups + description: "This API returns groups according to the specified filter, sort, and pagination parameters.\n\n + + Scope(Permission) required: ``internal_org_group_mgt_view``\n\n" + operationId: getGroupsByPost + requestBody: + content: + application/scim+json: + schema: + $ref: '#/components/schemas/GroupSearchRequestObject' + required: false + responses: + 200: + description: Valid groups are found / Valid groups are not found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/GroupSearchResponseObject' + 401: + description: Unauthorized + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUnauthorized' + 403: + description: Forbidden + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorForbidden' + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/scim2/Groups/.search' \ + -H 'accept: application/scim+json' \ + -H 'Content-Type: application/scim+json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "schemas": [ + "urn:ietf:params:scim:api:messages:2.0:SearchRequest" + ], + "startIndex": 1, + "filter": "displayName eq manager" + }' + x-codegen-request-body-name: body + /Groups/{id}: + get: + tags: + - Groups Endpoint + summary: Get Group by ID + description: "This API returns the group details of a particular group using its unique ID.\n\n + + Scope(Permission) required: ``internal_org_group_mgt_view``\n\n" + operationId: getGroup by id + parameters: + - name: id + in: path + description: Unique ID of the resource type. + required: true + schema: + type: string + - name: attributes + in: query + description: SCIM defined attributes parameter. + schema: + type: string + - name: excludedAttributes + in: query + description: SCIM defined excludedAttribute parameter. + schema: + type: string + responses: + 200: + description: Valid group is found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/GroupResponseObject' + 401: + description: Unauthorized + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUnauthorized' + 403: + description: Forbidden + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorForbidden' + 404: + description: Valid group is not found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorNoGroupAvailable' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/scim2/Groups/{group-id}' \ + -H 'accept: application/scim+json' \ + -H 'Authorization: Bearer {bearer_token}' + put: + tags: + - Groups Endpoint + summary: Update Group - PUT + description: "This API updates the group details and returns the updated group details using a PUT operation.\n\n + + Scope(Permission) required: ``internal_org_group_mgt_update`` \n\n" + operationId: updateGroup + parameters: + - name: id + in: path + description: Unique ID of the resource type. + required: true + schema: + type: string + - name: attributes + in: query + description: SCIM defined attributes parameter. + schema: + type: string + - name: excludedAttributes + in: query + description: SCIM defined excludedAttribute parameter. + schema: + type: string + requestBody: + content: + application/scim+json: + schema: + $ref: '#/components/schemas/GroupPutRequestObject' + required: false + responses: + 200: + description: Group is updated + content: + application/scim+json: + schema: + $ref: '#/components/schemas/GroupPutResponseObject' + 400: + description: Invalid Input + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorInvalidInput' + 401: + description: Unauthorized + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUnauthorized' + 403: + description: Forbidden + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorForbidden' + 404: + description: Valid group is not found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorNoGroupAvailable' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PUT' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/scim2/Groups/{group-id}' \ + -H 'accept: application/scim+json' \ + -H 'Content-Type: application/scim+json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "displayName": "manager", + "members": [ + { + "value": "409ca90b-2ba6-4474-9a45-2cf7376e6e43", + "display": "kris" + } + ] + }' + x-codegen-request-body-name: body + delete: + tags: + - Groups Endpoint + summary: Delete Group + description: "This API deletes a particular group using its unique ID.\n\n + + Scope(Permission) required: ``internal_org_group_mgt_delete``\n\n" + operationId: deleteGroup + parameters: + - name: id + in: path + description: Unique ID of the resource type. + required: true + schema: + type: string + responses: + 204: + description: Group is deleted + content: {} + 401: + description: Unauthorized + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUnauthorized' + 403: + description: Forbidden + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorForbidden' + 404: + description: Valid group is not found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorNoGroupAvailable' + x-codeSamples: + - lang: Curl + source: | + curl -X 'DELETE' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/scim2/Groups/{group-id}' \ + -H 'accept: */*' \ + -H 'Authorization: Bearer {bearer_token}' + patch: + tags: + - Groups Endpoint + summary: Update Group - PATCH + description: "This API updates the group details and returns the updated group details using a PATCH operation.\n\n + + Scope(Permission) required: ``internal_org_group_mgt_update``\n\n" + operationId: patchGroup + parameters: + - name: id + in: path + description: Unique id of the resource type. + required: true + schema: + type: string + - name: attributes + in: query + description: SCIM defined attributes parameter. + schema: + type: string + - name: excludedAttributes + in: query + description: SCIM defined excludedAttribute parameter. + schema: + type: string + requestBody: + content: + application/scim+json: + schema: + $ref: '#/components/schemas/PatchGroupOperationRequestObject' + required: false + responses: + 200: + description: Group is updated + content: + application/scim+json: + schema: + $ref: '#/components/schemas/PatchGroupOperationResponseObject' + 401: + description: Unauthorized + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUnauthorized' + 403: + description: Forbidden + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorForbidden' + 404: + description: Valid group is not found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorNoGroupAvailable' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PATCH' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/scim2/Groups/{group-id}' \ + -H 'accept: application/scim+json' \ + -H 'Content-Type: application/scim+json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "schemas": [ + "urn:ietf:params:scim:api:messages:2.0:PatchOp" + ], + "Operations": [ + { + "op": "add", + "value": { + "members": [ + { + "display": "kris", + "value": "409ca90b-2ba6-4474-9a45-2cf7376e6e43" + } + ] + } + } + ] + }' + x-codegen-request-body-name: body +components: + schemas: + UserResponseObject: + required: + - meta + type: object + properties: + meta: + type: object + properties: + created: + type: string + example: 2018-08-17T10:34:29Z + location: + type: string + example: https://api.asgardeo.io/t/{root-organization-name}/o/scim2/Users/008bba85-451d-414b-87de-c03b5a1f4217 + lastModified: + type: string + example: 2018-08-17T10:34:29Z + resourceType: + type: string + example: User + schemas: + type: object + properties: {} + example: + - urn:ietf:params:scim:schemas:core:2.0:User + - urn:ietf:params:scim:schemas:extension:enterprise:2.0:User + username: + type: string + example: DEFAULT/kim@gmail.com + id: + type: string + example: 008bba85-451d-414b-87de-c03b5a1f4217 + name: + type: object + properties: + givenName: + type: string + example: Kim + familyName: + type: string + example: Berry + emails: + type: array + example: + - kim@gmail.com + items: + type: object + properties: {} + urn:ietf:params:scim:schemas:extension:enterprise:2.0:User: + type: object + properties: + manager: + type: object + properties: + value: + type: string + example: Taylor + roles: + type: object + properties: {} + example: + - type: default + value: Internal/everyone + GroupRequestObject: + required: + - displayName + - schemas + type: object + properties: + schemas: + type: array + items: + type: string + example: urn:ietf:params:scim:schemas:core:2.0:Group + displayName: + type: string + example: DEFAULT/manager + members: + type: array + items: + type: object + properties: {} + example: + value: 008bba85-451d-414b-87de-c03b5a1f4217 + display: kim + GroupResponseObject: + type: object + properties: + displayName: + type: string + example: DEFAULT/manager + meta: + type: object + properties: + created: + type: string + example: 2019-08-26T14:27:36 + location: + type: string + example: https://api.asgardeo.io/t/{root-organization-name}/o/scim2/Groups/7bac6a86-1f21-4937-9fb1-5be4a93ef469 + lastModified: + type: string + example: 2019-08-26T14:27:36 + resourceType: + type: string + example: Group + schemas: + type: array + items: + type: string + example: urn:ietf:params:scim:schemas:core:2.0:Group + id: + type: string + example: 7bac6a86-1f21-4937-9fb1-5be4a93ef469 + members: + type: array + items: + type: object + properties: + $ref: + type: string + example: https://api.asgardeo.io/o/{organization-id}/scim2/Users/3a12bae9-4386-44be-befd-caf349297f45 + display: + type: string + example: kim + value: + type: string + example: 008bba85-451d-414b-87de-c03b5a1f4217 + roles: + type: array + items: + type: object + properties: + $ref: + type: string + example: https://api.asgardeo.io/t/{root-organization-name}/o/scim2/v2/Roles/4645709c-ea8c-4495-8590-e1fa0efe3de0 + display: + type: string + example: loginRole + value: + type: string + example: 4645709c-ea8c-4495-8590-e1fa0efe3de0 + GroupsListResponseObject: + type: object + properties: + totalResults: + type: integer + example: 3 + startIndex: + type: integer + example: 1 + itemsPerPage: + type: integer + example: 3 + schemas: + type: array + items: + type: string + example: urn:ietf:params:scim:api:messages:2.0:ListResponse + Resources: + type: array + items: + $ref: '#/components/schemas/groupOb' + GroupSearchRequestObject: + type: object + properties: + schemas: + type: object + properties: {} + example: + - urn:ietf:params:scim:api:messages:2.0:SearchRequest + startIndex: + type: integer + example: 1 + filter: + type: string + example: displayName eq manager + GroupSearchResponseObject: + type: object + properties: + totalResults: + type: integer + example: 1 + startIndex: + type: integer + example: 1 + itemsPerPage: + type: integer + example: 3 + schemas: + type: array + items: + type: string + example: urn:ietf:params:scim:api:messages:2.0:ListResponse + Resources: + type: array + items: + $ref: '#/components/schemas/groupOb' + groupOb: + type: object + properties: + displayName: + type: string + example: DEFAULT/manager + meta: + type: object + properties: + created: + type: string + example: 2019-08-26T14:27:36 + location: + type: string + example: https://api.asgardeo.io/t/{root-organization-name}/o/scim2/Groups/7bac6a86-1f21-4937-9fb1-5be4a93ef469 + lastModified: + type: string + example: 2019-08-26T14:27:36 + members: + type: array + items: + type: object + properties: + $ref: + type: string + example: https://api.asgardeo.io/t/{root-organization-name}/o/scim2/Users/3a12bae9-4386-44be-befd-caf349297f45 + display: + type: string + example: kim + value: + type: string + example: 008bba85-451d-414b-87de-c03b5a1f4217 + roles: + type: array + items: + type: object + properties: + $ref: + type: string + example: https://api.asgardeo.io/o/{organization-id}/scim2/v2/Roles/4645709c-ea8c-4495-8590-e1fa0efe3de0 + display: + type: string + example: loginRole + value: + type: string + example: 4645709c-ea8c-4495-8590-e1fa0efe3de0 + id: + type: string + example: 7bac6a86-1f21-4937-9fb1-5be4a93ef469 + GroupPutRequestObject: + type: object + properties: + displayName: + type: string + example: manager + members: + type: array + items: + type: object + properties: {} + example: + value: 409ca90b-2ba6-4474-9a45-2cf7376e6e43 + display: kris + GroupPutResponseObject: + type: object + properties: + displayName: + type: string + example: DEFAULT/manager + meta: + type: object + properties: + created: + type: string + example: 2019-08-26T14:27:36 + location: + type: string + example: https://api.asgardeo.io/t/{root-organization-name}/o/scim2/Groups/7bac6a86-1f21-4937-9fb1-5be4a93ef469 + lastModified: + type: string + example: 2019-08-26T14:27:36 + resourceType: + type: string + example: Group + schemas: + type: array + items: + type: string + example: urn:ietf:params:scim:schemas:core:2.0:Group + id: + type: string + example: 7bac6a86-1f21-4937-9fb1-5be4a93ef469 + members: + type: array + items: + type: object + properties: {} + example: + display: kris + value: 409ca90b-2ba6-4474-9a45-2cf7376e6e43 + PatchGroupOperationRequestObject: + type: object + properties: + schemas: + type: array + items: + type: string + example: urn:ietf:params:scim:api:messages:2.0:PatchOp + Operations: + type: array + items: + $ref: '#/components/schemas/GroupItemObj' + GroupItemObj: + type: object + properties: + op: + type: string + enum: + - add + - remove + - replace + value: + type: object + properties: + members: + type: array + items: + type: object + properties: {} + example: + display: kris + value: 409ca90b-2ba6-4474-9a45-2cf7376e6e43 + PatchGroupOperationResponseObject: + type: object + properties: + displayName: + type: string + example: DEFAULT/manager + meta: + type: object + properties: + created: + type: string + example: 2019-08-26T14:27:36 + location: + type: string + example: https://api.asgardeo.io/t/{root-organization-name}/o/scim2/Groups/7bac6a86-1f21-4937-9fb1-5be4a93ef469 + lastModified: + type: string + example: 2019-08-26T14:27:36 + resourceType: + type: string + example: Group + schemas: + type: object + properties: {} + example: + - urn:ietf:params:scim:schemas:core:2.0:Group + id: + type: string + example: 7bac6a86-1f21-4937-9fb1-5be4a93ef469 + members: + type: array + items: + type: object + properties: {} + example: + - display: kris + value: 409ca90b-2ba6-4474-9a45-2cf7376e6e43 + - display: kim + value: 007bfc66-e4f0-4d53-9dfd-0c4a77b33257 + ErrorInvalidInput: + required: + - detail + - status + type: object + properties: + status: + type: string + example: "400" + schemas: + type: string + example: urn:ietf:params:scim:api:messages:2.0:Error + scimType: + type: string + example: invalidSyntax + detail: + type: string + example: Request is unparsable, syntactically incorrect, or violates schema. + ErrorUnauthorized: + required: + - status + type: object + properties: + schemas: + type: string + example: urn:ietf:params:scim:api:messages:2.0:Error + detail: + type: string + example: "Authorization failure. Authorization information was invalid or missing from your request." + status: + type: string + example: "401" + ErrorForbidden: + required: + - status + type: object + properties: + schemas: + type: string + example: urn:ietf:params:scim:api:messages:2.0:Error + detail: + type: string + example: "Operation is not permitted. You do not have permission to make this request." + status: + type: string + example: "403" + ErrorGroupNotAvailable: + required: + - detail + - status + type: object + properties: + status: + type: string + example: "404" + schemas: + type: string + example: urn:ietf:params:scim:api:messages:2.0:Error + detail: + type: string + example: 'No Group with the id : 89a2a363-c90f-47e9-afae-949d026dad16 in + the user store.' + ErrorNoGroupAvailable: + required: + - detail + - status + type: object + properties: + status: + type: string + example: "404" + schemas: + type: array + items: + type: string + example: urn:ietf:params:scim:api:messages:2.0:Error + detail: + type: string + example: Group not found in the user store. + ErrorGroupAlreadyAvailable: + required: + - detail + - status + type: object + properties: + status: + type: string + example: "409" + schemas: + type: string + example: urn:ietf:params:scim:api:messages:2.0:Error + detail: + type: string + example: 'Group with name: DEFAULT/manager already exists in the system.' + securitySchemes: + OAuth2: + type: oauth2 + description: "**Authorization code OAuth flow** + **Organization Switch**" diff --git a/docusaurus-asgardeo/static/apis/organization-apis/restapis/org-management.yaml b/docusaurus-asgardeo/static/apis/organization-apis/restapis/org-management.yaml new file mode 100644 index 0000000000..7bfceca0aa --- /dev/null +++ b/docusaurus-asgardeo/static/apis/organization-apis/restapis/org-management.yaml @@ -0,0 +1,1131 @@ +openapi: 3.0.0 +info: + version: "v1" + title: 'Asgardeo - Organization Management API Definition' + description: | + 'This is the RESTful API for organization management in Asgardeo. This API allows users + to create, update, retrieve and delete organizations.

    + + Important:
    + You need a paid Asgardeo subscription to create hierarchical organizations. If you don't already have one, view the available [subscription plans](https://wso2.com/asgardeo/pricing/){:target="_blank"} and contact the Asgardeo sales team.' +servers: + - url: 'https://api.asgardeo.io/t/{organization-name}/o/api/server/v1' + variables: + server-url: + default: https://api.asgardeo.io/t/{organization-name}/o/api/server/v1 + root-organization-name: + default: "{organization-name}" +security: + - OAuth2: [] + +paths: + /organizations: + post: + tags: + - Organization + description: | + This API is used to create the organization defined in the user input. + + Scope(Permission) required: `internal_org_organization_create` + summary: + Create a new organization. + operationId: organizationPost + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationPOSTRequest' + description: This represents the organization to be added. + required: true + responses: + '201': + description: Successful response + headers: + Location: + description: Location of the newly created organization. + schema: + type: string + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationResponse' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{organization-name}/o/api/server/v1/organizations' \ + -H 'Content-Type: application/json' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "name": "ABC Builders", + "description": "Building constructions", + "attributes": [ + { + "key": "Country", + "value": "USA" + } + ] + }' + x-codegen-request-body-name: body + get: + description: | + This API is used to search and retrieve organizations created for this tenant. + + Organizations can be filtered by id, name, description, created, lastModified, status, parentId, and meta attributes. + + Supported operators: "eq"(equals), "co"(contains), "sw"(starts with), "ew"(ends with), "ge"(greater than or equals), "le"(less than or equals), "gt"(greater than), "lt"(less than) + + Multiple attributes can be combined using the "and" operator. + + Examples: + - filter=name+eq+ABC Builders + - filter=attributes.Country+eq+Sri Lanka + + Scope(Permission) required: `internal_org_organization_view` + summary: + Retrieve organizations created for this tenant which matches the defined search criteria, if any. + operationId: organizationsGet + parameters: + - $ref: '#/components/parameters/filterQueryParam' + - $ref: '#/components/parameters/limitQueryParam' + - $ref: '#/components/parameters/afterQueryParam' + - $ref: '#/components/parameters/beforeQueryParam' + - $ref: '#/components/parameters/recursiveQueryParam' + responses: + '200': + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationsResponse' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '500': + $ref: '#/components/responses/ServerError' + '501': + $ref: '#/components/responses/NotImplemented' + tags: + - Organization + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{organization-name}/o/api/server/v1/organizations' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + /organizations/check-name: + post: + summary: Check organization with given name exist among the organizations hierarchy. + description: | + This API is used to check whether organization with particular name exist or not. + + If the organization name is available for use, the response will be "available": true, else it will be "available": false. + + Scope(Permission) required: `internal_org_organization_view` + operationId: organizationsCheckNamePost + requestBody: + description: OrganizationNameCheckPOSTRequest object containing the organization name. + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationNameCheckPOSTRequest' + required: true + responses: + '200': + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationNameCheckPOSTResponse' + '404': + $ref: '#/components/responses/NotFound' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '500': + $ref: '#/components/responses/ServerError' + tags: + - Organization + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{organization-name}/o/api/server/v1/organizations/check-name' \ + -H 'Content-Type: application/json' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "name": "XYZ Builders" + }' + x-codegen-request-body-name: body + /organizations/{organization-id}: + get: + description: | + This API is used to get an existing organization identified by the organization ID. + + Scope(Permission) required: `internal_org_organization_view` + summary: + Get an existing organization, identified by the organization ID. + parameters: + - name: organization-id + in: path + description: ID of the organization. + required: true + schema: + type: string + example: 5355f3f0-f8b3-457f-805a-b32a668c5125 + - $ref: '#/components/parameters/includePermissionsQueryParam' + responses: + '200': + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/GetOrganizationResponse' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + tags: + - Organization + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{organization-name}/o/api/server/v1/organizations/06c1f4e2-3339-44e4-a825-96585e3653b1' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + patch: + description: | + This API provides the capability to update an organization property + using patch request. Organization patch is supported only for key-value pairs. + + Scope(Permission) required: `internal_org_organization_update` + summary: + Patch an organization property by ID. Patch is supported only for + key-value pairs. + parameters: + - name: organization-id + in: path + description: ID of the organization to be patched. + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationPatchRequest' + required: true + responses: + '200': + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationResponse' + example: + { + "id": "06c1f4e2-3339-44e4-a825-96585e3653b1", + "name": "XYZ Builders", + "description": "Building constructions", + "status": "ACTIVE", + "created": "2021-10-25T12:31:53.406Z", + "lastModified": "2021-10-25T12:31:53.406Z", + "type": "TENANT", + "parent": { + "id": "d90f322f-59d9-39b8-8555-f049fa318397", + "ref": "/o/api/server/v1/organizations/d90f322f-59d9-39b8-8555-f049fa318397" + }, + "hasChildren": false, + "attributes": [ + { + "key": "Country", + "value": "USA" + } + ] + } + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + tags: + - Organization + x-codeSamples: + - lang: Curl + source: | + curl --location --request PATCH 'https://api.asgardeo.io/t/{organization-name}/o/api/server/v1/organizations/06c1f4e2-3339-44e4-a825-96585e3653b1' \ + -H 'Content-Type: application/json' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '[ + { + "operation": "REPLACE", + "path": "/name", + "value": "XYZ Builders" + }, + { + "operation": "REMOVE", + "path": "/attributes/Country" + }, + { + "operation": "ADD", + "path": "/attributes/Town", + "value": "Colombo-7" + } + ]' + x-codegen-request-body-name: body + put: + description: | + This API provides the capability to update an organization by its id. + + Scope(Permission) required: `internal_org_organization_update` + summary: + Update an organization by ID. + parameters: + - name: organization-id + in: path + description: ID of the organization to be updated. + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationPUTRequest' + required: true + responses: + '200': + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationResponse' + example: + { + "id": "06c1f4e2-3339-44e4-a825-96585e3653b1", + "name": "ABCD Builders", + "description": "Building constructions company", + "status": "ACTIVE", + "created": "2021-10-25T12:31:53.406Z", + "lastModified": "2021-10-25T12:31:53.406Z", + "type": "TENANT", + "parent": { + "id": "d90f322f-59d9-39b8-8555-f049fa318397", + "ref": "/o/api/server/v1/organizations/d90f322f-59d9-39b8-8555-f049fa318397" + }, + "hasChildren": false, + "attributes": [ + { + "key": "Town", + "value": "Colombo-7" + } + ] + } + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + tags: + - Organization + x-codeSamples: + - lang: Curl + source: | + curl --location --request PUT 'https://api.asgardeo.io/t/{organization-name}/o/api/server/v1/organizations/06c1f4e2-3339-44e4-a825-96585e3653b1' \ + -H 'Content-Type: application/json' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "name": "ABCD Builders", + "description": "Building constructions company", + "status": "ACTIVE", + "attributes": [ + { + "key": "Country", + "value": "USA" + } + ] + }' + x-codegen-request-body-name: body + delete: + description: | + This API provides the capability to delete an organization by + giving its ID. + + Scope(Permission) required: `internal_org_organization_delete` + summary: + Delete an organization by using the organization's ID. + parameters: + - name: organization-id + in: path + description: ID of the organization to be deleted. + required: true + schema: + type: string + responses: + '204': + description: Successfully deleted + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + tags: + - Organization + x-codeSamples: + - lang: Curl + source: | + curl --location --request DELETE 'https://api.asgardeo.io/t/{organization-name}/o/api/server/v1/organizations/06c1f4e2-3339-44e4-a825-96585e3653b1' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + /organizations/self: + get: + tags: + - Organization + description: | + This API retrieves the organization information associated with the currently accessing organization. + + Scopes (Permissions) required: `internal_org_organization_view` + summary: Get organization details of the currently accessing organization. + operationId: getSelfOrganization + responses: + '200': + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationResponse' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl --location --request GET 'https://api.asgardeo.io/t/{organization-name}/o/api/server/v1/organizations/self' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + patch: + tags: + - Organization + description: | + This API updates the editable fields of the organization associated with the currently accessing organization. + Currently only the organization name can be updated using this API. + + Scopes (Permissions) required: `internal_org_organization_update` + summary: Update organization details of the currently accessing organization. + operationId: patchSelfOrganization + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationPatchRequest' + description: Partial update payload for the organization. + required: true + responses: + '200': + description: Successfully updated organization. + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationResponse' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl --location --request PATCH 'https://api.asgardeo.io/t/{organization-name}/o/api/server/v1/organizations/self' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -H 'Content-Type: application/json' \ + -d '[ + { + "operation": "REPLACE", + "path": "/name", + "value": "ABCD Builders" + } + ]' + /organizations/metadata: + get: + tags: + - Organization Metadata + description: | + This API facilitates the retrieval of metadata including discovery attributes of the logged in organization.
    + + Scope(Permission) required: `internal_org_organization_view` + summary: + Get metadata of the logged in organization. + operationId: organizationMetadataGet + responses: + '200': + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationMetadata' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{organization-name}/o/api/server/v1/organizations/metadata' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + /organizations/meta-attributes: + get: + tags: + - Organization Meta Attributes + description: | + This API facilitates the retrieval of organization meta attributes which matches the defined search criteria, if any. + + Supported operators: "eq"(equals), "co"(contains), "sw"(starts with), "ew"(ends with), "ge"(greater than or equals), "le"(less than or equals), "gt"(greater than), "lt"(less than) + + Multiple filters can be combined using the "and" operator. + + Example: filter=attributes+eq+Country + + Scope(Permission) required: `internal_org_organization_view` + summary: Get meta attributes of organizations with filter capabilities. + operationId: organizationsMetaAttributesGet + parameters: + - $ref: '#/components/parameters/filterQueryParam' + - $ref: '#/components/parameters/limitQueryParam' + - $ref: '#/components/parameters/afterQueryParam' + - $ref: '#/components/parameters/beforeQueryParam' + - $ref: '#/components/parameters/recursiveQueryParam' + responses: + '200': + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/MetaAttributesResponse' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '500': + $ref: '#/components/responses/ServerError' + '501': + $ref: '#/components/responses/NotImplemented' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{organization-name}/o/api/server/v1/organizations/meta-attributes' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' +components: + parameters: + filterQueryParam: + in: query + name: filter + required: false + description: + Condition to filter the retrieval of records. + schema: + type: string + limitQueryParam: + in: query + name: limit + required: false + description: + Maximum number of records to be returned. (Should be greater than 0) + schema: + type: integer + format: int32 + minimum: 0 + offsetQueryParam: + in: query + name: offset + required: false + description: Number of records to skip for pagination. + schema: + type: integer + format: int32 + minimum: 0 + beforeQueryParam: + in: query + name: before + required: false + description: + Points to the previous range of data that can be retrieved. + schema: + type: string + afterQueryParam: + in: query + name: after + required: false + description: + Points to the next range of data to be returned. + schema: + type: string + recursiveQueryParam: + in: query + name: recursive + required: false + description: | + Determines whether a recursive search should happen. + If set to true, will include organizations in all levels of the hierarchy; If set to false, includes only organizations in the next level of the hierarchy. + schema: + type: boolean + default: false + showChildrenQueryParam: + in: query + name: showChildren + required: false + description: + Returns the organization details along with the child organization IDs belonging to this organization. + schema: + type: boolean + default: false + includePermissionsQueryParam: + in: query + name: includePermissions + required: false + description: + Returns the organization details along with permissions assigned for the requested user in this organization. + schema: + type: boolean + default: false + + schemas: + Error: + type: object + required: + - code + - message + properties: + code: + type: string + example: ORG-00000 + description: An error code. + message: + type: string + example: Some Error Message + description: An error message. + description: + type: string + example: Some Error Description + description: An error description. + traceId: + type: string + example: e0fbcfeb-3617-43c4-8dd0-7b7d38e13047 + description: An error trace identifier. + + OrganizationPOSTRequest: + type: object + required: + - name + properties: + name: + type: string + example: "ABC Builders" + orgHandle: + type: string + example: "abcbuilders" + description: + type: string + example: "Building constructions" + parentId: + type: string + description: "The parent organization id should be the organization where the request is invoked. If a value is not specified it will be resolved internally." + attributes: + type: array + items: + $ref: '#/components/schemas/Attribute' + example: + { + "name": "ABC Builders", + "description": "Building constructions", + "attributes": [ + { + "key": "Country", + "value": "USA" + } + ] + } + OrganizationPUTRequest: + type: object + required: + - name + - status + properties: + name: + type: string + example: "ABCD Builders" + orgHandle: + type: string + example: "abcbuilders" + description: + type: string + example: "Building constructions company" + status: + type: string + enum: [ACTIVE, DISABLED] + example: ACTIVE + attributes: + type: array + items: + $ref: '#/components/schemas/Attribute' + OrganizationNameCheckPOSTRequest: + type: object + properties: + name: + type: string + example: "XYZ Builders" + OrganizationNameCheckPOSTResponse: + type: object + properties: + available: + type: boolean + example: true + Attribute: + type: object + required: + - key + - value + properties: + key: + type: string + example: "Country" + value: + type: string + example: "USA" + OrganizationsResponse: + type: object + properties: + links: + type: array + items: + $ref: '#/components/schemas/Link' + example: + [ + { + "href": "/o/api/server/v1/organizations?limit=10&filter=name+co+der&next=MjAyMS0xMi0yMSAwNToxODozMS4wMDQzNDg=", + "rel": "next", + }, { + "href": "/o/api/server/v1/organizations?limit=10&filter=name+co+der&before=MjAyMS0xMi0yMSAwNToxODozMS4wMDQzNDg=", + "rel": "previous", + } + ] + organizations: + type: array + items: + $ref: '#/components/schemas/BasicOrganizationResponse' + Link: + type: object + properties: + href: + type: string + format: uri + description: Endpoint that will return the next or previous page of data. + rel: + type: string + description: Describes whether the provided link is to access the next or previous page of data. + readOnly: true + BasicOrganizationResponse: + type: object + required: + - id + - name + - orgHandle + - status + - version + - ref + properties: + id: + type: string + example: '06c1f4e2-3339-44e4-a825-96585e3653b1' + name: + type: string + example: 'ABC Builders' + orgHandle: + type: string + example: 'abcbuilders' + status: + type: string + enum: [ ACTIVE, DISABLED ] + example: ACTIVE + version: + type: string + example: 'v1.0.0' + hasChildren: + type: boolean + example: false + ref: + type: string + example: '/o/api/server/v1/organizations/06c1f4e2-3339-44e4-a825-96585e3653b1' + attributes: + type: array + items: + $ref: '#/components/schemas/Attribute' + OrganizationResponse: + type: object + required: + - id + - name + - orgHandle + - status + - version + - created + - lastModified + - type + properties: + id: + type: string + example: '06c1f4e2-3339-44e4-a825-96585e3653b1' + name: + type: string + example: 'ABC Builders' + orgHandle: + type: string + example: 'abcbuilders' + description: + type: string + example: 'Building constructions' + status: + type: string + enum: [ACTIVE, DISABLED] + example: ACTIVE + version: + type: string + example: 'v1.0.0' + created: + type: string + example: '2021-10-25T12:31:53.406Z' + lastModified: + type: string + example: '2021-10-25T12:31:53.406Z' + type: + type: string + example: "TENANT" + enum: + - TENANT + parent: + $ref: '#/components/schemas/ParentOrganization' + hasChildren: + type: boolean + example: false + attributes: + type: array + items: + $ref: '#/components/schemas/Attribute' + GetOrganizationResponse: + type: object + required: + - id + - name + - orgHandle + - status + - version + - created + - lastModified + - type + properties: + id: + type: string + example: '06c1f4e2-3339-44e4-a825-96585e3653b1' + name: + type: string + example: 'ABC Builders' + orgHandle: + type: string + example: 'abcbuilders' + description: + type: string + example: 'Building constructions' + status: + type: string + enum: [ACTIVE, DISABLED] + example: ACTIVE + version: + type: string + example: 'v1.0.0' + created: + type: string + example: '2021-10-25T12:31:53.406Z' + lastModified: + type: string + example: '2021-10-25T12:31:53.406Z' + type: + type: string + example: "TENANT" + enum: + - TENANT + hasChildren: + type: boolean + example: false + parent: + $ref: '#/components/schemas/ParentOrganization' + attributes: + type: array + items: + $ref: '#/components/schemas/Attribute' + permissions: + type: array + items: + type: string + ancestorPath: + type: array + description: 'Ancestors up to the request initiated organization' + items: + type: object + properties: + id: + type: string + name: + type: string + depth: + type: integer + example: + [ + { + "id": "10084a8d-113f-4211-a0d5-efe36b082211", + "name": "Global Holding Corp", + "depth": 0 + }, + { + "id": "d90f322f-59d9-39b8-8555-f049fa318397", + "name": "South Asia Division", + "depth": 1 + } + ] + MetaAttributesResponse: + type: object + properties: + links: + type: array + items: + $ref: '#/components/schemas/Link' + example: + [ + { + "href": "/o/api/server/v1/organizations/meta-attributes?limit=10&recursive=false&filter=attributes+co+C&after=MjAyMS0xMi0yMSAwNToxODozMS4wMDQzNDg=", + "rel": "next", + }, { + "href": "/o/api/server/v1/organizations/meta-attributes?limit=10&recursive=false&filter=attributes+co+C&before=MjAyMS0xMi0yMSAwNToxODozMS4wMDQzNDg=", + "rel": "previous", + } + ] + attributes: + type: array + items: + type: string + example: + - "Country" + - "Region" + #----------------------------------------------------- + # Organization Parent Object + #----------------------------------------------------- + ParentOrganization: + type: object + required: + - id + - ref + properties: + id: + type: string + example: 'd90f322f-59d9-39b8-8555-f049fa318397' + ref: + type: string + example: '/o/api/server/v1/organizations/d90f322f-59d9-39b8-8555-f049fa318397' + + #----------------------------------------------------- + # Organization Patch Operation Object + #----------------------------------------------------- + OrganizationPatchRequest: + type: array + items: + $ref: '#/components/schemas/OrganizationPatchRequestItem' + OrganizationPatchRequestItem: + description: A JSONPatch as defined by RFC 6902. Patch operation is supported only for root level attributes of an organization. + required: + - operation + - path + properties: + operation: + type: string + description: The operation to be performed. + enum: + - ADD + - REMOVE + - REPLACE + example: REPLACE + path: + type: string + description: A JSON-Pointer + example: '/name' + value: + type: string + description: The value to be used within the operations. + example: 'XYZ Builders' + DiscoveryAttribute: + type: object + required: + - type + - value + properties: + type: + type: string + example: 'emailDomain' + values: + type: array + items: + type: string + example: 'abc.com' + + OrganizationMetadata: + type: object + required: + - id + - name + - orgHandle + - status + - version + - created + - lastModified + - type + properties: + id: + type: string + example: '06c1f4e2-3339-44e4-a825-96585e3653b1' + name: + type: string + example: 'ABC Builders' + orgHandle: + type: string + example: 'abcbuilders' + description: + type: string + example: 'Building constructions' + status: + type: string + enum: [ACTIVE, DISABLED] + example: ACTIVE + version: + type: string + example: 'v1.0.0' + created: + type: string + example: '2021-10-25T12:31:53.406Z' + lastModified: + type: string + example: '2021-10-25T12:31:53.406Z' + type: + type: string + example: "TENANT" + enum: + - TENANT + parent: + $ref: '#/components/schemas/ParentOrganization' + attributes: + type: array + items: + $ref: '#/components/schemas/Attribute' + permissions: + type: array + items: + type: string + discoveryAttributes: + type: array + items: + $ref: '#/components/schemas/DiscoveryAttribute' + + #-------------------------------------------------------- + # Descriptions of Organization Management API responses. + #-------------------------------------------------------- + responses: + BadRequest: + description: Invalid input in the request. + content: + 'application/json': + schema: + $ref: '#/components/schemas/Error' + NotFound: + description: Requested resource is not found. + content: + 'application/json': + schema: + $ref: '#/components/schemas/Error' + Unauthorized: + description: Authentication information is missing or invalid. + Forbidden: + description: Access forbidden. + ServerError: + description: Internal server error. + content: + 'application/json': + schema: + $ref: '#/components/schemas/Error' + NotImplemented: + description: Not Implemented. + content: + 'application/json': + schema: + $ref: '#/components/schemas/Error' + OrgNotFound: + description: Organization Not Found + OrgExist: + description: Organization Exist + #----------------------------------------------------- + # Applicable authentication mechanisms. + #----------------------------------------------------- + securitySchemes: + OAuth2: + type: oauth2 + flows: + authorizationCode: + authorizationUrl: 'https://api.asgardeo.io/t/{organization-name}/oauth2/authorize' + tokenUrl: 'https://api.asgardeo.io/t/{organization-name}/oauth2/token' + scopes: {} + description: "**Authorization code OAuth flow** + **Organization Switch**" diff --git a/docusaurus-asgardeo/static/apis/organization-apis/restapis/org-offline-user-onboard.yaml b/docusaurus-asgardeo/static/apis/organization-apis/restapis/org-offline-user-onboard.yaml new file mode 100644 index 0000000000..1a9dc39f07 --- /dev/null +++ b/docusaurus-asgardeo/static/apis/organization-apis/restapis/org-offline-user-onboard.yaml @@ -0,0 +1,104 @@ +openapi: 3.0.0 +info: + version: v1 + title: Offline User Onboard Management API + description: >- + This document specifies an **Organization level Offline user onboard management RESTFull API** for + Asgardeo. + +paths: + '/offline-invite-link': + post: + tags: + - Temporary Link + summary: Generates a random link that can be used to set a new password + description: | + 'Generates a random and secured one time link that can be used to set a new password for a user onboarded to the organization' + + Scope(Permission) required: `internal_org_offline_invite` + operationId: generateLink + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/InvitationRequest' + description: This represents the invitation request. + required: true + responses: + '201': + description: Created + content: + text/plain: + schema: + type: string + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{organization-name}/o/api/users/v1/offline-invite-link' \ + -H 'Content-Type: application/json' \ + -H 'Accept: text/plain' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "username": "johnDoe", + "userstore": "DEFAULT" + }' +servers: + - url: 'https://api.asgardeo.io/t/{organization-name}/o/api/users/v1' + +security: + - OAuth2: [] +components: + schemas: + InvitationRequest: + type: object + required: + - username + - userstore + properties: + username: + type: string + description: Exisiting user's username + example: "johnDoe" + userstore: + type: string + description: User's userstore domain + example: "DEFAULT" + Error: + type: object + properties: + code: + type: string + example: "Some_error_code" + message: + type: string + example: "Some error message." + description: + type: string + example: "Some error description." + traceId: + type: string + example: "Some Correlation for Error Instance" + securitySchemes: + OAuth2: + type: oauth2 + flows: + authorizationCode: + authorizationUrl: 'https://api.asgardeo.io/t/{organization-name}/oauth2/authorize' + tokenUrl: 'http://api.asgardeo.io/t/{organization-name}/oauth2/token' + scopes: {} \ No newline at end of file diff --git a/docusaurus-asgardeo/static/apis/organization-apis/restapis/org-user-mgt.yaml b/docusaurus-asgardeo/static/apis/organization-apis/restapis/org-user-mgt.yaml new file mode 100644 index 0000000000..0f668aae4d --- /dev/null +++ b/docusaurus-asgardeo/static/apis/organization-apis/restapis/org-user-mgt.yaml @@ -0,0 +1,845 @@ +openapi: 3.0.0 +info: + version: "v1" + title: Asgardeo - SCIM 2.0 User Management API + description: + "This is the RESTful API for SCIM 2.0 User Management in Asgardeo organizations. + This API allows creating, deleting, listing, and updating users. + \n To access the SCIM 2.0 User Management APIs in Asgardeo, you need to first get an access token from your organization." +security: + - OAuth2: [] +servers: + - url: 'https://api.asgardeo.io/t/{root-organization-name}/o/scim2' + variables: + server-url: + default: https://api.asgardeo.io/t/{root-organization-name}/o/ + root-organization-name: + default: "{root-organization-name}" +tags: + - name: Users Endpoint + description: This endpoint performs actions related to all users in the organization. +paths: + /Users: + get: + tags: + - Users Endpoint + summary: Filter Users + description: "This API returns users according to the filter, sort and pagination parameters. Pagination is not supported across user stores and LDAP multi-attribute group filtering. However, filtering is supported across multiple user stores.\n\n + + Scope(Permission) required: ``internal_org_user_mgt_list``\n\n" + operationId: getUser + parameters: + - name: attributes + in: query + description: SCIM defined attributes parameter. + schema: + type: string + - name: excludedAttributes + in: query + description: SCIM defined excludedAttribute parameter. + schema: + type: string + - name: filter + in: query + description: The expression used for filtering. Supported filters are ‘Ew’, ‘Eq’, ‘Co’, ‘Sw’, ‘Ne’ and ‘and’. + schema: + type: string + - name: startIndex + in: query + description: The 1-based index of the first query result + schema: + type: integer + format: int32 + - name: count + in: query + description: Specifies the desired maximum number of query results per page. + schema: + type: integer + format: int32 + - name: domain + in: query + description: The name of the user store where filtering needs to be applied. + schema: + type: string + responses: + 200: + description: Valid users are found / Valid users are not found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/UserObjectListResponseObject' + 401: + description: Unauthorized + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUnauthorized' + 403: + description: Forbidden + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorForbidden' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/scim2/Users' \ + -H 'accept: application/scim+json' \ + -H 'Authorization: Bearer {bearer_token}' + post: + tags: + - Users Endpoint + summary: Create User + description: "This API creates a user and returns the user details along with the user's unique ID.\n\n + + Scope(Permission) required: ``internal_org_user_mgt_create``\n\n" + operationId: createUser + parameters: + - name: attributes + in: query + description: SCIM defined attributes parameter. + schema: + type: string + - name: excludedAttributes + in: query + description: SCIM defined excludedAttribute parameter. + schema: + type: string + requestBody: + content: + application/scim+json: + schema: + oneOf: + - $ref: '#/components/schemas/UserObject' + - $ref: '#/components/schemas/UserObjectPassInvite' + required: false + responses: + 201: + description: User is created. + content: + application/scim+json: + schema: + $ref: '#/components/schemas/UserResponseObject' + 400: + description: Invalid Input + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorInvalidInput' + 401: + description: Unauthorized + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUnauthorized' + 403: + description: Forbidden + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorForbidden' + 500: + description: Internal Server Error + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorInternalServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/scim2/Users' \ + -H 'accept: application/scim+json' \ + -H 'Content-Type: application/scim+json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "schemas": [], + "name": { + "givenName": "Kim", + "familyName": "Berry" + }, + "userName": "DEFAULT/kim@gmail.com", + "password": "aBcd!23#", + "emails": [ + { + "value": "kim@gmail.com", + "primary": true + } + ], + "urn:ietf:params:scim:schemas:extension:enterprise:2.0:User": { + "manager": { + "value": "Taylor" + } + }, + "urn:scim:wso2:schema": { + "verifyEmail": true + } + }' + x-codegen-request-body-name: body + /Users/.search: + post: + tags: + - Users Endpoint + summary: Search Users + description: "This API returns users according to the filter, sort and pagination parameters.\n\n + + Scope(Permission) required: ``internal_org_user_mgt_list``\n\n" + operationId: getUsersByPost + requestBody: + content: + application/scim+json: + schema: + $ref: '#/components/schemas/UserSearchRequestObject' + required: false + responses: + 200: + description: Valid users are found / Valid users are not found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/UserObjectListResponseObject' + 401: + description: Unauthorized + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUnauthorized' + 403: + description: Forbidden + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorForbidden' + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/scim2/Users/.search' \ + -H 'accept: application/scim+json' \ + -H 'Content-Type: application/scim+json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "schemas": [ + "urn:ietf:params:scim:api:messages:2.0:SearchRequest" + ], + "attributes": [ + "name.familyName", + "userName" + ], + "filter": "userName sw ki and name.familyName co err", + "domain": "PRIMARY", + "startIndex": 1, + "count": 10 + }' + x-codegen-request-body-name: body + /Users/{id}: + get: + tags: + - Users Endpoint + summary: Get User by ID + description: "Return user details if a user found.\n\n + + Scope(Permission) required: ``internal_org_user_mgt_view``\n\n" + operationId: getUser by id + parameters: + - name: id + in: path + description: Unique ID of the resource type. + required: true + schema: + type: string + - name: attributes + in: query + description: SCIM defined attributes parameter. + schema: + type: string + - name: excludedAttributes + in: query + description: SCIM defined excludedAttribute parameter. + schema: + type: string + responses: + 200: + description: Valid user is found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/UserResponseObject' + 401: + description: Unauthorized + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUnauthorized' + 403: + description: Forbidden + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorForbidden' + 404: + description: Valid user is not found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUserNotAvailable' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/scim2/Users/{user-id}' \ + -H 'accept: application/scim+json' \ + -H 'Authorization: Bearer {bearer_token}' + put: + tags: + - Users Endpoint + summary: Update User - PUT + description: "This API updates user details and return the updated user details using a PUT operation.\n\n + + Scope(Permission) required: ``internal_org_user_mgt_update``\n\n" + operationId: updateUser + parameters: + - name: id + in: path + description: Unique ID of the resource type. + required: true + schema: + type: string + - name: attributes + in: query + description: SCIM defined attributes parameter. + schema: + type: string + - name: excludedAttributes + in: query + description: SCIM defined excludedAttribute parameter. + schema: + type: string + requestBody: + content: + application/scim+json: + schema: + $ref: '#/components/schemas/UserUpdateObject' + required: false + responses: + 200: + description: Valid user is found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/UserResponseObject' + 401: + description: Unauthorized + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUnauthorized' + 403: + description: Forbidden + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorForbidden' + 404: + description: Valid user is not found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUserNotAvailable' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PUT' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/scim2/Users/{user-id}' \ + -H 'accept: application/scim+json' \ + -H 'Content-Type: application/scim+json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "schemas": [], + "name": { + "givenName": "Kim", + "familyName": "Berry" + }, + "userName": "DEFAULT/kim@gmail.com", + "emails": [ + { + "value": "kim@gmail.com", + "primary": true + } + ], + "urn:ietf:params:scim:schemas:extension:enterprise:2.0:User": { + "manager": { + "value": "Taylor" + } + } + }' + x-codegen-request-body-name: body + delete: + tags: + - Users Endpoint + summary: Delete User by ID + description: "This API deletes a user using the user's unique ID.\n\n + + Scope(Permission) required: ``internal_org_user_mgt_delete``\n\n" + operationId: deleteUser + parameters: + - name: id + in: path + description: Unique ID of the user that you want to delete. + required: true + schema: + type: string + responses: + 204: + description: User is deleted + content: {} + 401: + description: Unauthorized + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUnauthorized' + 403: + description: Forbidden + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorForbidden' + 404: + description: Valid user is not found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUserNotAvailable' + x-codeSamples: + - lang: Curl + source: | + curl -X 'DELETE' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/scim2/Users/{user-id}' \ + -H 'accept: */*' \ + -H 'Authorization: Bearer {bearer_token}' + patch: + tags: + - Users Endpoint + summary: Update User - PATCH + description: "This API updates user details and returns the updated user details using a PATCH operation.\n\n + + Scope(Permission) required: ``internal_org_user_mgt_update``\n\n + + Supported Operations:``add``, ``replace``, ``remove``\n\n" + operationId: patchUser + parameters: + - name: id + in: path + description: Unique id of the resource type. + required: true + schema: + type: string + - name: attributes + in: query + description: SCIM defined attributes parameter. + schema: + type: string + - name: excludedAttributes + in: query + description: SCIM defined excludedAttribute parameter. + schema: + type: string + requestBody: + content: + application/scim+json: + schema: + $ref: '#/components/schemas/PatchOperationInput' + required: false + responses: + 200: + description: Valid user is found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/UserResponseObject' + 401: + description: Unauthorized + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUnauthorized' + 403: + description: Forbidden + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorForbidden' + 404: + description: Valid user is not found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUserNotAvailable' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PATCH' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/scim2/Users/{user-id}' \ + -H 'accept: application/scim+json' \ + -H 'Content-Type: application/scim+json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "schemas": [ + "urn:ietf:params:scim:api:messages:2.0:PatchOp" + ], + "Operations": [ + { + "op": "add", + "value": { + "nickName": "shaggy" + } + } + ] + }' + x-codegen-request-body-name: body +components: + schemas: + UserObject: + title: Set a password for the user + required: + - password + type: object + properties: + schemas: + type: object + properties: {} + example: [] + name: + type: object + properties: + givenName: + type: string + description: The `givenName` you specify will be entered for the First Name attribute in the user's profile. + example: Kim + familyName: + type: string + description: The `familyName` you specify will be entered for the Last Name attribute in the user's profile. + example: Berry + userName: + type: string + description: By default, the username should be the email address and it will be stored in the `DEFAULT` user store. However, if username validation is changed to `Alphanumeric` in your Asgardeo organization, you need to specify an alphanumeric value (a-z, A-Z, 0-9) as the username instead of the email. + example: DEFAULT/kim@gmail.com + password: + type: string + description: Use this parameter to set a password for the user account. The user will be able to reset this password later. When setting the password, be sure to follow the password-validation rules configured for your organization. + example: aBcd!23# + emails: + type: array + description: This email will be entered for the Email attribute in the user's profile. + example: + - value: kim@gmail.com + primary: true + items: + type: object + properties: {} + urn:ietf:params:scim:schemas:extension:enterprise:2.0:User: + type: object + properties: + manager: + type: object + properties: + value: + type: string + example: Taylor + urn:scim:wso2:schema: + type: object + properties: + verifyEmail: + type: boolean + description: When the administrator sets the password for the new user account, this parameter specifies if the new user should confirm the new account through email. If this parameter is set to `true`, an email is sent to the user's email address requesting confirmation. + example: true + UserObjectPassInvite: + title: Invite the user to set their own password + type: object + properties: + schemas: + type: object + properties: {} + example: [] + name: + type: object + properties: + givenName: + type: string + description: The `givenName` you specify will be entered for the First Name attribute in the user's profile. + example: Kim + familyName: + type: string + description: The `familyName` you specify will be entered for the Last Name attribute in the user's profile. + example: Berry + userName: + type: string + description: By default, the username should be the email address and it will be stored in the `DEFAULT` user store. However, if username validation is changed to `Alphanumeric` in your Asgardeo organization, you need to specify an alphanumeric value (a-z, A-Z, 0-9) as the username instead of the email. + example: DEFAULT/kim@gmail.com + emails: + type: array + description: This email will be entered for the Email attribute in the user's profile. + example: + - value: kim@gmail.com + primary: true + items: + type: object + properties: {} + urn:ietf:params:scim:schemas:extension:enterprise:2.0:User: + type: object + properties: + manager: + type: object + properties: + value: + type: string + example: Taylor + urn:scim:wso2:schema: + type: object + properties: + askPassword: + type: boolean + description: If this parameter is set to `true`, users will be allowed configure their own password. An email is sent to the specified email address, which will have instructions for the user to set the password and confirm the new user account. + example: true + UserResponseObject: + required: + - meta + type: object + properties: + meta: + type: object + properties: + created: + type: string + example: 2018-08-17T10:34:29Z + location: + type: string + example: https://api.asgardeo.io/t/{root-organization-name}/o/scim2/Users/008bba85-451d-414b-87de-c03b5a1f4217 + lastModified: + type: string + example: 2018-08-17T10:34:29Z + resourceType: + type: string + example: User + schemas: + type: object + properties: {} + example: + - urn:ietf:params:scim:schemas:core:2.0:User + - urn:ietf:params:scim:schemas:extension:enterprise:2.0:User + username: + type: string + example: DEFAULT/kim@gmail.com + id: + type: string + example: 008bba85-451d-414b-87de-c03b5a1f4217 + name: + type: object + properties: + givenName: + type: string + example: Kim + familyName: + type: string + example: Berry + emails: + type: array + example: + - kim@gmail.com + items: + type: object + properties: {} + urn:ietf:params:scim:schemas:extension:enterprise:2.0:User: + type: object + properties: + manager: + type: object + properties: + value: + type: string + example: Taylor + roles: + type: object + properties: {} + example: + - type: default + value: Internal/everyone + UserUpdateObject: + type: object + properties: + schemas: + type: object + properties: {} + example: [] + name: + type: object + properties: + givenName: + type: string + example: Kim + familyName: + type: string + example: Berry + userName: + type: string + example: DEFAULT/kim@gmail.com + emails: + type: array + example: + - value: kim@gmail.com + primary: true + items: + type: object + properties: {} + urn:ietf:params:scim:schemas:extension:enterprise:2.0:User: + type: object + properties: + manager: + type: object + properties: + value: + type: string + example: Taylor + PatchOperationInput: + type: object + properties: + schemas: + type: array + items: + type: object + example: urn:ietf:params:scim:api:messages:2.0:PatchOp + Operations: + type: array + items: + $ref: '#/components/schemas/OperationMeItem' + OperationMeItem: + type: object + properties: + op: + type: string + enum: + - add + - remove + - replace + value: + type: object + properties: + nickName: + type: string + example: shaggy + UserObjectListResponseObject: + type: object + properties: + totalResults: + type: integer + example: 1 + startIndex: + type: integer + example: 1 + itemsPerPage: + type: integer + example: 1 + schemas: + type: object + properties: {} + example: + - urn:ietf:params:scim:api:messages:2.0:ListResponse + Resources: + type: array + items: + $ref: '#/components/schemas/UserResponseObject' + UserSearchRequestObject: + type: object + example: + schemas: + - urn:ietf:params:scim:api:messages:2.0:SearchRequest + attributes: + - name.familyName + - userName + filter: userName sw ki and name.familyName co err + domain: PRIMARY + startIndex: 1 + count: 10 + ErrorInvalidInput: + required: + - detail + - status + type: object + properties: + status: + type: string + example: "400" + schemas: + type: string + example: urn:ietf:params:scim:api:messages:2.0:Error + scimType: + type: string + example: invalidSyntax + detail: + type: string + example: Request is unparsable, syntactically incorrect, or violates schema. + ErrorUnauthorized: + required: + - status + type: object + properties: + schemas: + type: string + example: urn:ietf:params:scim:api:messages:2.0:Error + detail: + type: string + example: "Authorization failure. Authorization information was invalid or missing from your request." + status: + type: string + example: "401" + ErrorForbidden: + required: + - status + type: object + properties: + schemas: + type: string + example: urn:ietf:params:scim:api:messages:2.0:Error + detail: + type: string + example: "Operation is not permitted. You do not have permission to make this request." + status: + type: string + example: "403" + ErrorUserNotAvailable: + required: + - detail + - status + type: object + properties: + status: + type: string + example: "404" + schemas: + type: string + example: urn:ietf:params:scim:api:messages:2.0:Error + detail: + type: string + example: 'No user with the id : 008bba85-451d-414b-87de-c03b5a1f4217 in + the user store.' + ErrorInternalServerError: + required: + - detail + - status + type: object + properties: + status: + type: string + example: "500" + schemas: + type: string + example: urn:ietf:params:scim:api:messages:2.0:Error + detail: + type: string + example: Internal Server Error. + securitySchemes: + OAuth2: + type: oauth2 + description: "**Authorization code OAuth flow** + **Organization Switch**" diff --git a/docusaurus-asgardeo/static/apis/organization-apis/restapis/org-user-store.yaml b/docusaurus-asgardeo/static/apis/organization-apis/restapis/org-user-store.yaml new file mode 100644 index 0000000000..53230cedfe --- /dev/null +++ b/docusaurus-asgardeo/static/apis/organization-apis/restapis/org-user-store.yaml @@ -0,0 +1,900 @@ +openapi: 3.0.0 +info: + description: > + This document specifies the **Userstore Management RESTful API** for Asgardeo organizations. + version: "v1" + title: Asgardeo - UserStore Management Rest API + +security: + - OAuth2: [] +paths: + /userstores: + post: + tags: + - User Store + summary: Add a secondary user store. + operationId: addUserStore + description: | + This API provides the capability to add a secondary user store. + + **NOTE:** + + To retrieve the available user store classes/types, use the **/o/api/server/v1/userstores/meta/types** API. + + When creating a user store, it will be **disabled by default**. To enable the user store, include the `disabled` property set to `false` in the properties of the payload. + + + Scope(Permission) required: `internal_org_userstore_create` + responses: + '201': + description: Successful response + headers: + Location: + description: >- + Location of the newly created secondary user store. userstore id is generated as base-64-url-encoded(domain-name) value. + schema: + type: string + content: + application/json: + schema: + $ref: '#/components/schemas/UserStoreResponse' + '400': + $ref: '#/components/responses/InvalidInput' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '409': + $ref: '#/components/responses/Conflict' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/userstores' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -H 'Content-Type: application/json' \ + -d '{ + "typeId": "VW5pcXVlSURKREJDVXNlclN0b3JlTWFuYWdlcg", + "description": "Some description about the user store.", + "name": "LDAP-SECONDARY", + "properties": [ + { + "name": "some property name", + "value": "some property value" + } + ] + }' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/UserStoreReq' + description: Secondary user store to add. + get: + tags: + - User Store + summary: Retrieve the list of secondary user stores + operationId: getSecondaryUserStores + description: | + This API provides the capability to list the configured secondary user stores.
    + + Scope(Permission) required: `internal_org_userstore_view` + parameters: + - $ref: '#/components/parameters/limitQueryParam' + - $ref: '#/components/parameters/offsetQueryParam' + - $ref: '#/components/parameters/filterQueryParam' + - $ref: '#/components/parameters/sortQueryParam' + - $ref: '#/components/parameters/requiredAttributesQueryParam' + responses: + '200': + description: Successful response. + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/UserStoreListResponse' + '401': + $ref: '#/components/responses/Unauthorized' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + '501': + $ref: '#/components/responses/NotImplemented' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/userstores' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + /userstores/{userstore-domain-id}: + get: + tags: + - User Store + summary: >- + Retrieve the configurations of secondary user store based on its domain id + operationId: getUserStoreByDomainId + description: | + This API provides the capability to retrieve the configurations of + a secondary user store based on its domain id.
    + + Scope(Permission) required: `internal_org_userstore_view` + parameters: + - $ref: '#/components/parameters/domainNamePathParam' + responses: + '200': + description: Successful response. + content: + application/json: + schema: + $ref: '#/components/schemas/UserStoreConfigurationsRes' + '401': + $ref: '#/components/responses/Unauthorized' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/userstores/{userstore-domain-id}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + delete: + tags: + - User Store + summary: Delete a secondary user store + operationId: deleteUserStore + description: | + This API provides the capability to delete a secondary user store based on + matching to the given user store domain id.
    + + Scope(Permission) required: `internal_org_userstore_delete` + parameters: + - $ref: '#/components/parameters/domainNamePathParam' + responses: + '204': + $ref: '#/components/responses/NoContent' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X 'DELETE' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/userstores/{userstore-domain-id}' \ + -H 'accept: */*' \ + -H 'Authorization: Bearer {bearer_token}' + put: + tags: + - User Store + summary: Update a user store by its domain id + operationId: updateUserStore + description: | + This API provides the capability to edit a user store based on its + domain id
    + + Scope(Permission) required: `internal_org_userstore_update` + parameters: + - in: path + name: userstore-domain-id + required: true + description: Current domain id of the user store + schema: + type: string + example: SkRCQy1TRUNPTkRBUlk + responses: + '200': + description: Successful response. + content: + application/json: + schema: + $ref: '#/components/schemas/UserStoreResponse' + '400': + $ref: '#/components/responses/InvalidInput' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PUT' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/userstores/{userstore-domain-id}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -H 'Content-Type: application/json' \ + -d '{ + "typeId": "VW5pcXVlSURKREJDVXNlclN0b3JlTWFuYWdlcg", + "description": "Some description about the user store.", + "name": "LDAP-SECONDARY", + "properties": [ + { + "name": "some property name", + "value": "some property value" + } + ] + }' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/UserStoreReq' + description: >- + The secondary user store values which are needed to be edited for a + given domain id. + patch: + tags: + - User Store + summary: Patch the secondary user store by it's domain id + operationId: patchUserStore + description: | + This API provides the capability to update the secondary user store's + property using patch request by using its domain id. + + Scope(Permission) required: `internal_org_userstore_update` + parameters: + - $ref: '#/components/parameters/domainNamePathParam' + responses: + '200': + description: Successful response. + content: + application/json: + schema: + $ref: '#/components/schemas/UserStoreResponse' + '400': + $ref: '#/components/responses/InvalidInput' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PATCH' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/userstores/userstore-domain-id' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -H 'Content-Type: application/json' \ + -d '[ + { + "operation": "REPLACE", + "path": "/properties/Disabled", + "value": "true" + } + ]' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchRequest' + required: true + /userstores/{userstore-domain-id}/attribute-mappings: + patch: + tags: + - User Store + summary: Update the secondary user store attribute mappings by it's domain id. + operationId: updateAttributeMappings + description: | + This API provides the capability to update the secondary user store's attribute mappings using patch request by using its domain id.
    + + Scope(Permission) required: `internal_org_userstore_update` + parameters: + - $ref: '#/components/parameters/domainNamePathParam' + responses: + '200': + $ref: '#/components/responses/OK' + '400': + $ref: '#/components/responses/InvalidInput' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/AttributeMappingsReq' + required: true + x-codeSamples: + - lang: Curl + source: | + curl --location --request PATCH 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/userstores/{userstore-domain-id}/attribute-mappings' \ + -H 'Content-Type: application/json' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '[ + { + "claimURI": "http://wso2.org/claims/username", + "mappedAttribute": "username" + } + ]' + /userstores/meta/types: + get: + tags: + - Meta + summary: Retrieve the available user store classes/types + operationId: getAvailableUserStoreTypes + description: | + This API provides the capability to retrieve the available user store + types
    + + Scope(Permission) required: `internal_org_userstore_view` + responses: + '200': + description: Successful Response. + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/AvailableUserStoreClassesRes' + '401': + $ref: '#/components/responses/Unauthorized' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/userstores/meta/types' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + /userstores/meta/types/{type-id}: + get: + tags: + - Meta + summary: >- + Retrieve the properties of secondary user store of a given user store type + operationId: getUserStoreManagerProperties + description: | + This API provides the capability to retrieve the properties of secondary + user store of a given class name.
    + + Scope(Permission) required: `internal_org_userstore_view` + parameters: + - in: path + name: type-id + required: true + description: Id of the user store type + schema: + type: string + responses: + '200': + description: Successful response. + content: + application/json: + schema: + $ref: '#/components/schemas/MetaUserStoreType' + '400': + $ref: '#/components/responses/InvalidInput' + '401': + $ref: '#/components/responses/Unauthorized' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + '501': + $ref: '#/components/responses/NotImplemented' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/userstores/meta/types/{user-store-type-id}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + /userstores/meta/types/{type-id}/attributes: + get: + tags: + - Meta + summary: >- + Retrieve the meta attributes of a user store of a given user store type. + operationId: getUserStoreAttributeMappings + description: | + This API provides the capability to retrieve the attribute mappings + of a given user store type.
    + + Scope(Permission) required: `internal_org_userstore_view` + parameters: + - in: path + name: type-id + required: true + description: Id of the user store type + schema: + type: string + - $ref: '#/components/parameters/includeIdentityClaimsQueryParam' + responses: + '200': + description: Successful Response. + content: + application/json: + schema: + $ref: '#/components/schemas/UserStoreAttributeMappingResponse' + '400': + $ref: '#/components/responses/InvalidInput' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/userstores/meta/types/{user-store-type-id}/attributes' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' +servers: + - url: 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1' +components: + parameters: + domainNamePathParam: + name: userstore-domain-id + in: path + required: true + description: The unique name of the user store domain + schema: + type: string + example: SkRCQy1TRUNPTkRBUlk + includeIdentityClaimsQueryParam: + in: query + name: includeIdentityClaimMappings + required: false + description: Whether to include the identity claim mappings with user store attributes. + example: true + schema: + type: boolean + limitQueryParam: + in: query + name: limit + required: false + description: maximum number of records to return + schema: + type: integer + format: int32 + offsetQueryParam: + in: query + name: offset + required: false + description: number of records to skip for pagination + schema: + type: integer + format: int32 + filterQueryParam: + in: query + name: filter + required: false + description: Condition to filter the retrieval of records. + schema: + type: string + sortQueryParam: + in: query + name: sort + required: false + description: Define the order of how the retrieved records should be sorted. + schema: + type: string + requiredAttributesQueryParam: + in: query + name: requiredAttributes + required: false + description: Define set of user store attributes (as comma separated) to be returned. + schema: + type: string + fileTypeHeaderParam: + in: header + name: Accept + required: false + description: | + Content type of the file. + schema: + type: string + default: application/yaml + enum: + - application/json + - application/xml + - application/yaml + - application/x-yaml + - text/yaml + - text/xml + - text/json + responses: + NotFound: + description: The specified resource is not found. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + Unauthorized: + description: Unauthorized. + ServerError: + description: Internal Server Error. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + NotImplemented: + description: Not Implemented. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + InvalidInput: + description: Invalid input request. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + Conflict: + description: Element Already Exists. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + Deleted: + description: Item Deleted + Created: + description: User Store Created. + OK: + description: OK. + Success: + description: Connection Established. + NoContent: + description: No Content. + Forbidden: + description: Resource Forbidden. + securitySchemes: + OAuth2: + type: oauth2 + flows: + authorizationCode: + authorizationUrl: 'https://api.asgardeo.io/t/{root-organization-name}/oauth/authorize' + tokenUrl: 'https://api.asgardeo.io/t/{root-organization-name}/oauth/token' + schemas: + UserStoreReq: + type: object + required: + - typeId + - description + - name + - properties + description: Secondary user store request. + properties: + typeId: + type: string + description: The id of the user store manager class type. + example: VW5pcXVlSURKREJDVXNlclN0b3JlTWFuYWdlcg + description: + type: string + description: Description of the user store. + example: Some description about the user store. + name: + type: string + description: This is a unique name that identifies the user store. + example: LDAP-SECONDARY + properties: + type: array + description: >- + Various properties related to the user store such as connection URL, + connection password etc. + items: + $ref: '#/components/schemas/Property' + claimAttributeMappings: + type: array + description: Claim attribute mappings. + items: + $ref: '#/components/schemas/ClaimAttributeMapping' + PatchRequest: + type: array + items: + $ref: '#/components/schemas/PatchDocument' + PatchDocument: + description: A JSONPatch document as defined by RFC 6902 + required: + - operation + - path + properties: + operation: + type: string + description: The operation to be performed + enum: + - ADD + - REMOVE + - REPLACE + example: REPLACE + path: + type: string + description: A JSON-Pointer + example: /properties/Disabled + value: + type: string + description: The value to be used within the operations + example: 'true' + ClaimAttributeMapping: + type: object + required: + - claimURI + - mappedAttribute + properties: + claimURI: + type: string + description: A unique URI specific to the claim. + example: "http://wso2.org/claims/username" + mappedAttribute: + type: string + description: Userstore attribute to be mapped to. + example: "username" + AttributeMappingsReq: + type: array + description: Array of ClaimURI attribute mappings. + items: + $ref: '#/components/schemas/ClaimAttributeMapping' + Error: + type: object + required: + - code + - message + properties: + code: + type: string + example: AAA-00000 + message: + type: string + example: Some Error Message + description: + type: string + example: Some Error Description + Property: + type: object + required: + - name + - value + properties: + name: + type: string + example: some property name + value: + type: string + example: some property value + UserStoreListResponse: + type: object + properties: + id: + type: string + example: SkRCQy1TRUNPTkRBUlk + description: base64 url encoded value of domain name + name: + type: string + example: LDAP-SECONDARY + description: Domain name of the secondary user store. + enabled: + type: boolean + example: true + description: Enabled status of the userstore. + description: + type: string + example: Some description of the user store + isLocal: + type: boolean + example: true + description: Whether the user store is local or not. + self: + type: string + example: /t/{root-organization-name}/o/api/server/v1/userstores/SkRCQy1TRUNPTkRBUlk + description: Location of the created/updated resource. + typeName: + type: string + example: UniqueIDJDBCUserStoreManager + description: User store type name. + properties: + type: array + description: Requested configured user store property for the set + items: + $ref: '#/components/schemas/AddUserStorePropertiesRes' + MetaUserStoreType: + type: object + properties: + typeName: + type: string + example: UniqueIDJDBCUserStoreManager + typeId: + type: string + example: b3JnLndzbzIuY2FyYm9uLnVzZXIuY29yZS5qZGJjLkpEQkNVc2VyU3RvcmVNYW5hZ2Vy + isLocal: + type: boolean + example: true + description: Whether the user store is local or not. + properties: + $ref: '#/components/schemas/UserStorePropertiesRes' + UserStoreResponse: + type: object + properties: + id: + type: string + example: SkRCQy1TRUNPTkRBUlk= + description: base64 url encoded value of domain name + name: + type: string + example: LDAP-SECONDARY + description: domain name of the secondary user store + typeName: + type: string + example: UniqueIDJDBCUserStoreManager + typeId: + type: string + example: VW5pcXVlSURKREJDVXNlclN0b3JlTWFuYWdlcg + description: + type: string + example: Some description of the user store + properties: + type: array + description: Configured user store proper for the set. + items: + $ref: '#/components/schemas/AddUserStorePropertiesRes' + claimAttributeMappings: + type: array + description: Configured user store claim attribute mappings + items: + $ref: '#/components/schemas/ClaimAttributeMapping' + AvailableUserStoreClassesRes: + type: object + description: Available User Store Classes Response. + properties: + typeId: + type: string + example: VW5pcXVlSURKREJDVXNlclN0b3JlTWFuYWdlcg + typeName: + type: string + example: UniqueIDJDBCUserStoreManager + isLocal: + type: boolean + example: true + description: Whether the user store is local or not. + self: + type: string + example: /t/{root-organization-name}/o/api/server/v1/userstores/meta/types/VW5pcXVlSURKREJDVXNlclN0b3JlTWFuYWdlcg + UserStoreConfigurationsRes: + type: object + description: Available User Store Configurations Response. + properties: + typeName: + type: string + example: UniqueIDJDBCUserStoreManager + typeId: + type: string + example: VW5pcXVlSURKREJDVXNlclN0b3JlTWFuYWdlcg + name: + type: string + example: LDAP-SECONDARY + description: + type: string + example: Some description of the user store + isLocal: + type: boolean + example: true + description: Whether the user store is local or not. + properties: + type: array + description: Configured user store property for the set + items: + $ref: '#/components/schemas/AddUserStorePropertiesRes' + claimAttributeMappings: + type: array + description: Requested configured user store claim attribute mappings. + items: + $ref: '#/components/schemas/ClaimAttributeMapping' + AddUserStorePropertiesRes: + type: object + description: Available User Store Properties. + required: + - name + - value + properties: + name: + type: string + example: ConnectionName + value: + type: string + example: 'CN=,DC=' + UserStorePropertiesRes: + properties: + Mandatory: + type: array + items: + $ref: '#/components/schemas/PropertiesRes' + Optional: + type: array + items: + $ref: '#/components/schemas/PropertiesRes' + Advanced: + type: array + items: + $ref: '#/components/schemas/PropertiesRes' + PropertiesRes: + type: object + properties: + name: + type: string + example: Some Mandatory Property Name + defaultValue: + type: string + example: Some Mandatory Property Value + description: + type: string + example: Description of the property + attributes: + type: array + items: + $ref: '#/components/schemas/Attribute' + Attribute: + type: object + properties: + name: + type: string + example: category + value: + type: string + example: basic + UserStoreAttributeMappingResponse: + type: object + properties: + typeName: + type: string + description: Type name of the user store. + example: org.wso2.carbon.user.core.ldap.UniqueIDActiveDirectoryUserStoreManager + typeId: + type: string + description: Type id of the user store. + example: b3JnLndzbzIuY2FyYm9uLnVzZXIuY29yZS5qZGJjLkpEQkNVc2VyU3RvcmVNYW5hZ2Vy + isLocal: + type: boolean + description: Whether the user store is local or not. + example: true + attributeMappings: + type: array + description: User store attribute mappings. + items: + $ref: '#/components/schemas/UserStoreAttributeResponse' + UserStoreAttributeResponse: + type: object + properties: + claimId: + type: string + description: Claim id of the attribute. + example: bzIuY2FyYm9uLnVzZXIuY29yZS5qZG + claimURI: + type: string + description: Claim URI of the attribute. + example: http://wso2.org/claims/givenname + mappedAttribute: + type: string + description: Mapped attribute name. + example: givenName + displayName: + type: string + description: Display name of the attribute. + example: First Name diff --git a/docusaurus-asgardeo/static/apis/organization-apis/restapis/organization-discovery.yaml b/docusaurus-asgardeo/static/apis/organization-apis/restapis/organization-discovery.yaml new file mode 100644 index 0000000000..07e32f1daf --- /dev/null +++ b/docusaurus-asgardeo/static/apis/organization-apis/restapis/organization-discovery.yaml @@ -0,0 +1,223 @@ +openapi: 3.0.0 +info: + version: "v1" + title: 'Organization Discovery API' + description: | + This document specifies an **Organization level Organization Discovery RESTful API** for Asgardeo. +servers: + - url: 'https://api.asgardeo.io/t/{organization-name}/o/api/server/v1' + variables: + tenant-domain: + default: carbon.super +security: + - OAuth2: [] + +paths: + /organizations/check-discovery: + post: + tags: + - Organization Discovery + summary: Check whether given discovery attribute exists among the organization hierarchy. + description: | + This API is used to verify whether a specific discovery attribute has already been associated with an organization within the hierarchy. It is available for use within any organization in the hierarchy. + + Scope(Permission) required: `internal_org_organization_discovery_view` + operationId: organizationCheckDiscovery + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationDiscoveryCheckPOSTRequest' + required: true + responses: + '200': + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationDiscoveryCheckPOSTResponse' + '404': + $ref: '#/components/responses/NotFound' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{organization-name}/o/api/server/v1/organizations/check-discovery' \ + -H 'Content-Type: application/json' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "type": "emailDomain", + "value": "abc.com" + }' + x-codegen-request-body-name: body +components: + parameters: + filterQueryParam: + in: query + name: filter + required: false + description: + Condition to filter the retrieval of records. + schema: + type: string + limitQueryParam: + in: query + name: limit + required: false + description: + Maximum number of records to be returned. (Should be greater than 0) + schema: + type: integer + format: int32 + minimum: 0 + offsetQueryParam: + in: query + name: offset + required: false + description: Number of records to skip for pagination. + schema: + type: integer + format: int32 + minimum: 0 + beforeQueryParam: + in: query + name: before + required: false + description: + Points to the previous range of data that can be retrieved. + schema: + type: string + afterQueryParam: + in: query + name: after + required: false + description: + Points to the next range of data to be returned. + schema: + type: string + recursiveQueryParam: + in: query + name: recursive + required: false + description: + Determines whether a recursive search should happen. + schema: + type: boolean + default: false + showChildrenQueryParam: + in: query + name: showChildren + required: false + description: + Returns the organization details along with the child organization IDs belonging to this organization. + schema: + type: boolean + default: false + includePermissionsQueryParam: + in: query + name: includePermissions + required: false + description: + Returns the organization details along with permissions assigned for the requested user in this organization. + schema: + type: boolean + default: false + + schemas: + Error: + type: object + required: + - code + - message + properties: + code: + type: string + example: ORG-00000 + description: An error code. + message: + type: string + example: Some Error Message + description: An error message. + description: + type: string + example: Some Error Description + description: An error description. + traceId: + type: string + example: e0fbcfeb-3617-43c4-8dd0-7b7d38e13047 + description: An error trace identifier. + OrganizationDiscoveryCheckPOSTRequest: + required: + - type + - value + type: object + properties: + type: + type: string + example: 'emailDomain' + value: + type: string + example: 'abc.com' + OrganizationDiscoveryCheckPOSTResponse: + type: object + required: + - available + properties: + available: + type: boolean + example: true + #-------------------------------------------------------- + # Descriptions of Organization Management API responses. + #-------------------------------------------------------- + responses: + BadRequest: + description: Invalid input in the request. + content: + 'application/json': + schema: + $ref: '#/components/schemas/Error' + NotFound: + description: Requested resource is not found. + content: + 'application/json': + schema: + $ref: '#/components/schemas/Error' + Unauthorized: + description: Authentication information is missing or invalid. + Forbidden: + description: Access forbidden. + ServerError: + description: Internal server error. + content: + 'application/json': + schema: + $ref: '#/components/schemas/Error' + NotImplemented: + description: Not Implemented. + content: + 'application/json': + schema: + $ref: '#/components/schemas/Error' + OrgNotFound: + description: Organization Not Found + OrgExist: + description: Organization Exist + #----------------------------------------------------- + # Applicable authentication mechanisms. + #----------------------------------------------------- + securitySchemes: + OAuth2: + type: oauth2 + flows: + authorizationCode: + authorizationUrl: 'https://api.asgardeo.io/t/{organization-name}/oauth2/authorize' + tokenUrl: 'https://api.asgardeo.io/t/{organization-name}/oauth2/token' + scopes: {} \ No newline at end of file diff --git a/docusaurus-asgardeo/static/apis/organization-apis/restapis/organization-user-invitation.yaml b/docusaurus-asgardeo/static/apis/organization-apis/restapis/organization-user-invitation.yaml new file mode 100644 index 0000000000..b3db294df5 --- /dev/null +++ b/docusaurus-asgardeo/static/apis/organization-apis/restapis/organization-user-invitation.yaml @@ -0,0 +1,740 @@ +openapi: 3.0.0 +info: + version: "v1" + title: "Asgardeo - Parent Organization's User Invitation API" + description: |- + This document specifies an **Parent Organization's User Invitation RESTful API** for **Asgardeo**. This API allows organization administrators to invite users in parent organization, manage the invitations and invitees to accept the invitation. + +security: + - OAuth2: [] + +servers: + - url: 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1' + variables: + server-url: + default: https://api.asgardeo.io/t/{root-organization-name}/o/ + root-organization-name: + default: "{root-organization-name}" + +paths: + /guests/invite: + post: + tags: + - Parent Organization User Invitation + summary: Invite a parent organization user to a child organization + description: | + Initiates an invitation to a user in the parent organization to onboard to the child organization. + This will be initiated from the child organization. + + Scope(Permission) required: `internal_org_guest_mgt_invite_add` + operationId: invitationTriggerPost + requestBody: + $ref: '#/components/requestBodies/InvitationRequestPayload' + responses: + '201': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/InvitationSuccessListResponse' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Internal Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/guests/invite' \ + -H 'Accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "usernames": [ + "xyz@gmail.com", + "abc@gmail.com" + ], + "roles": [ + "f5b761ca-62f2-48ba-935b-f7b460f58e5c", + "657fgq22-62f2-48ba-935b-f7bfgh6438fd" + ], + "groups": [ + "48badf-rty20-48ba-935b-f7b460f58e5c", + "fd234100-c115-45dc-ad11-70846b783866" + ], + "properties": [ + { + "key": "manageNotificationsInternally", + "value": "true" + } + ] + }' + x-codegen-request-body-name: body + /guests/invitation/introspect: + post: + tags: + - Parent Organization User Invitation + summary: introspect an invitation's confirmation code + description: | + This API can be used to introspect the confirmation code. This will be + invoked from the application with the access token of the user which + was logged into the application and switched to the organization where + the user resides in. + + Scope(Permission) required: `internal_org_guest_mgt_invite_list` + operationId: invitationIntrospectPost + requestBody: + $ref: '#/components/requestBodies/IntrospectRequestPayload' + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/IntrospectSuccessResponse' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '403': + description: Forbidden + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Internal Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/guests/invitation/introspect' \ + -H 'Accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "confirmationCode": "2663329b-c8c5-4c71-9500-9ea8c4e77d94" + }' + x-codegen-request-body-name: body + /guests/invitation/accept: + post: + tags: + - Parent Organization User Invitation + summary: Accepts an invitation from a user in the parent organization + description: | + After user clicks on the link provided, the redirected application should invoke this API. + This API is a public API and this should be invoked with the confirmation code which is + appended to the notification. + + Scope(Permission) required: None + operationId: invitationAcceptPost + requestBody: + $ref: '#/components/requestBodies/AcceptanceRequestPayload' + responses: + '204': + description: No Content + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Internal Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/guests/invitation/accept' \ + -H 'Accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "confirmationCode": "2663329b-c8c5-4c71-9500-9ea8c4e77d94" + }' + x-codegen-request-body-name: body + /guests/invitations: + get: + tags: + - Invitation Management + summary: List down the user invitations + description: | + List down the invitations triggered from the current organization. This should be invoked + from an access token issued from an administrator of that organization. + + Scope(Permission) required: `internal_org_guest_mgt_invite_list` + operationId: invitationListGet + parameters: + - $ref: '#/components/parameters/FilterQueryParam' + - $ref: '#/components/parameters/LimitQueryParam' + - $ref: '#/components/parameters/OffsetQueryParam' + - $ref: '#/components/parameters/sortOrderQueryParam' + - $ref: '#/components/parameters/sortByQueryParam' + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/InvitationsListResponse' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '403': + description: Forbidden + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Internal Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/guests/invitations' \ + -H 'Accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '' + /guests/invitations/{invitationId}: + delete: + tags: + - Invitation Management + summary: Delete an invitation + description: | + Based on the requirements the invitations which are initiated by the same organization + can be deleted. This should be invoked from an access token issued from an administrator of that organization. + + Scope(Permission) required: `internal_org_guest_mgt_invite_delete` + operationId: invitationDelete + parameters: + - name: invitationId + in: path + description: ID of the invitation to delete + required: true + schema: + type: string + example: 2d88a90a-3060-46f0-b863-fc481fef8137 + responses: + '204': + description: Successful Response and if the resource not found + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '403': + description: Forbidden + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Internal Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location --request DELETE 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/guests/invitations/{invitationId}'\ + -H 'Accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '' +components: + requestBodies: + InvitationRequestPayload: + description: Details that need to initiate an invitation + content: + application/json: + schema: + $ref: '#/components/schemas/InvitationRequestBody' + required: true + IntrospectRequestPayload: + description: Details that need to introspect an invitation + content: + application/json: + schema: + $ref: '#/components/schemas/IntrospectRequestBody' + required: true + AcceptanceRequestPayload: + description: Details that need to confirm an invitation + content: + application/json: + schema: + $ref: '#/components/schemas/AcceptanceRequestBody' + required: true + parameters: + FilterQueryParam: + in: query + name: filter + required: false + description: Filtering the invitation based on the status. Status can be PENDING or EXPIRED. + schema: + type: string + example: status eq PENDING + LimitQueryParam: + in: query + name: limit + required: false + description: | + Maximum number of records to return + _This parameter is not supported yet._ + schema: + type: integer + example: 10 + OffsetQueryParam: + in: query + name: offset + required: false + description: | + Starting index of the pagination + _This parameter is not supported yet._ + schema: + type: integer + example: 0 + sortOrderQueryParam: + in: query + name: sortOrder + required: false + description: | + Sort order of the returned records. Either ASC or DESC + _This parameter is not supported yet._ + schema: + type: string + enum: + - ASC + - DESC + sortByQueryParam: + in: query + name: sortBy + required: false + description: | + Sort by a specific field + _This parameter is not supported yet._ + schema: + type: string + example: createdTime + schemas: + InvitationRequestBody: + type: object + required: + - usernames + properties: + usernames: + type: array + description: List of usernames of the users who will be invited to the organization. This can be an email or an alphanumeric username. + items: + type: string + example: + - xyz@gmail.com + - abc@gmail.com + userDomain: + type: string + description: Userstore domain of the inviting user in the parent organization. If not provided, DEFAULT userstore will be used by default. + example: DEFAULT + roles: + type: array + description: Role assignments which the user will be assigned to. + items: + type: string + example: + - f5b761ca-62f2-48ba-935b-f7b460f58e5c + - 657fgq22-62f2-48ba-935b-f7bfgh6438fd + groups: + type: array + description: Group assignments which the user will be assigned to. + items: + type: string + example: + - 48badf-rty20-48ba-935b-f7b460f58e5c + - fd234100-c115-45dc-ad11-70846b783866 + properties: + type: array + description: Custom properties of invitation which can be used in runtime but doesn't + persist as invitation information. + items: + $ref: '#/components/schemas/Property' + example: + { + "usernames": [ + "xyz@gmail.com", + "abc@gmail.com" + ], + "roles": [ + "f5b761ca-62f2-48ba-935b-f7b460f58e5c", + "657fgq22-62f2-48ba-935b-f7bfgh6438fd" + ], + "groups": [ + "48badf-rty20-48ba-935b-f7b460f58e5c", + "fd234100-c115-45dc-ad11-70846b783866" + ], + "properties": [ + { + "key" : "manageNotificationsInternally", + "value" : "true" + } + ] + } + InvitationSuccessListResponse: + type: array + items: + $ref: '#/components/schemas/InvitationSuccessResponse' + example: + [ + { + "username": "xyz@gmail.com", + "result": { + "status": "Failed", + "errorCode": "OUI-10018", + "errorMessage": "Invitation already exists.", + "errorDescription": "An active invitation already exists for the user." + } + }, + { + "username": "abc@gmail.com", + "result": { + "status": "Successful" + } + } + ] + InvitationSuccessResponse: + type: object + required: + - username + - result + properties: + username: + type: string + description: Username of the user who will be invited to the organization. This can be an + email or an alphanumeric username. + example: alex@gmail.com/alex + result: + type: object + description: Role assignments which the user will be assigned to. + properties: + status: + type: string + example: Successful/Failed + errorCode: + type: string + example: OUI-00000 + errorMessage: + type: string + example: Some Error Message + errorDescription: + type: string + example: Some Error Description + confirmationCode: + type: string + description: Confirmation code for the invitation when internally managed notifications are disabled. + example: "3363329b-c8c5-4c71-9500-9ea8c4e77d45" + IntrospectRequestBody: + type: object + required: + - confirmationCode + properties: + confirmationCode: + type: string + example: 2663329b-c8c5-4c71-9500-9ea8c4e77d94 + IntrospectSuccessResponse: + type: object + required: + - confirmationCode + - username + - userOrganization + - initiatedOrganization + - status + properties: + confirmationCode: + type: string + description: Confirmation code of the invitation which needs to be introspected. + example: 2663329b-c8c5-4c71-9500-9ea8c4e77d94 + username: + type: string + description: Username of the user who will be invited to the organization. This can be an + email or an alphanumeric username. + example: alex@gmail.com/alex + userOrganization: + type: string + description: Organization which the user is residing. + example: 8763329b-c8c5-4c71-9500-9ea8c4e77345 + initiatedOrganization: + type: string + description: Organization which the invitation is initiated. + example: 1239329b-c8c5-4c71-9500-9ea8c4e70987 + status: + type: string + description: Status of the invitation. + example: PENDING/EXPIRED + example: + { + "confirmationCode": "2663329b-c8c5-4c71-9500-9ea8c4e77d94", + "username": "abc@gmail.com", + "userOrganization": "10084a8d-113f-4211-a0d5-efe36b082211", + "initiatedOrganization": "c7af5764-ceb9-4f64-8848-f04520df99ef", + "status": "PENDING" + } + AcceptanceRequestBody: + type: object + required: + - confirmationCode + properties: + confirmationCode: + type: string + example: 2663329b-c8c5-4c71-9500-9ea8c4e77d94 + InvitationsListResponse: + type: object + properties: + invitations: + type: array + items: + $ref: '#/components/schemas/InvitationResponse' + example: + { + "invitations": [ + { + "id": "4ec7e4d6-7979-4b0f-b7e1-e5737b1006b6", + "username": "john", + "email": "john@gmail.com", + "roles": [ + { + "displayName": "Administrator", + "id": "78b97c7a-faf1-441f-8c93-c22e5daf39f0", + "audience": [ + { + "value": "85504311-3a66-4a2f-bda1-eb37592a3d7c", + "display": "Console", + "type": "application" + } + ] + }, + { + "displayName": "Administartor", + "id": "aa82a741-1bf9-4855-b676-d590381f2453", + "audience": [ + { + "value": "43f8a68b-1a39-40a6-a4cd-25e9581c95a0", + "display": "Pet Care App", + "type": "application" + } + ] + } + ], + "groups": [ + { + "displayName": "group2", + "id": "47cb13fa-3c15-4dc4-8f7a-1b5bf63d451b" + }, + { + "displayName": "group1", + "id": "69c833c5-ee01-4ad1-95ab-3e01a58efc73" + } + ], + "status": "PENDING", + "expiredAt": "2024-01-22 13:09:41.702" + }, + { + "id": "78652ff3-b9ab-4252-b73e-f7a1545fd50a", + "username": "abc", + "email": "abc@gmail.com", + "roles": [ + { + "displayName": "Administrator", + "id": "78b97c7a-faf1-441f-8c93-c22e5daf39f0", + "audience": [ + { + "value": "85504311-3a66-4a2f-bda1-eb37592a3d7c", + "display": "Console", + "type": "application" + } + ] + }, + { + "displayName": "Administartor", + "id": "aa82a741-1bf9-4855-b676-d590381f2453", + "audience": [ + { + "value": "43f8a68b-1a39-40a6-a4cd-25e9581c95a0", + "display": "Pet Care App", + "type": "application" + } + ] + } + ], + "groups": [ + { + "displayName": "group2", + "id": "47cb13fa-3c15-4dc4-8f7a-1b5bf63d451b" + }, + { + "displayName": "group1", + "id": "69c833c5-ee01-4ad1-95ab-3e01a58efc73" + } + ], + "status": "PENDING", + "expiredAt": "2024-01-23 12:48:41.064" + } + ] + } + InvitationResponse: + type: object + required: + - id + - username + - email + - status + properties: + id: + type: string + example: f7594498-5b52-4201-abd5-d7cf72565c73 + username: + type: string + example: alex@gmail.com/alex + email: + type: string + example: alex@gmail.com + roles: + type: array + items: + $ref: '#/components/schemas/RoleAssignmentResponse' + groups: + type: array + items: + $ref: '#/components/schemas/GroupAssignmentResponse' + status: + type: string + example: PENDING/EXPIRED + expiredAt: + type: string + example: 2021-08-10T10:15:30.00Z + GroupAssignmentResponse: + type: object + properties: + displayName: + type: string + example: 'sales' + id: + type: string + example: 'f5b761ca-62f2-48ba-935b-f7b460f58e5c' + RoleAssignmentResponse: + type: object + properties: + displayName: + type: string + example: 'loginRole' + id: + type: string + example: '4645709c-ea8c-4495-8590-e1fa0efe3de0' + audience: + type: object + items: + $ref: '#/components/schemas/Audience' + Audience: + type: object + properties: + value: + type: string + example: '3645709f-ea8d-5595-7690-e1fa0efe3df9' + display: + type: string + example: 'My Org' + type: + type: string + example: 'organization' + Property: + type: object + properties: + key: + type: string + example: "manageNotificationsInternally" + value: + type: string + example: "false" + Error: + type: object + required: + - code + - message + properties: + code: + type: string + example: OUI-00000 + description: An error code. + message: + type: string + example: Some Error Message + description: An error message. + description: + type: string + example: Some Error Description + description: An error description. + traceId: + type: string + example: e0fbcfeb-3617-43c4-8dd0-7b7d38e13047 + description: An error trace identifier. + #-------------------------------------------------------- + # Descriptions of error responses. + #-------------------------------------------------------- + responses: + NotFound: + description: Resource is not found. + content: + 'application/json': + schema: + $ref: '#/components/schemas/Error' + Unauthorized: + description: Authentication information is missing or invalid. + Forbidden: + description: Access forbidden. + ServerError: + description: Internal server error. + content: + 'application/json': + schema: + $ref: '#/components/schemas/Error' + securitySchemes: + OAuth2: + type: oauth2 + flows: + authorizationCode: + authorizationUrl: 'https://api.asgardeo.io/t/{root-organization-name}/oauth2/authorize' + tokenUrl: 'https://api.asgardeo.io/t/{root-organization-name}/oauth2/token' + scopes: {} diff --git a/docusaurus-asgardeo/static/apis/organization-apis/restapis/organization-user-share-v2.yaml b/docusaurus-asgardeo/static/apis/organization-apis/restapis/organization-user-share-v2.yaml new file mode 100644 index 0000000000..0e0ed97419 --- /dev/null +++ b/docusaurus-asgardeo/static/apis/organization-apis/restapis/organization-user-share-v2.yaml @@ -0,0 +1,1081 @@ +openapi: 3.0.0 +info: + version: 1.0.0 + title: "User Sharing API (v2)" + description: |- + This document defines the **User Sharing REST API (v2)** for organizations in **Asgardeo**. + It enables organization administrators to: + - Share users across child organizations. + - Configure per-organization user role assignments. + - Manage and revoke shared access. + - Retrieve a user's shared organizations and effective roles. + + **Shared scopes with Organization User Sharing API v1:** The OAuth2 scopes `internal_org_user_share`, `internal_org_user_unshare`, and `internal_org_user_shared_access_view` are shared between this API (Organization User Sharing v2) and the Organization User Sharing v1 API. Authorizing either API automatically grants access to the equivalent endpoints in the other that use the same scopes. + + contact: + name: WSO2 + url: 'https://wso2.com/asgardeo/' + email: iam-dev@wso2.org + license: + name: Apache 2.0 + url: 'http://www.apache.org/licenses/LICENSE-2.0.html' +servers: + - url: 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v2' + variables: + root-organization-name: + default: "{root-organization-name}" + +security: + - OAuth2: [] + +paths: + /users/share: + post: + tags: + - User Sharing + summary: Share users with specific organizations + description: |- + Share one or more users with a selected set of organizations, optionally + assigning roles to each shared user in each target organization. + + This endpoint is treated as a **processing function**: + it triggers a sharing process and responds with `202 Accepted`. + + **Scope required:** `internal_org_user_share` + operationId: shareUsersWithSelected + requestBody: + required: true + content: + application/json: + schema: + $ref: "#/components/schemas/UserShareSelectedRequestBody" + example: + userCriteria: + userIds: + - "7a1b7d63-8cfc-4dc9-9332-3f84641b72d8" + - "5d2a1c84-9f7a-43cd-b12e-6e52d7f87e16" + organizations: + - orgId: "b028ca17-8f89-449c-ae27-fa955e66465d" + policy: "SELECTED_ORG_ONLY" + roleAssignment: + mode: "SELECTED" + roles: + - displayName: "Org Admin" + audience: + display: "My Org 1" + type: "organization" + - orgId: "a17b28ca-9f89-449c-ae27-fa955e66465f" + policy: "SELECTED_ORG_WITH_ALL_EXISTING_AND_FUTURE_CHILDREN" + # roleAssignment omitted => treated as mode = NONE (no roles) + responses: + "202": + description: User sharing process triggered successfully. + content: + application/json: + schema: + $ref: "#/components/schemas/ProcessSuccessResponse" + example: + status: "Processing" + details: "User sharing process triggered successfully." + "400": + description: Bad Request + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + "500": + description: Internal Server Error + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v2/users/share' \ + -H 'Content-Type: application/json' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "userCriteria": { + "userIds": [ + "7a1b7d63-8cfc-4dc9-9332-3f84641b72d8", + "5d2a1c84-9f7a-43cd-b12e-6e52d7f87e16" + ] + }, + "organizations": [ + { + "orgId": "b028ca17-8f89-449c-ae27-fa955e66465d", + "policy": "SELECTED_ORG_ONLY", + "roleAssignment": { + "mode": "SELECTED", + "roles": [ + { + "displayName": "Org Admin", + "audience": { + "display": "My Org 1", + "type": "organization" + } + } + ] + } + }, + { + "orgId": "a17b28ca-9f89-449c-ae27-fa955e66465f", + "policy": "SELECTED_ORG_WITH_ALL_EXISTING_AND_FUTURE_CHILDREN" + } + ] + }' + + patch: + tags: + - User Sharing + summary: Perform incremental role assignment operations for already shared users + description: |- + Perform **incremental updates** to the shared attributes (eg: role assignments) update of already shared users. + + This endpoint supports **SCIM-like PATCH semantics**: + - `op: "add"` → assign additional roles. + - `op: "remove"` → remove specific roles. + + > **Note:** + > Only **role assignments** updates are managed here as of now. Sharing/unsharing organizations + > is handled via `/users/share`, `/users/share-with-all`, `/users/unshare`, + > and `/users/unshare-with-all`. + + **Scope required:** `internal_org_user_shared_access_update` + operationId: patchUserSharing + requestBody: + required: true + content: + application/json: + schema: + $ref: "#/components/schemas/UserSharingPatchRequest" + examples: + addAndRemoveRoles: + summary: Add and remove roles for a shared user in a specific organization + value: + userCriteria: + userIds: + - "7a1b7d63-8cfc-4dc9-9332-3f84641b72d8" + Operations: + - op: "add" + path: "organizations[orgId eq b028ca17-8f89-449c-ae27-fa955e66465d].roles" + value: + - displayName: "Org Viewer" + audience: + display: "My Org 1" + type: "organization" + - displayName: "App Editor" + audience: + display: "My App 1" + type: "application" + - op: "remove" + path: "organizations[orgId eq b028ca17-8f89-449c-ae27-fa955e66465d].roles" + value: + - displayName: "Org Admin" + audience: + display: "My Org 1" + type: "organization" + responses: + "202": + description: Role assignment patch operation processed successfully. + content: + application/json: + schema: + $ref: "#/components/schemas/ProcessSuccessResponse" + example: + status: "Processing" + details: "Shared user attributes patch process triggered successfully." + "400": + description: Bad Request + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + "404": + description: Not Found + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + "500": + description: Internal Server Error + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + x-codeSamples: + - lang: Curl + source: | + curl --location --request PATCH 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v2/users/share' \ + -H 'Content-Type: application/json' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "userCriteria": { + "userIds": [ + "7a1b7d63-8cfc-4dc9-9332-3f84641b72d8" + ] + }, + "Operations": [ + { + "op": "add", + "path": "organizations[orgId eq b028ca17-8f89-449c-ae27-fa955e66465d].roles", + "value": [ + { + "displayName": "Org Viewer", + "audience": { + "display": "My Org 1", + "type": "organization" + } + }, + { + "displayName": "App Editor", + "audience": { + "display": "My App 1", + "type": "application" + } + } + ] + }, + { + "op": "remove", + "path": "organizations[orgId eq b028ca17-8f89-449c-ae27-fa955e66465d].roles", + "value": [ + { + "displayName": "Org Admin", + "audience": { + "display": "My Org 1", + "type": "organization" + } + } + ] + } + ] + }' + + /users/share-with-all: + post: + tags: + - User Sharing + summary: Share users with all organizations + description: |- + Share one or more users with **all organizations** according to the specified policy. + + A common `roleAssignment` can be provided to assign roles in all matching organizations. + + This endpoint is treated as a **processing function** and responds with `202 Accepted`. + + **Scope required:** `internal_org_user_share` + operationId: shareUsersWithAll + requestBody: + required: true + content: + application/json: + schema: + $ref: "#/components/schemas/UserShareAllRequestBody" + example: + userCriteria: + userIds: + - "7a1b7d63-8cfc-4dc9-9332-3f84641b72d8" + policy: "ALL_EXISTING_AND_FUTURE_ORGS" + roleAssignment: + mode: "SELECTED" + roles: + - displayName: "Global Org Viewer" + audience: + display: "My Org 1" + type: "organization" + responses: + "202": + description: Share-all process triggered successfully. + content: + application/json: + schema: + $ref: "#/components/schemas/ProcessSuccessResponse" + "400": + description: Bad Request + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + "500": + description: Internal Server Error + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v2/users/share-with-all' \ + -H 'Content-Type: application/json' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "userCriteria": { + "userIds": [ + "7a1b7d63-8cfc-4dc9-9332-3f84641b72d8" + ] + }, + "policy": "ALL_EXISTING_AND_FUTURE_ORGS", + "roleAssignment": { + "mode": "SELECTED", + "roles": [ + { + "displayName": "Global Org Viewer", + "audience": { + "display": "My Org 1", + "type": "organization" + } + } + ] + } + }' + + /users/unshare: + post: + tags: + - User Sharing + summary: Unshare users from specific organizations + description: |- + Unshare one or more users from a selected set of organizations. + + > **Note:** + > This only removes the user from the specified organizations. If the user + > was shared with a parent org plus its children via a broader policy, + > you must explicitly include all relevant organization IDs when unsharing. + + This endpoint is treated as a **processing function** and responds with `202 Accepted`. + + **Scope required:** `internal_org_user_unshare` + operationId: unshareUsersFromSelected + requestBody: + required: true + content: + application/json: + schema: + $ref: "#/components/schemas/UserUnshareSelectedRequestBody" + example: + userCriteria: + userIds: + - "7a1b7d63-8cfc-4dc9-9332-3f84641b72d8" + orgIds: + - "b028ca17-8f89-449c-ae27-fa955e66465d" + - "a17b28ca-9f89-449c-ae27-fa955e66465f" + responses: + "202": + description: Unsharing process triggered successfully. + content: + application/json: + schema: + $ref: "#/components/schemas/ProcessSuccessResponse" + example: + status: "Processing" + details: "User unsharing process triggered successfully." + "400": + description: Bad Request + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + "500": + description: Internal Server Error + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v2/users/unshare' \ + -H 'Content-Type: application/json' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "userCriteria": { + "userIds": [ + "7a1b7d63-8cfc-4dc9-9332-3f84641b72d8" + ] + }, + "orgIds": [ + "b028ca17-8f89-449c-ae27-fa955e66465d", + "a17b28ca-9f89-449c-ae27-fa955e66465f" + ] + }' + + /users/unshare-with-all: + post: + tags: + - User Sharing + summary: Unshare users from all organizations + description: |- + Completely remove all shared access for one or more users from **all organizations**. + + This endpoint is treated as a **processing function** and responds with `202 Accepted`. + + **Scope required:** `internal_org_user_unshare` + operationId: unshareUsersFromAll + requestBody: + required: true + content: + application/json: + schema: + $ref: "#/components/schemas/UserUnshareAllRequestBody" + example: + userCriteria: + userIds: + - "7a1b7d63-8cfc-4dc9-9332-3f84641b72d8" + responses: + "202": + description: Unshare-all process triggered successfully. + content: + application/json: + schema: + $ref: "#/components/schemas/ProcessSuccessResponse" + example: + status: "Processing" + details: "User unsharing process triggered successfully." + "400": + description: Bad Request + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + "500": + description: Internal Server Error + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v2/users/unshare-with-all' \ + -H 'Content-Type: application/json' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "userCriteria": { + "userIds": [ + "7a1b7d63-8cfc-4dc9-9332-3f84641b72d8" + ] + } + }' + + /users/{userId}/share: + get: + tags: + - User Accessible Organizations + summary: List organizations where the user has shared access + description: |- + Retrieve the list of organizations where the specified user has shared access, + including per-organization effective role assignments. + + The response shape depends on how the user was shared: + - If user has been shared via **`ALL_EXISTING_AND_FUTURE_ORGS`** policy → top-level `sharingMode` is returned, + and no per-org `sharingMode` is present on each organization entry. + - If user has been shared via **`SELECTED_ORG_WITH_ALL_EXISTING_AND_FUTURE_CHILDREN`** → no top-level `sharingMode` is returned, + and each organization entry includes its own `sharingMode`. + - If user has not been shared under any future applicable policies mentioned above, the response will simply include the list of shared organizations without any `sharingMode` information. + + This follows the same pattern as **`GET /applications/{applicationId}/share`**. + + **Scope required:** `internal_org_user_shared_access_view` + operationId: getUserSharedOrganizations + parameters: + - in: path + name: userId + required: true + schema: + type: string + description: The ID of the user. + - in: query + name: before + required: false + schema: + type: string + example: "Ng==" + description: Base64 encoded cursor value for backward pagination. + - in: query + name: after + required: false + schema: + type: string + example: "Ng==" + description: Base64 encoded cursor value for forward pagination. + - in: query + name: filter + required: false + schema: + type: string + example: "orgId eq b028ca17-8f89-449c-ae27-fa955e66465d" + description: |- + Condition to filter the retrieval of records. + Supports `sw`, `co`, `ew`, and `eq` operations. + - in: query + name: limit + required: false + schema: + type: integer + example: 10 + description: |- + Maximum number of records to return. If you do not specify this parameter, + this will return all shared organizations. + - in: query + name: recursive + required: false + schema: + type: boolean + description: |- + Determines whether a recursive search should happen. + If set to true, includes shared organizations in all levels of the hierarchy; + if set to false, includes only shared organizations in the next level of the hierarchy. + - in: query + name: attributes + required: false + schema: + type: string + example: "roles" + description: |- + Specifies the required parameters in the response. + Supported values: `roles`, `sharingMode`. + responses: + "200": + description: Successful response with the user's shared organizations. + content: + application/json: + schema: + oneOf: + - $ref: "#/components/schemas/UserSharedOrgsAllResponse" + - $ref: "#/components/schemas/UserSharedOrgsSelectedResponse" + examples: + sharedWithAll: + summary: User shared with all organizations + value: + links: + - href: "/t/{root-organization-name}/o/api/server/v2/users/7a1b7d63-8cfc-4dc9-9332-3f84641b72d8/share?limit=10&after=MTA=" + rel: "next" + sharingMode: + policy: "ALL_EXISTING_AND_FUTURE_ORGS" + roleAssignment: + mode: "SELECTED" + roles: + - displayName: "Global Org Viewer" + audience: + display: "My Org 1" + type: "organization" + organizations: + - orgId: "b028ca17-8f89-449c-ae27-fa955e66465d" + orgName: "Child Org 1" + orgHandle: "child-org-1" + orgStatus: "ACTIVE" + orgRef: "/t/wso2.com/o/api/server/v1/organizations/b028ca17-8f89-449c-ae27-fa955e66465d" + hasChildren: true + depthFromRoot: 1 + parentOrgId: "08f8c1d2-4b3e-4c5a-9f6b-7d8e9f0a1b2c" + parentUserId: "7a1b7d63-8cfc-4dc9-9332-3f84641b72d8" + sharedUserId: "550e8400-e29b-41d4-a716-446655440000" + sharedType: "SHARED" + roles: + - displayName: "Global Org Viewer" + audience: + display: "My Org 1" + type: "organization" + sharedWithSelected: + summary: User shared with selected organizations + value: + links: + - href: "/t/{root-organization-name}/o/api/server/v2/users/7a1b7d63-8cfc-4dc9-9332-3f84641b72d8/share?limit=10&after=MTA=" + rel: "next" + organizations: + - orgId: "b028ca17-8f89-449c-ae27-fa955e66465d" + orgName: "Child Org 1" + orgHandle: "child-org-1" + orgStatus: "ACTIVE" + orgRef: "/t/wso2.com/o/api/server/v1/organizations/b028ca17-8f89-449c-ae27-fa955e66465d" + hasChildren: true + depthFromRoot: 1 + parentOrgId: "08f8c1d2-4b3e-4c5a-9f6b-7d8e9f0a1b2c" + parentUserId: "7a1b7d63-8cfc-4dc9-9332-3f84641b72d8" + sharedUserId: "550e8400-e29b-41d4-a716-446655440000" + sharedType: "SHARED" + sharingMode: + policy: "SELECTED_ORG_WITH_ALL_EXISTING_AND_FUTURE_CHILDREN" + roleAssignment: + mode: "SELECTED" + roles: + - displayName: "Org Admin" + audience: + display: "My Org 1" + type: "organization" + roles: + - displayName: "Org Admin" + audience: + display: "My Org 1" + type: "organization" + - orgId: "a17b28ca-9f89-449c-ae27-fa955e66465f" + orgName: "Child Org 2" + orgHandle: "child-org-2" + orgStatus: "ACTIVE" + orgRef: "/t/wso2.com/o/api/server/v1/organizations/a17b28ca-9f89-449c-ae27-fa955e66465f" + hasChildren: false + depthFromRoot: 1 + parentOrgId: "08f8c1d2-4b3e-4c5a-9f6b-7d8e9f0a1b2c" + parentUserId: "7a1b7d63-8cfc-4dc9-9332-3f84641b72d8" + sharedUserId: "3f2504e0-4f89-41d3-9a0c-0305e82c3301" + sharedType: "SHARED" + sharingMode: + policy: "SELECTED_ORG_WITH_ALL_EXISTING_AND_FUTURE_CHILDREN" + roleAssignment: + mode: "NONE" + roles: [] + "400": + description: Bad Request + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + "500": + description: Internal Server Error + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + x-codeSamples: + - lang: Curl + label: Basic + source: | + curl --location 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v2/users/{userId}/share' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + - lang: Curl + label: With pagination and attributes + source: | + curl --location 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v2/users/{userId}/share?limit=10&after=Ng==&attributes=roles,sharingMode&recursive=true' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + - lang: Curl + label: With filter + source: | + curl --location 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v2/users/{userId}/share?filter=orgId+eq+b028ca17-8f89-449c-ae27-fa955e66465d' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + +components: + securitySchemes: + OAuth2: + type: oauth2 + flows: + authorizationCode: + authorizationUrl: "https://api.asgardeo.io/t/{root-organization-name}/oauth2/authorize" + tokenUrl: "https://api.asgardeo.io/t/{root-organization-name}/oauth2/token" + scopes: + internal_org_user_share: "Share users across organizations." + internal_org_user_unshare: "Unshare users from organizations." + internal_org_user_shared_access_view: "View shared organizations and roles for a user." + internal_org_user_shared_access_update: "Update shared attributes (e.g., roles) for shared users." + + schemas: + + # ===== Core request models ===== + + UserCriteria: + type: object + description: Criteria for selecting users to share/unshare. + properties: + userIds: + type: array + description: List of user IDs. + items: + type: string + required: + - userIds + + UserShareSelectedRequestBody: + type: object + description: |- + Request body for sharing users with a **selected set of organizations**. + required: + - userCriteria + - organizations + properties: + userCriteria: + $ref: "#/components/schemas/UserCriteria" + organizations: + type: array + description: List of organizations to share users with, along with policies and optional role assignments. + items: + $ref: "#/components/schemas/UserOrgShareConfig" + + UserOrgShareConfig: + type: object + description: Per-organization sharing configuration for selected organizations. + required: + - orgId + - policy + properties: + orgId: + type: string + description: Organization ID to share the users with. + policy: + type: string + description: |- + Sharing scope for this organization. + + Possible values: + - `SELECTED_ORG_ONLY` + - `SELECTED_ORG_WITH_ALL_EXISTING_AND_FUTURE_CHILDREN` + roleAssignment: + $ref: "#/components/schemas/RoleAssignment" + description: |- + Optional role assignment configuration for this organization. + If omitted, the default behavior is to assign **no roles** (equivalent to `mode = NONE`). + + UserShareAllRequestBody: + type: object + description: |- + Request body for sharing users with **all organizations** controlled by the selected policy. + required: + - userCriteria + - policy + properties: + userCriteria: + $ref: "#/components/schemas/UserCriteria" + policy: + type: string + description: |- + Global sharing policy. + + Possible values: + - `ALL_EXISTING_AND_FUTURE_ORGS` + roleAssignment: + $ref: "#/components/schemas/RoleAssignment" + description: |- + Optional global role assignment configuration that applies to all organizations + covered by this policy. If omitted, default behavior is **no roles**. + + UserUnshareSelectedRequestBody: + type: object + description: |- + Request body for unsharing users from selected organizations. + required: + - userCriteria + - orgIds + properties: + userCriteria: + $ref: "#/components/schemas/UserCriteria" + orgIds: + type: array + description: List of organization IDs from which users should be unshared. + items: + type: string + + UserUnshareAllRequestBody: + type: object + description: |- + Request body for unsharing users from **all organizations**. + required: + - userCriteria + properties: + userCriteria: + $ref: "#/components/schemas/UserCriteria" + + # ===== PATCH models ===== + + UserSharingPatchRequest: + type: object + description: |- + PATCH request for performing incremental role assignment operations + on already shared users. + required: + - userCriteria + - Operations + properties: + userCriteria: + $ref: "#/components/schemas/UserCriteria" + Operations: + type: array + items: + $ref: "#/components/schemas/UserSharingPatchOperation" + + UserSharingPatchOperation: + type: object + description: |- + A single PATCH operation (SCIM-like) for user sharing. + + Currently supported: + - `op: "add"` → Add roles. + - `op: "remove"` → Remove roles. + required: + - op + - path + properties: + op: + type: string + description: "Operation type. Supported values: `add`, `remove`." + path: + type: string + description: |- + JSON-like path in the format: + - `organizations[orgId eq \"\"].roles` + value: + type: array + description: |- + List of roles to add/remove under the specified path. + items: + $ref: "#/components/schemas/RoleShareConfig" + + # ===== Role assignment models ===== + + RoleAssignment: + type: object + description: |- + Role assignment configuration for shared users. + + This controls which roles are assigned to the user in the target organization. + + - `NONE` → Do not assign any roles via user sharing. + - `SELECTED` → Assign only the roles listed under `roles`. + properties: + mode: + type: string + enum: + - NONE + - SELECTED + default: SELECTED + description: Mode of role assignment. + roles: + type: array + description: |- + List of roles to assign when `mode = SELECTED`. + Required when `mode = SELECTED`. Ignored when `mode = NONE`. + items: + $ref: "#/components/schemas/RoleShareConfig" + + RoleShareConfig: + type: object + description: |- + Role to be assigned to the shared user in the sub-organization. + required: + - displayName + - audience + properties: + displayName: + type: string + description: "Human-readable name of the role." + example: "Org Admin" + audience: + type: object + required: + - display + - type + properties: + display: + type: string + description: "Display name of the audience (organization or application)." + example: "My Org 1" + type: + type: string + description: |- + Type of the role audience: + - `organization` + - `application` + example: "organization" + + # ===== Sharing Mode models ===== + + SharingModeAll: + type: object + description: |- + Top-level sharing mode present when the user is shared with ALL organizations. + Policy is always `ALL_EXISTING_AND_FUTURE_ORGS`. + required: + - policy + - roleAssignment + properties: + policy: + type: string + enum: + - ALL_EXISTING_AND_FUTURE_ORGS + description: Global sharing policy covering all existing and future organizations. + roleAssignment: + $ref: "#/components/schemas/RoleAssignment" + + SharingModeSelected: + type: object + description: |- + Per-org sharing mode present when the user is shared with SELECTED organizations. + Policy is always `SELECTED_ORG_WITH_ALL_EXISTING_AND_FUTURE_CHILDREN`. + required: + - policy + - roleAssignment + properties: + policy: + type: string + enum: + - SELECTED_ORG_WITH_ALL_EXISTING_AND_FUTURE_CHILDREN + description: Sharing policy scoped to a selected organization and its children. + roleAssignment: + $ref: "#/components/schemas/RoleAssignment" + + # ===== Organization entry models ===== + + UserSharedOrganizationBase: + type: object + description: Common fields for a shared organization entry. + properties: + orgId: + type: string + description: ID of the child organization. + orgName: + type: string + description: Name of the child organization. + orgHandle: + type: string + description: Unique, human-readable handle of the organization. + example: "sampleOrg" + orgStatus: + type: string + description: Current status of the organization. + example: "ACTIVE" + orgRef: + type: string + description: API reference of the organization resource. + example: "/t/wso2.com/o/api/server/v1/organizations/b4526d91-a8bf-43d2-8b14-c548cf73065b" + hasChildren: + type: boolean + description: Indicates whether the organization has child organizations. + depthFromRoot: + type: integer + description: Depth of the organization in the hierarchy, where root is 0. + example: 1 + parentOrgId: + type: string + nullable: true + description: ID of the parent (sharing initiated) organization. + parentUserId: + type: string + nullable: true + description: ID of the user in the parent (sharing initiated) organization. + sharedUserId: + type: string + description: ID of the shared user object in the target organization. + sharedType: + type: string + description: Shared type of the user. + example: "SHARED" + roles: + type: array + description: Effective roles assigned to this user in this organization via user sharing. + items: + $ref: "#/components/schemas/RoleShareConfig" + + UserSharedOrganizationAllEntry: + description: |- + Organization entry when user is shared via ALL_EXISTING_AND_FUTURE_ORGS policy. + No per-org sharingMode is present. + allOf: + - $ref: "#/components/schemas/UserSharedOrganizationBase" + + UserSharedOrganizationSelectedEntry: + description: |- + Organization entry when user is shared via SELECTED org policy. + Includes per-org sharingMode with policy SELECTED_ORG_WITH_ALL_EXISTING_AND_FUTURE_CHILDREN. + allOf: + - $ref: "#/components/schemas/UserSharedOrganizationBase" + - type: object + required: + - sharingMode + properties: + sharingMode: + $ref: "#/components/schemas/SharingModeSelected" + + # ===== Top-level response models ===== + + UserSharedOrgsAllResponse: + type: object + description: |- + Response when the user is shared with ALL organizations. + - Top-level `sharingMode` is present with policy `ALL_EXISTING_AND_FUTURE_ORGS`. + - Per-org `sharingMode` is absent on each organization entry. + required: + - sharingMode + - organizations + properties: + links: + type: array + items: + $ref: "#/components/schemas/Link" + sharingMode: + $ref: "#/components/schemas/SharingModeAll" + organizations: + type: array + items: + $ref: "#/components/schemas/UserSharedOrganizationAllEntry" + + UserSharedOrgsSelectedResponse: + type: object + description: |- + Response when the user is shared with SELECTED organizations. + - Top-level `sharingMode` is absent. + - Each organization entry includes its own `sharingMode` with policy + `SELECTED_ORG_WITH_ALL_EXISTING_AND_FUTURE_CHILDREN`. + required: + - organizations + properties: + links: + type: array + items: + $ref: "#/components/schemas/Link" + organizations: + type: array + items: + $ref: "#/components/schemas/UserSharedOrganizationSelectedEntry" + + # ===== Common models ===== + + Link: + type: object + properties: + href: + type: string + example: "/t/{root-organization-name}/o/api/server/v2/users/7a1b7d63-8cfc-4dc9-9332-3f84641b72d8/share?limit=10&after=MTA=" + rel: + type: string + example: "next" + + ProcessSuccessResponse: + type: object + description: |- + Indicates that a sharing / unsharing / patch process has been triggered. + properties: + status: + type: string + example: "Processing" + details: + type: string + example: "User sharing process triggered successfully." + + Error: + type: object + description: | + Error response model with a code, message, description, and trace ID. + required: + - code + - message + - traceId + properties: + code: + type: string + example: "US-00000" + message: + type: string + example: "Some error message." + description: + type: string + example: "Some error description." + traceId: + type: string + example: "e0fbcfeb-7fc2-4b62-8b82-72d3c5fbcdeb" diff --git a/docusaurus-asgardeo/static/apis/organization-apis/restapis/organization-user-share.yaml b/docusaurus-asgardeo/static/apis/organization-apis/restapis/organization-user-share.yaml new file mode 100644 index 0000000000..37803a7d1a --- /dev/null +++ b/docusaurus-asgardeo/static/apis/organization-apis/restapis/organization-user-share.yaml @@ -0,0 +1,800 @@ +openapi: 3.0.0 +info: + version: "v1" + title: 'User Sharing API (deprecated)' + description: |- + This document defines the **User Sharing REST API for organizations** in **Asgardeo**. This enables organization administrators to share users across child organizations, manage and revoke shared access, and retrieve users' shared organizations and roles. + + **Shared scopes with Organization User Sharing API v2:** The OAuth2 scopes `internal_org_user_share`, `internal_org_user_unshare`, and `internal_org_user_shared_access_view` are shared between this API (Organization User Sharing v1) and the Organization User Sharing v2 API. Authorizing either API automatically grants access to the equivalent endpoints in the other that use the same scopes. + +security: + - OAuth2: [] + +servers: + - url: 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1' + variables: + tenant-domain: + default: "{tenant-domain}" + +paths: + /users/share: + post: + tags: + - User Sharing + summary: Share a user across specific organizations + description: | + This API shares one or more users across specified organizations, assigning roles based on the provided policy. The policy defines the sharing scope for each organization, including whether access extends to child organizations. + + > **Important**
    + > If you switch a user from a general sharing policy to a selective sharing policy or vice versa, without unsharing a user, it can lead to access issues. To ensure a smooth transition, first unshare the user from all organizations and share them again with the desired organization(s) under the updated policy.
    + > If you overlook this step and notice unexpected user-sharing behavior when new organizations are created, use the `/o/users/unshare-with-all` API to reset access before applying the new sharing policy. + + Scope(Permission) required: `internal_org_user_share` + operationId: processUserSharing + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/UserShareRequestBody' + example: + userCriteria: + userIds: + - "7a1b7d63-8cfc-4dc9-9332-3f84641b72d8" + - "5d2a1c84-9f7a-43cd-b12e-6e52d7f87e16" + organizations: + - orgId: "b028ca17-8f89-449c-ae27-fa955e66465d" + policy: "SELECTED_ORG_ONLY" + roles: + - displayName: "role_2" + audience: + display: "My Org 1" + type: "organization" + - orgId: "a17b28ca-9f89-449c-ae27-fa955e66465f" + policy: "SELECTED_ORG_WITH_EXISTING_IMMEDIATE_AND_FUTURE_CHILDREN" + roles: [] + required: true + responses: + '202': + description: Sharing process triggered successfully. + content: + application/json: + schema: + $ref: '#/components/schemas/ProcessSuccessResponse' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Internal Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/users/share' \ + -H 'Accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "userCriteria": { + "userIds": [ + "7a1b7d63-8cfc-4dc9-9332-3f84641b72d8", + "5d2a1c84-9f7a-43cd-b12e-6e52d7f87e16" + ] + }, + "organizations": [ + { + "orgId": "b028ca17-8f89-449c-ae27-fa955e66465d", + "policy": "SELECTED_ORG_ONLY", + "roles": [ + { + "displayName": "role_2", + "audience": { + "display": "My Org 1", + "type": "organization" + } + } + ] + }, + { + "orgId": "a17b28ca-9f89-449c-ae27-fa955e66465f", + "policy": "SELECTED_ORG_WITH_EXISTING_IMMEDIATE_AND_FUTURE_CHILDREN", + "roles": [] + } + ] + }' + x-codegen-request-body-name: body + + /users/share-with-all: + post: + tags: + - User Sharing + summary: Share a user with all organizations + description: | + This API shares users across all organizations, applying the provided roles to each organization. The policy determines the scope of sharing, including whether it applies to all current organizations or future organizations as well. + + > **Important**
    + > If you switch a user from a general sharing policy to a selective sharing policy or vice versa, without unsharing a user, it can lead to access issues. To ensure a smooth transition, first unshare the user from all organizations and share them again with the desired organization(s) under the updated policy.
    + > If you overlook this step and notice unexpected user-sharing behavior when new organizations are created, use the `/o/users/unshare-with-all` API to reset access before applying the new sharing policy. + + Scope(Permission) required: `internal_org_user_share` + operationId: processUserSharingAll + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/UserShareWithAllRequestBody' + example: + userCriteria: + userIds: + - "7a1b7d63-8cfc-4dc9-9332-3f84641b72d8" + - "5d2a1c84-9f7a-43cd-b12e-6e52d7f87e16" + policy: "ALL_EXISTING_ORGS_ONLY" + roles: + - displayName: "role_1" + audience: + display: "My Org 1" + type: "organization" + - displayName: "role_2" + audience: + display: "My App 1" + type: "application" + required: true + responses: + '202': + description: Sharing process triggered successfully. + content: + application/json: + schema: + $ref: '#/components/schemas/ProcessSuccessResponse' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Internal Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/users/share-with-all' \ + -H 'Accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "userCriteria": { + "userIds": [ + "7a1b7d63-8cfc-4dc9-9332-3f84641b72d8", + "5d2a1c84-9f7a-43cd-b12e-6e52d7f87e16" + ] + }, + "policy": "ALL_EXISTING_ORGS_ONLY", + "roles": [ + { + "displayName": "role_1", + "audience": { + "display": "My Org 1", + "type": "organization" + } + }, + { + "displayName": "role_2", + "audience": { + "display": "My App 1", + "type": "application" + } + } + ] + }' + x-codegen-request-body-name: body + + /users/unshare: + post: + tags: + - User Sharing + summary: Unshare a user from specific organizations + description: | + The parent organization admins can use this API to unshare a shared user from a selected list of organizations. + The payload includes the list of user IDs and the organizations from which the users should be unshared. + + Note the following details: + - unsharing can only be done from the same organization that initially shared the user. + - if you have shared a user with an organization and its children, unsharing the user from that + organization will not unshare the user from the child organizations. + You must explicitly declare all the organization IDs from which the user should be removed. + + Scope(Permission) required: `internal_org_user_unshare` + operationId: processUserUnsharing + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/UserUnshareRequestBody' + example: + userCriteria: + userIds: + - "7a1b7d63-8cfc-4dc9-9332-3f84641b72d8" + - "5d2a1c84-9f7a-43cd-b12e-6e52d7f87e16" + organizations: + - "b028ca17-8f89-449c-ae27-fa955e66465d" + - "a17b28ca-9f89-449c-ae27-fa955e66465f" + required: true + responses: + '202': + description: Unsharing process triggered successfully. + content: + application/json: + schema: + $ref: '#/components/schemas/ProcessSuccessResponse' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Internal Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/users/unshare' \ + -H 'Accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "userCriteria": { + "userIds": [ + "7a1b7d63-8cfc-4dc9-9332-3f84641b72d8", + "5d2a1c84-9f7a-43cd-b12e-6e52d7f87e16" + ] + }, + "organizations": [ + "b028ca17-8f89-449c-ae27-fa955e66465d", + "a17b28ca-9f89-449c-ae27-fa955e66465f" + ] + }' + x-codegen-request-body-name: body + + /users/unshare-with-all: + post: + tags: + - User Sharing + summary: Remove a user's shared access + description: | + This API removes all shared access for one or more users, unsharing them from all organizations. + Note that unsharing can only be done from the same organization that initially shared the user. + + Scope(Permission) required: `internal_org_user_unshare` + operationId: removeUserSharing + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/UserUnshareWithAllRequestBody' + example: + userCriteria: + userIds: + - "7a1b7d63-8cfc-4dc9-9332-3f84641b72d8" + - "5d2a1c84-9f7a-43cd-b12e-6e52d7f87e16" + required: true + responses: + '202': + description: Share removal process triggered successfully. + content: + application/json: + schema: + $ref: '#/components/schemas/ProcessSuccessResponse' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Internal Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/users/unshare-with-all' \ + -H 'Accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "userCriteria": { + "userIds": [ + "7a1b7d63-8cfc-4dc9-9332-3f84641b72d8", + "5d2a1c84-9f7a-43cd-b12e-6e52d7f87e16" + ] + } + }' + x-codegen-request-body-name: body + + /users/{userId}/shared-organizations: + get: + tags: + - User Accessible Organizations + summary: Get the list of organizations accessible by the user + description: | + This API retrieves the list of organizations where the specified user has shared access. + + Scope(Permission) required: `internal_org_user_shared_access_view` + parameters: + - in: path + name: userId + required: true + schema: + type: string + description: The ID of the user. + - in: query + name: after + schema: + type: string + description: The cursor indicating the item after which the next page of results will begin. + - in: query + name: before + schema: + type: string + description: The cursor pointing to the item before which the previous page of results should be returned. + - in: query + name: limit + schema: + type: integer + description: The maximum number of results to return per page. + - in: query + name: filter + schema: + type: string + description: A filter to apply to the results, such as by organization name or other criteria. + - in: query + name: recursive + schema: + type: boolean + default: false + description: Whether to retrieve organizations recursively, including child organizations. + responses: + '200': + description: Successful Response with Accessible Organizations + content: + application/json: + schema: + $ref: '#/components/schemas/UserSharedOrganizationsResponse' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Internal Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/users/{userId}/shared-organizations' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + + /users/{userId}/shared-roles: + get: + tags: + - User Accessible Roles + summary: Get roles assigned to a user in an organization + description: | + This API fetches the roles assigned to the specified user within a particular organization.
    + Note that the roles returned are only the roles assigned by the organization that initially shared the user. + Any additional roles assigned to the user from the shared organizations are not included in this response. + + Scope(Permission) required: `internal_org_user_shared_access_view` + parameters: + - in: path + name: userId + required: true + schema: + type: string + description: The ID of the user for whom roles are being retrieved. + - in: query + name: orgId + required: true + schema: + type: string + description: The organization ID for which roles are being fetched. + - in: query + name: after + schema: + type: string + description: The cursor indicating the item after which the next page of results will begin. + - in: query + name: before + schema: + type: string + description: The cursor pointing to the item before which the previous page of results should be returned. + - in: query + name: limit + schema: + type: integer + description: The maximum number of results to return per page. + - in: query + name: filter + schema: + type: string + description: Filter to apply when retrieving the roles. + - in: query + name: recursive + schema: + type: boolean + description: Set to true to retrieve roles recursively. + responses: + '200': + description: Successful Response with Accessible Roles + content: + application/json: + schema: + $ref: '#/components/schemas/UserSharedRolesResponse' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Internal Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{root-organization-name}/o/api/server/v1/users/{userId}/shared-roles?orgId={orgId}' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + +components: + + securitySchemes: + + OAuth2: + type: oauth2 + flows: + authorizationCode: + authorizationUrl: 'https://api.asgardeo.io/t/{root-organization-name}/oauth2/authorize' + tokenUrl: 'https://api.asgardeo.io/t/{root-organization-name}/oauth2/token' + scopes: + share: internal_org_user_share + unshare: internal_org_user_unshare + view: internal_org_user_shared_access_view + + schemas: + + UserShareRequestBody: + type: object + description: | + The request body for sharing users with multiple child organizations. + Includes a list of users, organizations, sharing scope as policy, and roles. + required: + - userCriteria + - organizations + properties: + userCriteria: + type: object + description: Contains a list of user IDs to be shared. + properties: + userIds: + type: array + description: List of user IDs. + items: + type: string + description: The ID of a user to be shared. + organizations: + type: array + description: List of organizations specifying sharing scope and roles. + items: + type: object + required: + - orgId + - policy + properties: + orgId: + type: string + description: The ID of the organization to share the users with. + policy: + type: string + description: | + The scope of sharing for this organization. Possible values are: + + - SELECTED_ORG_ONLY:
    + Share the resource only with the selected organization. + - SELECTED_ORG_WITH_ALL_EXISTING_CHILDREN_ONLY:
    + Share with the selected organization and all its existing child organizations. New child organizations created after the policy is applied will **not** be included. + - SELECTED_ORG_WITH_ALL_EXISTING_AND_FUTURE_CHILDREN:
    + Share with the selected organization, all its current child organizations, and automatically include any future child organizations created later. + - SELECTED_ORG_WITH_EXISTING_IMMEDIATE_CHILDREN_ONLY:
    + Share only with the selected organization’s immediate existing child organizations. Future immediate children are **not** included. + - SELECTED_ORG_WITH_EXISTING_IMMEDIATE_AND_FUTURE_CHILDREN:
    + Share with the selected organization’s immediate existing child organizations and automatically include any immediate child organizations created in the future. + roles: + type: array + description: A list of roles to be shared with the organization. + items: + $ref: '#/components/schemas/RoleWithAudience' + example: + userCriteria: + userIds: + - "7a1b7d63-8cfc-4dc9-9332-3f84641b72d8" + - "5d2a1c84-9f7a-43cd-b12e-6e52d7f87e16" + organizations: + - orgId: "b028ca17-8f89-449c-ae27-fa955e66465d" + policy: "SELECTED_ORG_ONLY" + roles: + - displayName: "role_2" + audience: + display: "My Org 1" + type: "organization" + - orgId: "a17b28ca-9f89-449c-ae27-fa955e66465f" + policy: "SELECTED_ORG_ONLY" + roles: [] + + UserShareWithAllRequestBody: + type: object + description: | + Process a request to share users with all organizations. + The payload contains the roles applicable across all organizations and a policy that defines the scope of sharing. + required: + - userCriteria + - policy + properties: + userCriteria: + type: object + description: Contains a list of user IDs to be shared. + properties: + userIds: + type: array + description: List of user IDs. + items: + type: string + description: The ID of a user to be shared. + policy: + type: string + description: | + The scope of sharing for this organization. Possible values are: + + - ALL_EXISTING_ORGS_ONLY:
    + Share the resource with all organizations that exist at the time the policy is applied. New organizations created after the policy is applied will **not** be included. + - ALL_EXISTING_AND_FUTURE_ORGS:
    + Share the resource with all current organizations and automatically include any organizations created in the future. + - IMMEDIATE_EXISTING_ORGS_ONLY:
    + Share the resource only with immediate child organizations that exist when the policy is applied. Future immediate child organizations are **not** included. + - IMMEDIATE_EXISTING_AND_FUTURE_ORGS:
    + Share the resource with immediate existing child organizations and automatically include any immediate child organizations created in the future. + roles: + type: array + description: A list of roles shared across all organizations. + items: + $ref: '#/components/schemas/RoleWithAudience' + example: + userCriteria: + userIds: + - "7a1b7d63-8cfc-4dc9-9332-3f84641b72d8" + - "5d2a1c84-9f7a-43cd-b12e-6e52d7f87e16" + policy: "ALL_EXISTING_ORGS_ONLY" + roles: + - displayName: "role_1" + audience: + display: "My Org 1" + type: "organization" + - displayName: "role_2" + audience: + display: "My App 1" + type: "application" + + UserUnshareRequestBody: + type: object + description: | + The request body for unsharing users from multiple organizations. + Includes a list of user IDs and a list of organization IDs. + required: + - userCriteria + - organizations + properties: + userCriteria: + type: object + description: Contains a list of user IDs to be unshared. + properties: + userIds: + type: array + description: List of user IDs. + items: + type: string + description: The ID of a user to be unshared. + organizations: + type: array + description: List of organization IDs from which the users should be unshared. + items: + type: string + example: + userCriteria: + userIds: + - "7a1b7d63-8cfc-4dc9-9332-3f84641b72d8" + - "5d2a1c84-9f7a-43cd-b12e-6e52d7f87e16" + organizations: + - "b028ca17-8f89-449c-ae27-fa955e66465d" + - "a17b28ca-9f89-449c-ae27-fa955e66465f" + + UserUnshareWithAllRequestBody: + type: object + description: | + The request body for unsharing users from all organizations. + Includes a list of user IDs. + required: + - userCriteria + properties: + userCriteria: + type: object + description: Contains a list of user IDs to be unshared. + properties: + userIds: + type: array + description: List of user IDs. + items: + type: string + description: The ID of a user to be unshared. + example: + userCriteria: + userIds: + - "7a1b7d63-8cfc-4dc9-9332-3f84641b72d8" + - "5d2a1c84-9f7a-43cd-b12e-6e52d7f87e16" + + UserSharedOrganizationsResponse: + type: object + description: | + Response listing organizations where a user has shared access, including sharing policies, shared type and pagination links for navigating results. + properties: + links: + type: array + description: Pagination links for navigating the result set. + items: + type: object + properties: + href: + type: string + description: URL to navigate to the next or previous page. + rel: + type: string + description: Indicates if the link is for the "next" or "previous" page. + sharedOrganizations: + type: array + description: A list of shared access details for the user across multiple organizations + items: + type: object + properties: + orgId: + type: string + description: ID of the child organization + example: "b028ca17-8f89-449c-ae27-fa955e66465d" + orgName: + type: string + description: Name of the child organization + example: "Organization Name" + sharedUserId: + type: string + description: ID of the shared user + example: "7a1b7d63-8cfc-4dc9-9332-3f84641b72d8" + sharedType: + type: string + description: Shared type of the user (SHARED/INVITED) + example: "SHARED" + rolesRef: + type: string + description: URL reference to retrieve paginated roles for the shared user in this organization + example: "/o/api/server/v1/users/{userId}/shared-roles?orgId={orgId}" + + UserSharedRolesResponse: + type: object + description: | + Response showing the roles assigned to a user within a specific organization, with pagination support for large role sets. + properties: + links: + type: array + description: Pagination links for navigating the result set. + items: + type: object + properties: + href: + type: string + description: URL to navigate to the next or previous page. + rel: + type: string + description: Indicates if the link is for the "next" or "previous" page. + roles: + type: array + description: A list of roles with audience details + items: + $ref: '#/components/schemas/RoleWithAudience' + + RoleWithAudience: + type: object + description: | + Represents a user role within a specific audience (organization or application), defined by its display name and audience type. + required: + - displayName + - audience + properties: + displayName: + type: string + description: Display name of the role + example: "role_1" + audience: + type: object + required: + - display + - type + properties: + display: + type: string + description: Display name of the audience + example: "My Org 1" + type: + type: string + description: Type of the audience, e.g., 'organization' or 'application' + example: "organization" + + ProcessSuccessResponse: + type: object + description: | + Indicates that the sharing or unsharing process has started successfully, with the current status and relevant details. + properties: + status: + type: string + description: Status of the process. + example: "Processing" + details: + type: string + description: Additional information about the process. + example: "User sharing process triggered successfully." + + Error: + type: object + description: | + Details of an error, including code, message, description, and a trace ID to help with debugging. + required: + - code + - message + - traceId + properties: + code: + type: string + example: "OUI-00000" + description: An error code. + message: + type: string + example: "Some Error Message" + description: An error message. + description: + type: string + example: "Some Error Description" + description: An error description. + traceId: + type: string + format: uuid + example: "e0fbcfeb-7fc2-4b62-8b82-72d3c5fbcdeb" + description: A trace ID in UUID format to help with debugging. diff --git a/docusaurus-asgardeo/static/apis/organization-apis/restapis/role-management.yaml b/docusaurus-asgardeo/static/apis/organization-apis/restapis/role-management.yaml new file mode 100644 index 0000000000..4698d9575d --- /dev/null +++ b/docusaurus-asgardeo/static/apis/organization-apis/restapis/role-management.yaml @@ -0,0 +1,1156 @@ +openapi: 3.0.0 +info: + title: Asgardeo - SCIM 2.0 Roles V2 API + version: v2 + description: | + This is the RESTful API for SCIM 2.0 Roles API in Asgardeo organizations. + This API allows listing roles and updating users and groups of the roles. +servers: + - url: https://api.asgardeo.io/t/{root-organization-name}/o/scim2/v2 + variables: + server-url: + default: https://api.asgardeo.io/t/{root-organization-name}/o/ + root-organization-name: + default: "{root-organization-name}" +security: + - OAuth2: [] + +paths: + /v2/Roles: + get: + tags: + - Roles Endpoint + summary: Filter Roles + description: | + This API returns roles according to the specified filter, sort and pagination parameters. + + Scope(Permission) required: `internal_org_role_mgt_view` + operationId: getRoleV2 + parameters: + - name: filter + in: query + description: Filter expression for filtering + schema: + type: string + - name: startIndex + in: query + description: The 1-based index of the first query result + schema: + type: integer + format: int32 + - name: count + in: query + description: Specifies the desired maximum number of query results per page. + schema: + type: integer + format: int32 + - name: sortBy + in: query + description: | + Specifies the attribute whose value + SHALL be used to order the returned responses + schema: + type: string + - name: sortOder + in: query + description: The order in which the "sortBy" parameter is applied. + schema: + type: string + responses: + "200": + description: Valid roles are found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/RolesListResponseObjectV2' + "401": + description: Unauthorized + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUnauthorized' + "403": + description: Forbidden + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorForbidden' + "404": + description: No Role found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorNoRoleAvailable' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/scim2/v2/Roles' \ + -H 'accept: application/scim+json' \ + -H 'Authorization: Bearer {bearer_token}' + post: + tags: + - Roles Endpoint + summary: Create Role + description: | + This API creates a role and returns the details of the created role + including its unique ID. These roles can only be associated with the + applications which are created in the organization level. You cannot + use these roles with the shared applications from the root organization. + + Scope(Permission) required: + - `internal_org_role_mgt_create` + + ➕ Additional Scopes + + To assign permissions, users, or groups to the role you create, you also need the following additional scopes: + + | Action | Scope | + |---------|--------| + | Assign permissions | `internal_org_role_mgt_permissions_update` | + | Assign users | `internal_org_role_mgt_users_update` | + | Assign groups | `internal_org_role_mgt_groups_update` | + operationId: createRoleV2 + requestBody: + content: + application/scim+json: + schema: + $ref: '#/components/schemas/RoleCreationObjectV2' + responses: + '201': + description: Valid role is created + content: + application/scim+json: + schema: + $ref: '#/components/schemas/RolePostResponseObjectV2' + '401': + description: Unauthorized + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUnauthorized' + '403': + description: Forbidden + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorForbidden' + '409': + description: Role already exist + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorRoleAlreadyAvailable' + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/scim2/v2/Roles' \ + -H 'accept: application/scim+json' \ + -H 'Content-Type: application/scim+json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "schemas": [ + "urn:ietf:params:scim:schemas:extension:2.0:Role" + ], + "displayName": "loginRole", + "audience": { + "value": "3645709f-ea8d-5595-7690-e1fa0efe3df9", + "type": "application" + }, + "users": [ + { + "value": "008bba85-451d-414b-87de-c03b5a1f4217" + } + ], + "groups": [ + { + "value": "7bac6a86-1f21-4937-9fb1-5be4a93ef469" + } + ], + "permissions": [ + { + "value": "internal_login", + "display": "Internal Login" + } + ] + }' + x-codegen-request-body-name: body + /v2/Roles/.search: + post: + tags: + - Roles Endpoint + summary: Search Roles + description: | + This API returns roles according to the specified filter, sort and pagination parameters. + + Scope(Permission) required: `internal_org_role_mgt_view` + operationId: getRolesByPostV2 + requestBody: + content: + application/scim+json: + schema: + $ref: '#/components/schemas/RoleSearchRequestObjectV2' + required: false + responses: + "200": + description: Valid roles are found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/RoleSearchResponseObjectV2' + "401": + description: Unauthorized + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUnauthorized' + "403": + description: Forbidden + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorForbidden' + "404": + description: Valid roles are not found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/RoleSearchErrorResponseObject' + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/scim2/v2/Roles/.search' \ + -H 'accept: application/scim+json' \ + -H 'Content-Type: application/scim+json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "schemas": [ + "urn:ietf:params:scim:api:messages:2.0:SearchRequest" + ], + "startIndex": 1, + "filter": "displayName eq loginRole" + }' + x-codegen-request-body-name: body + /v2/Roles/{id}: + get: + tags: + - Roles Endpoint + summary: Get Role by ID + description: | + This API returns the role details of a particular role using its unique ID. + + Scope(Permission) required: `internal_org_role_mgt_view` + operationId: getRolebyIdV2 + parameters: + - name: id + in: path + description: Unique ID of the resource type. + required: true + schema: + type: string + - name: attributes + in: query + description: SCIM defined attributes parameter. + schema: + type: string + - name: excludedAttributes + in: query + description: SCIM defined excludedAttribute parameter. + schema: + type: string + responses: + "200": + description: Valid role is found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/RoleGetResponseObjectV2' + "401": + description: Unauthorized + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUnauthorized' + "403": + description: Forbidden + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorForbidden' + "404": + description: Valid role is not found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorNoRoleAvailable' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/scim2/v2/Roles/{role-id}' \ + -H 'accept: application/scim+json' \ + -H 'Authorization: Bearer {bearer_token}' + put: + tags: + - Roles Endpoint + summary: Update Role - PUT + description: | + This API updates the **assigned users and groups** of a shared and non-shared roles.
    + Also, you can update role name, permissions of non-shared roles.
    + **Role audience and associated applications** can't be updated through this API. + + Scope(Permission) required: + - `internal_org_role_mgt_update` + + ➕ Additional Scopes + + To update permissions, users, or groups assignments of the role, you also need the following additional scopes: + + | Action | Scope | + |---------|--------| + | Update permissions | `internal_org_role_mgt_permissions_update` | + | Update users | `internal_org_role_mgt_users_update` | + | Update groups | `internal_org_role_mgt_groups_update` | + operationId: updateRoleV2 + parameters: + - name: id + in: path + description: Unique ID of the resource type. + required: true + schema: + type: string + requestBody: + content: + application/scim+json: + schema: + $ref: '#/components/schemas/RolePutRequestObjectV2' + required: false + responses: + "200": + description: Role is updated + content: + application/scim+json: + schema: + $ref: '#/components/schemas/RolePutResponseObjectV2' + "400": + description: Invalid Input + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorInvalidInput' + "401": + description: Unauthorized + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUnauthorized' + "403": + description: Forbidden + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorForbidden' + "404": + description: Valid role is not found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorNoRoleAvailable' + "406": + description: Not Acceptable + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorNotAcceptable' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PUT' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/scim2/v2/Roles/{role-id}' \ + -H 'accept: application/scim+json' \ + -H 'Content-Type: application/scim+json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "displayName": "loginRole", + "audience": { + "value": "3645709f-ea8d-5595-7690-e1fa0efe3df9", + "display": "My Org", + "type": "organization" + }, + "users": [ + { + "value": "409ca90b-2ba6-4474-9a45-2cf7376e6e43" + } + ], + "groups": [ + { + "value": "7bac6a86-1f21-4937-9fb1-5be4a93ef469" + } + ], + "permissions": [ + { + "value": "internal_login", + "display": "Internal Login" + } + ], + "associatedApplications": [ + { + "value": "9bbc6a86-1f21-4937-9fb1-5be4a93ef499", + "display": "XY Web Application" + }, + { + "value": "67bc6a86-1f21-4937-9fb1-5be4a93ef488", + "display": "XY Mobile Application" + } + ] + }' + x-codegen-request-body-name: body + delete: + tags: + - Roles Endpoint + summary: Delete Role + description: | + This API deletes a particular role using its unique ID. From this + operation in the organization level, you only can delete + the roles that are created directly in the organization level. + You cannot delete the roles that are shared from the root + organization. + Scope(Permission) required: `internal_org_role_mgt_delete` + operationId: deleteRoleV2 + parameters: + - name: id + in: path + description: Unique ID of the resource type. + required: true + schema: + type: string + responses: + '204': + description: Role is deleted + '401': + description: Unauthorized + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUnauthorized' + '403': + description: Forbidden + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorForbidden' + '404': + description: Valid role is not found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorNoRoleAvailable' + x-codeSamples: + - lang: Curl + source: | + curl -X 'DELETE' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/scim2/v2/Roles/{role-id}' \ + -H 'accept: application/scim+json' \ + -H 'Authorization: Bearer {bearer_token}' + patch: + tags: + - Roles Endpoint + summary: Update Role - PATCH + description: | + This API updates the **assigned users and groups** of shared and non shared roles.
    + You can also update the role name and the permissions of non shared roles.
    + **Role audience and associated applications** cannot be updated through this API. + + Scope(Permission) required: + - `internal_org_role_mgt_update` + + ➕ Additional Scopes + + To update permissions, users, or groups assignments of the role, you also need the following additional scopes: + + | Action | Scope | + |---------|--------| + | Update permissions | `internal_org_role_mgt_permissions_update` | + | Update users | `internal_org_role_mgt_users_update` | + | Update groups | `internal_org_role_mgt_groups_update` | + operationId: patchRole + parameters: + - name: id + in: path + description: Unique id of the resource type. + required: true + schema: + type: string + requestBody: + content: + application/scim+json: + schema: + $ref: '#/components/schemas/PatchRoleOperationRequestObjectV2' + required: false + responses: + "200": + description: Role is updated + content: + application/scim+json: + schema: + $ref: '#/components/schemas/PatchRoleOperationResponseObjectV2' + "401": + description: Unauthorized + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUnauthorized' + "403": + description: Forbidden + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorForbidden' + "404": + description: Valid role is not found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorNoRoleAvailable' + "406": + description: Not Acceptable + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorNotAcceptable' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PATCH' \ + 'https://api.asgardeo.io/t/{root-organization-name}/o/scim2/v2/Roles/{role-id}' \ + -H 'accept: application/scim+json' \ + -H 'Content-Type: application/scim+json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "schemas": [ + "urn:ietf:params:scim:api:messages:2.0:PatchOp" + ], + "Operations": [ + { + "op": "add", + "path": "groups", + "value": [ + { + "value": "7bac6a86-1f21-4937-9fb1-5be4a93ef469" + } + ] + }, + { + "op": "add", + "path": "users", + "value": [ + { + "value": "9cac6a86-1f21-4937-9fb1-5be4a93ef349" + } + ] + }, + { + "op": "remove", + "path": "users[value eq 0565f472-28fe-4d93-83ad-096c66ed4a47]" + }, + { + "op": "remove", + "path": "groups[value eq 9065f445-265e-4rfg3-83ad-666c66ed4a55]" + } + ] + }' + x-codegen-request-body-name: body +components: + schemas: + RolesListResponseObjectV2: + type: object + properties: + totalResults: + type: integer + example: 3 + startIndex: + type: integer + example: 1 + itemsPerPage: + type: integer + example: 3 + schemas: + type: array + items: + type: string + example: urn:ietf:params:scim:api:messages:2.0:ListResponse + Resources: + type: array + items: + $ref: '#/components/schemas/RoleObV2' + RoleSearchRequestObjectV2: + type: object + properties: + schemas: + type: object + properties: {} + example: + - urn:ietf:params:scim:api:messages:2.0:SearchRequest + startIndex: + type: integer + example: 1 + count: + type: integer + example: 10 + filter: + type: string + example: displayName eq loginRole + RoleSearchResponseObjectV2: + type: object + properties: + totalResults: + type: integer + example: 1 + startIndex: + type: integer + example: 1 + itemsPerPage: + type: integer + example: 3 + schemas: + type: array + items: + type: string + example: urn:ietf:params:scim:api:messages:2.0:ListResponse + Resources: + type: array + items: + $ref: '#/components/schemas/RoleObV2' + RoleObV2: + type: object + properties: + displayName: + type: string + example: loginRole + meta: + type: object + properties: + location: + type: string + example: https://api.asgardeo.io/t/{root-organization-name}/o/scim2/Roles/4645709c-ea8c-4495-8590-e1fa0efe3de0 + id: + type: string + example: 4645709c-ea8c-4495-8590-e1fa0efe3de0 + audience: + type: object + properties: + value: + type: string + example: 3645709f-ea8d-5595-7690-e1fa0efe3df9 + display: + type: string + example: My Org + type: + type: string + example: organization + properties: + type: array + items: + type: object + properties: + name: + type: string + example: isSharedRole + value: + type: string + example: 'true' + RoleCreationObjectV2: + type: object + required: + - displayName + - schemas + properties: + schemas: + type: array + items: + type: string + example: urn:ietf:params:scim:schemas:extension:2.0:Role + displayName: + type: string + example: loginRole + audience: + type: object + properties: + value: + type: string + example: 3645709f-ea8d-5595-7690-e1fa0efe3df9 + type: + type: string + enum: + - application + - organization + example: application + users: + type: array + items: + type: object + example: + value: 008bba85-451d-414b-87de-c03b5a1f4217 + groups: + type: array + items: + type: object + example: + value: 7bac6a86-1f21-4937-9fb1-5be4a93ef469 + permissions: + type: array + items: + type: object + properties: + value: + type: string + example: internal_login + display: + type: string + example: Internal Login + RoleGetResponseObjectV2: + type: object + properties: + displayName: + type: string + example: loginRole + meta: + type: object + properties: + location: + type: string + example: https://api.asgardeo.io/t/{root-organization-name}/o/scim2/Roles/4645709c-ea8c-4495-8590-e1fa0efe3de0 + resourceType: + type: string + example: Role + schemas: + type: array + items: + type: string + example: urn:ietf:params:scim:schemas:extension:2.0:Role + id: + type: string + example: 4645709c-ea8c-4495-8590-e1fa0efe3de0 + audience: + type: object + properties: + value: + type: string + example: 3645709f-ea8d-5595-7690-e1fa0efe3df9 + display: + type: string + example: My Org + type: + type: string + example: organization + enum: + - application + - organization + users: + type: array + items: + type: object + properties: + $ref: + type: string + example: https://api.asgardeo.io/t/{root-organization-name}/o/scim2/Users/3a12bae9-4386-44be-befd-caf349297f45 + display: + type: string + example: kim + value: + type: string + example: 008bba85-451d-414b-87de-c03b5a1f4217 + groups: + type: array + items: + type: object + properties: + $ref: + type: string + example: https://api.asgardeo.io/t/{root-organization-name}/o/scim2/Groups/7bac6a86-1f21-4937-9fb1-5be4a93ef469 + display: + type: string + example: DEFAULT/manager + value: + type: string + example: 7bac6a86-1f21-4937-9fb1-5be4a93ef469 + permissions: + type: array + items: + type: object + properties: + value: + type: string + example: internal_login + display: + type: string + example: Internal Login + associatedApplications: + type: array + example: + - value: 9bbc6a86-1f21-4937-9fb1-5be4a93ef499 + display: XY Web Application + - value: 67bc6a86-1f21-4937-9fb1-5be4a93ef488 + display: XY Mobile Application + items: + type: object + properties: + value: + type: string + display: + type: string + properties: + type: array + items: + type: object + properties: + name: + type: string + example: isSharedRole + value: + type: string + example: 'true' + RolePostResponseObjectV2: + type: object + properties: + displayName: + type: string + example: loginRole + meta: + type: object + properties: + location: + type: string + example: >- + https://api.asgardeo.io/t/{root-organization-name}/o/scim2/v2/Roles/4645709c-ea8c-4495-8590-e1fa0efe3de0 + resourceType: + type: string + example: Role + schemas: + type: array + items: + type: string + example: urn:ietf:params:scim:schemas:extension:2.0:Role + id: + type: string + example: 4645709c-ea8c-4495-8590-e1fa0efe3de0 + audience: + type: object + properties: + value: + type: string + example: 3645709f-ea8d-5595-7690-e1fa0efe3df9 + display: + type: string + example: My App + type: + type: string + enum: + - application + - organization + example: application + RolePutRequestObjectV2: + type: object + properties: + displayName: + type: string + example: loginRole + audience: + type: object + properties: + value: + type: string + example: 3645709f-ea8d-5595-7690-e1fa0efe3df9 + display: + type: string + example: My Org + type: + type: string + example: organization + users: + type: array + items: + type: object + properties: {} + example: + value: 409ca90b-2ba6-4474-9a45-2cf7376e6e43 + groups: + type: array + items: + type: object + properties: {} + example: + value: 7bac6a86-1f21-4937-9fb1-5be4a93ef469 + permissions: + type: array + items: + type: object + properties: + value: + type: string + example: internal_login + display: + type: string + example: Internal Login + associatedApplications: + type: array + example: + - value: 9bbc6a86-1f21-4937-9fb1-5be4a93ef499 + display: XY Web Application + - value: 67bc6a86-1f21-4937-9fb1-5be4a93ef488 + display: XY Mobile Application + items: + type: object + properties: + value: + type: string + display: + type: string + RolePutResponseObjectV2: + type: object + properties: + displayName: + type: string + example: loginRole + meta: + type: object + properties: + location: + type: string + example: https://api.asgardeo.io/t/{root-organization-name}/o/scim2/Roles/4645709c-ea8c-4495-8590-e1fa0efe3de0 + resourceType: + type: string + example: Role + schemas: + type: array + items: + type: string + example: urn:ietf:params:scim:schemas:extension:2.0:Role + id: + type: string + example: 4645709c-ea8c-4495-8590-e1fa0efe3de0 + audience: + type: object + properties: + value: + type: string + example: 3645709f-ea8d-5595-7690-e1fa0efe3df9 + display: + type: string + example: My Org + type: + type: string + example: organization + enum: + - application + - organization + PatchRoleOperationRequestObjectV2: + type: object + properties: + schemas: + type: array + items: + type: string + example: urn:ietf:params:scim:api:messages:2.0:PatchOp + Operations: + type: array + example: + - op: add + path: groups + value: + - value: 7bac6a86-1f21-4937-9fb1-5be4a93ef469 + - op: add + path: users + value: + - value: 9cac6a86-1f21-4937-9fb1-5be4a93ef349 + - op: remove + path: "users[value eq 0565f472-28fe-4d93-83ad-096c66ed4a47]" + - op: remove + path: "groups[value eq 9065f445-265e-4rfg3-83ad-666c66ed4a55]" + items: + $ref: '#/components/schemas/RolePatchOperationobjV2' + RolePatchOperationobjV2: + type: object + properties: + op: + type: string + enum: + - add + - remove + - replace + path: + type: string + value: + type: array + items: + type: object + properties: + value: + type: string + PatchRoleOperationResponseObjectV2: + type: object + properties: + displayName: + type: string + example: loginRole + meta: + type: object + properties: + location: + type: string + example: https://api.asgardeo.io/t/{root-organization-name}/o/scim2/Roles/4645709c-ea8c-4495-8590-e1fa0efe3de0 + resourceType: + type: string + example: Role + schemas: + type: object + properties: {} + example: + - urn:ietf:params:scim:schemas:extension:2.0:Role + id: + type: string + example: 4645709c-ea8c-4495-8590-e1fa0efe3de0 + audience: + type: object + properties: + value: + type: string + example: 3645709f-ea8d-5595-7690-e1fa0efe3df9 + display: + type: string + example: My Org + type: + type: string + example: organization + enum: + - application + - organization + ErrorInvalidInput: + required: + - detail + - status + type: object + properties: + status: + type: string + example: "400" + schemas: + type: string + example: urn:ietf:params:scim:api:messages:2.0:Error + scimType: + type: string + example: invalidSyntax + detail: + type: string + example: "Request is unparsable, syntactically incorrect, or violates schema." + ErrorUnauthorized: + required: + - status + type: object + properties: + status: + type: string + example: "401" + schemas: + type: string + example: urn:ietf:params:scim:api:messages:2.0:Error + scimType: + type: string + example: Unauthorized + ErrorNotAcceptable: + required: + - status + type: object + properties: + status: + type: string + example: "406" + schemas: + type: string + example: urn:ietf:params:scim:api:messages:2.0:Error + scimType: + type: string + example: Not Acceptable + ErrorForbidden: + required: + - status + type: object + properties: + status: + type: string + example: "403" + schemas: + type: string + example: urn:ietf:params:scim:api:messages:2.0:Error + scimType: + type: string + example: Forbidden + ErrorNoRoleAvailable: + required: + - detail + - status + type: object + properties: + status: + type: string + example: "404" + schemas: + type: array + items: + type: string + example: urn:ietf:params:scim:api:messages:2.0:Error + detail: + type: string + example: Role not found in the system. + ErrorRoleAlreadyAvailable: + type: object + required: + - status + - schema + - detail + properties: + status: + type: string + example: '409' + schemas: + type: string + example: urn:ietf:params:scim:api:messages:2.0:Error + detail: + type: string + example: 'Role with name: Internal/loginRole already exists in the system.' + RoleSearchErrorResponseObject: + required: + - itemsPerPage + - schemas + - startIndex + - totalResults + type: object + properties: + totalResults: + type: integer + example: 0 + startIndex: + type: integer + example: 1 + itemsPerPage: + type: integer + example: 0 + schemas: + type: array + items: + type: object + example: urn:ietf:params:scim:api:messages:2.0:ListResponse + securitySchemes: + OAuth2: + type: oauth2 + flows: + authorizationCode: + authorizationUrl: https://api.asgardeo.io/t/{root-organization-name}/oauth/authorize + tokenUrl: https://api.asgardeo.io/t/{root-organization-name}/oauth/token + scopes: + read: Grants read access + write: Grants write access + admin: Grants read and write access to administrative information + description: "**Authorization code OAuth flow** + **Organization Switch**" diff --git a/docusaurus-asgardeo/static/apis/organization-apis/restapis/rule-metadata.yaml b/docusaurus-asgardeo/static/apis/organization-apis/restapis/rule-metadata.yaml new file mode 100644 index 0000000000..afa5c7204a --- /dev/null +++ b/docusaurus-asgardeo/static/apis/organization-apis/restapis/rule-metadata.yaml @@ -0,0 +1,301 @@ +openapi: 3.0.1 +info: + title: WSO2 Identity Server Rule Metadata REST API + description: "The Rule Metadata API provides the essential metadata required to configure rules dynamically based on the flow context. \nThe metadata retrieved by this API is designed to support rule configuration in the user interface (UI) by delivering information about each configurable field, the set of applicable comparison operators (e.g., equals, contains) for each field, and lists of possible values or options for fields.\n" + contact: + name: WSO2 + url: https://wso2.com/identity-and-access-management/ + license: + name: Apache 2.0 + url: https://www.apache.org/licenses/LICENSE-2.0.html + version: v1 +servers: +- url: "https://{server-url}/t/{tenant-domain}/api/server/v1" + variables: + tenant-domain: + default: carbon.super + server-url: + default: localhost:9443 +security: +- OAuth2: [] +paths: + /rules/metadata: + get: + tags: + - Metadata + summary: Get metadata for rule configuration. + description: |+ + This API provides a list of fields, associated metadata, and applicable operators for each field based on the specified flow type. This information is used to populate the UI for rule configuration. + + Scope (Permission) required: ``internal_org_rule_metadata_view`` + + operationId: getExpressionMeta + parameters: + - name: flow + in: query + description: | + Specifies the flow to retrieve rule metadata. This ensures that the metadata returned is relevant to the given flow. + + Note: At present, only the 'preUpdatePassword' and 'preUpdateProfile' flows are supported. + required: true + style: form + explode: true + schema: + type: string + enum: + - preIssueAccessToken + - preUpdatePassword + - preUpdateProfile + - preLogin + - postLogin + - inLogin + - preRegistration + - inRegistration + - inPasswordExpiry + responses: + "200": + description: Applicable fields and operators + content: + application/json: + schema: + $ref: '#/components/schemas/ExpressionMeta' + examples: + preUpdatePassword: + summary: Sample response for pre-update password flow + value: + - field: + name: flow + displayName: flow + operators: + - name: equals + displayName: equals + - name: notEquals + displayName: not equals + value: + inputType: options + valueType: string + values: + - name: adminInitiatedPasswordReset + displayName: Admin initiated password reset + - name: adminInitiatedPasswordUpdate + displayName: Admin initiated password update + - name: adminInitiatedUserInviteToSetPassword + displayName: Admin initiated user invite to set password + - name: applicationInitiatedPasswordUpdate + displayName: Application initiated password update + - name: userInitiatedPasswordReset + displayName: User initiated password reset + - name: userInitiatedPasswordUpdate + displayName: User initiated password update + - name: adminInitiatedRegistration + displayName: Admin initiated registration + - name: applicationInitiatedRegistration + displayName: Application initiated registration + - name: userInitiatedRegistration + displayName: User initiated registration + preUpdateProfile: + summary: Sample response for pre-update profile flow + value: + - field: + name: flow + displayName: flow + operators: + - name: equals + displayName: equals + - name: notEquals + displayName: not equals + value: + inputType: options + valueType: string + values: + - name: adminInitiatedProfileUpdate + displayName: Admin initiated profile update + - name: applicationInitiatedProfileUpdate + displayName: Application initiated profile update + - name: userInitiatedProfileUpdate + displayName: User initiated profile update + - field: + name: claim + displayName: claim + operators: + - name: equals + displayName: equals + - name: notEquals + displayName: not equals + value: + inputType: options + valueType: reference + valueReferenceAttribute: claimURI + valueDisplayAttribute: displayName + links: + - href: /claim-dialects/local/claims?exclude-hidden-claims=true + method: GET + rel: values + "400": + description: Bad Request + "401": + description: Unauthorized + "500": + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://localhost:9443/api/server/v1/rules/metadata?flow=preUpdatePassword' \ + -H 'Authorization: Bearer {bearer_token}' +components: + schemas: + ExpressionMeta: + type: array + description: Represents the metadata for rule expressions. It includes field definitions and associated operators. + items: + $ref: '#/components/schemas/FieldDefinition' + FieldDefinition: + type: object + properties: + field: + $ref: '#/components/schemas/Field' + operators: + type: array + description: | + Specifies the list of valid operators that can be applied to this field in rule expressions. Each operator defines a comparison or matching condition (e.g., \"equals\", \"contains\", \"greaterThan\") that determines how the field's value will be evaluated within a rule. + items: + $ref: '#/components/schemas/Operator' + value: + $ref: '#/components/schemas/Value' + Field: + type: object + properties: + name: + type: string + description: Name of the field. This is an immutable attribute and uniquely identifies the field allowed in the rule. + example: role + displayName: + type: string + description: Display name of the field. Use as a user friendly label of the field to show in UI. + example: user.role + dependantFields: + type: array + description: Lists the names of fields on which this field depends for its display or selection in the next expression. + example: [] + items: + type: string + Value: + type: object + properties: + inputType: + type: string + description: | + Defines how the field should be presented and populated in the rule configuration UI. This property indicates whether the field allows direct user input or if the values are selected from predefined options. Possible types include: + + - "input": Allows for direct user entry, such as text or numeric input. + - "options": Provides a list of selectable values, often fetched from an external data source, enabling users to pick from predefined choices. + enum: + - input + - options + valueType: + type: string + description: | + Specifies the expected data type for the field’s value within a rule expression. This property defines how the field's value should be interpreted when used in rule conditions. Possible types include: + - "string": Text value. + - "number": Numerical value. + - "boolean": True or false. + - "date": Date value. + - "reference": A reference to an external identifier, often used with options-type fields to indicate that the value is an ID or a unique attribute from related data." + enum: + - string + - number + - boolean + - date + - reference + valueReferenceAttribute: + type: string + description: "The key attribute in the options data (e.g., 'id') used to represent the option's selected value in rule expressions. Only available when 'valueType' is 'reference'." + example: id + valueDisplayAttribute: + type: string + description: "The attribute to show as the label for each option in the dropdown (e.g., 'name') when listing options. Only available when 'valueType' is 'reference'." + example: name + links: + type: array + description: Endpoints to retrieve or search for options dynamically. Included only when 'valueType' is 'reference'. + example: + - href: /scim2/roles?offset=0&limit=10 + method: GET + rel: values + - href: /scim2/roles/.search + method: GET + rel: filter + items: + $ref: '#/components/schemas/Link' + values: + type: array + description: "List of selectable values for options fields when 'valueType' is 'string', 'number', 'boolean', or 'date'." + items: + $ref: '#/components/schemas/ValueObject' + Operator: + type: object + properties: + name: + type: string + description: Name of the operator. The immutable identifier of the operator referenced within the rule expression. + displayName: + type: string + description: Display name of the operator. Use as a user friendly label of the operator to show in UI. + ValueObject: + type: object + properties: + name: + type: string + description: The name that uniquely identifies the option. + displayName: + type: string + description: The display name for the option. + Link: + type: object + properties: + href: + type: string + description: Url of the endpoint. + method: + type: string + description: Http method. + enum: + - GET + rel: + type: string + description: Indicates the endpoint’s relation to retrieving or filtering field values. + enum: + - values + - filter + Error: + type: object + properties: + code: + type: string + description: Error code + example: RMS-00000 + message: + type: string + description: Error message. + example: Some error message. + description: + type: string + description: Detailed error description. + example: Some error description. + traceId: + type: string + description: Trace identifier to refer at troubleshooting logs to troubleshoot the problem. + example: e0fbcfeb-3617-43c4-8dd0-7b7d38e13047 + securitySchemes: + OAuth2: + type: oauth2 + flows: + authorizationCode: + authorizationUrl: https://localhost:9443/oauth2/authorize + tokenUrl: https://localhost:9443/oauth2/token + scopes: + read: internal_rule_metadata_view diff --git a/docusaurus-asgardeo/static/apis/organization-apis/restapis/scim-bulk.yaml b/docusaurus-asgardeo/static/apis/organization-apis/restapis/scim-bulk.yaml new file mode 100644 index 0000000000..e7ee41952a --- /dev/null +++ b/docusaurus-asgardeo/static/apis/organization-apis/restapis/scim-bulk.yaml @@ -0,0 +1,193 @@ +openapi: 3.0.1 +info: + title: SCIM 2.0 Bulk API + description: | + This document specifies **Organization level SCIM 2.0 Bulk Resource Management RESTful API** for Asgardeo. + version: "v1" +servers: + - url: https://api.asgardeo.io/t/{organization-name}/o/scim2 + +security: + - OAuth2: [] + +paths: + /Bulk: + post: + tags: + - Bulk Endpoint + summary: Create, Update, Delete Users and Groups in bulk and update Roles in bulk + description: | + This API is used to create/update/replace/delete SCIM resources in bulk. You need to specify different operations in the request payload corresponding to the type of bulk update:
    + - **POST** operation: Adds new resources. + - **PUT** operation: Replaces an existing resource. + - **PATCH** operation: Updates attributes of an existing resource. + - **DELETE** operation: Removes an existing resource. + Learn more about [defining batch operations](../../scim2-batch-operations). + + Scopes required: ``internal_org_bulk_resource_create`` or a [operation-wise scope](../../../scim2/scim2-batch-operations/#scopepermission-required-for-batch-operations) + operationId: createBulkUsers + requestBody: + content: + application/scim+json: + schema: + $ref: '#/components/schemas/BulkUserRequestObject' + required: false + responses: + 201: + description: Valid user is created + content: + application/scim+json: + schema: + $ref: '#/components/schemas/BulkUserResponseObject' + 401: + description: Unauthorized + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUnauthorized' + 403: + description: Forbidden + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorForbidden' + 409: + description: Users already exists + content: {} + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{organization-name}/o/scim2/Bulk' \ + -H 'accept: application/scim+json' \ + -H 'Content-Type: application/scim+json' \ + -H 'Authorization: Bearer {bearer_token}' + -d '{ + "failOnErrors": 1, + "schemas": [ + "urn:ietf:params:scim:api:messages:2.0:BulkRequest" + ], + "Operations": [ + { + "method": "POST", + "path": "/Users", + "bulkId": "ytrewq", + "data": { + "schemas": [ + "urn:ietf:params:scim:schemas:core:2.0:User" + ], + "username": "jesse", + "password": "jesspass" + "userstore": "DEFAULT" + } + } + ] + }' + x-codegen-request-body-name: body +components: + schemas: + BulkUserRequestObject: + type: object + properties: + failOnErrors: + type: integer + example: 1 + schemas: + type: array + items: + type: string + example: urn:ietf:params:scim:api:messages:2.0:BulkRequest + Operations: + type: array + items: + $ref: '#/components/schemas/BulkUserOb' + BulkUserOb: + type: object + properties: + method: + type: string + example: POST + path: + type: string + example: /Users + bulkId: + type: string + example: ytrewq + data: + type: object + properties: + schemas: + type: array + items: + type: string + example: urn:ietf:params:scim:schemas:core:2.0:User + username: + type: string + example: jesse + password: + type: string + example: jesspass + BulkUserResponseObject: + type: object + properties: + schemas: + type: array + items: + type: string + example: urn:ietf:params:scim:api:messages:2.0:BulkResponse + Operations: + $ref: '#/components/schemas/OperationObBulk' + OperationObBulk: + type: object + properties: + bulkId: + type: string + example: qwerty + method: + type: string + example: POST + location: + type: string + example: https://api.asgardeo.io/t/{organization-name}/scim2/Users/81cbba1b-c259-485d-8ba4-79afb03e5bd1 + status: + type: object + properties: + code: + type: string + example: "201" + ErrorUnauthorized: + required: + - status + type: object + properties: + status: + type: string + example: "401" + schemas: + type: string + example: urn:ietf:params:scim:api:messages:2.0:Error + scimType: + type: string + example: Unauthorized + ErrorForbidden: + required: + - status + type: object + properties: + status: + type: string + example: "403" + schemas: + type: string + example: urn:ietf:params:scim:api:messages:2.0:Error + scimType: + type: string + example: Forbidden + securitySchemes: + OAuth2: + type: oauth2 + flows: + authorizationCode: + authorizationUrl: https://api.asgardeo.io/t/{organization-name}/oauth/authorize + tokenUrl: https://api.asgardeo.io/t/{organization-name}/oauth/token + scopes: {} diff --git a/docusaurus-asgardeo/static/apis/organization-apis/restapis/verification-code-management.yaml b/docusaurus-asgardeo/static/apis/organization-apis/restapis/verification-code-management.yaml new file mode 100644 index 0000000000..f7eeb86092 --- /dev/null +++ b/docusaurus-asgardeo/static/apis/organization-apis/restapis/verification-code-management.yaml @@ -0,0 +1,175 @@ +openapi: 3.1.0 +info: + title: Verification Code Management API + description: | + This API manages verification codes for various verification scenarios including validation and resending. + version: 1.0.0 +servers: + - url: https://api.asgardeo.io/t/{organization-name}/o/api/identity/user/v1.0 +security: + - OAuth2: [] +paths: + /validate-code: + post: + tags: + - Verification Code + summary: Validate code + description: | + This API is used to validate the code generated during the verification process associated with a user. + + Scope(Permission) required: `internal_org_user_code_mgt_create` + operationId: validateCode + requestBody: + description: The validation code retrieved for the verification scenario, and optional property parameters. + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/CodeValidationRequest' + responses: + '202': + description: Accepted + content: {} + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X POST \ + -H "Authorization: Bearer " \ + -H "Content-Type: application/json" \ + -d '{ + "code": "string", + "properties": [] + }' \ + "https://api.asgardeo.io/t/{organization-name}/o/api/identity/user/v1.0/validate-code" + /resend-code: + post: + tags: + - Verification Code + summary: Resend code + description: | + This API is used to resend the confirmation code if it is missing. + + Scope(Permission) required: `internal_org_user_code_mgt_create` + operationId: resendCode + requestBody: + description: User information and optional property parameters to resend the verification code. + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/ResendCodeRequest' + responses: + '201': + description: Created + content: {} + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X POST \ + -H 'Authorization: Bearer ' \ + -H 'Content-Type: application/json' \ + -d '{ + "user": { + "username": "string", + "realm": "string" + }, + "properties": [ + { + "key": "string", + "value": "string" + } + ] + }' \ + 'https://api.asgardeo.io/t/{organization-name}/o/api/identity/user/v1.0/resend-code' +components: + schemas: + CodeValidationRequest: + type: object + properties: + code: + type: string + properties: + type: array + items: + $ref: '#/components/schemas/Property' + Error: + type: object + properties: + code: + type: string + message: + type: string + description: + type: string + traceId: + type: string + Property: + type: object + properties: + key: + type: string + value: + type: string + ResendCodeRequest: + type: object + properties: + user: + $ref: '#/components/schemas/User' + properties: + type: array + items: + $ref: '#/components/schemas/Property' + User: + type: object + properties: + username: + type: string + realm: + type: string + securitySchemes: + OAuth2: + type: oauth2 + flows: + authorizationCode: + authorizationUrl: 'https://api.asgardeo.io/t/{organization-name}/oauth2/authorize' + tokenUrl: 'https://api.asgardeo.io/t/{organization-name}/oauth2/token' + scopes: { + internal_org_user_code_mgt_create: Grants create access to user code management in the organization + } + description: "**Authorization code OAuth flow** + **Organization Switch**" diff --git a/docusaurus-asgardeo/static/apis/restapis/actions.yaml b/docusaurus-asgardeo/static/apis/restapis/actions.yaml new file mode 100644 index 0000000000..b4eea16bb4 --- /dev/null +++ b/docusaurus-asgardeo/static/apis/restapis/actions.yaml @@ -0,0 +1,1683 @@ +openapi: 3.0.0 +info: + version: v1 + title: Asgardeo - Action Management Rest API + description: > + The Action Management REST API provides a comprehensive interface to manage actions + within the Asgardeo. Actions enable the extension of product functionality + across various workflows, such as access token issuance, password updates, and profile updates. + This API helps developers and administrators to define and manage actions to meet specific + business needs. +servers: + - url: 'https://api.asgardeo.io/t/{organization-name}/api/server/v1' +security: + - OAuth2: [] +paths: + /actions/types: + get: + tags: + - Action Types + summary: List Action Types + description: "This API returns the detailed summary of the action types.\n\n + Scope (Permission) required: ``internal_action_mgt_view``\n\n" + operationId: getActionTypes + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/ActionTypesResponse' + example: + - type: PRE_ISSUE_ACCESS_TOKEN + displayName: Pre Issue Access Token + description: This action invokes before issuing an access token. + count: 1 + self: "/api/server/v1/actions/preIssueAccessToken" + - type: PRE_UPDATE_PASSWORD + displayName: Pre Update Password + description: This action invokes before updating a user password. + count: 1 + self: "/api/server/v1/actions/preUpdatePassword" + - type: PRE_UPDATE_PROFILE + displayName: Pre Update Profile + description: This action invokes before updating a user profile. + count: 1 + self: "/api/server/v1/actions/preUpdateProfile" + '401': + description: Unauthorized + '403': + description: Forbidden + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/actions/types' \ + -H 'Authorization: Bearer {bearer_token}' + + /actions/{actionType}: + post: + tags: + - Actions + summary: Add Action + description: "This API creates an action and returns the action details along with the action's unique ID.\n\n + Scope (Permission) required: ``internal_action_mgt_create``\n\n" + operationId: createAction + parameters: + - name: actionType + in: path + description: Name of the Action Type. + required: true + schema: + enum: + - preIssueAccessToken + - preUpdatePassword + - preUpdateProfile + - preRegistration + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ActionModel' + examples: + preIssueAccessToken: + summary: Sample payload for pre issue access token action + value: + name: Pre Issue Access Token + description: This action invokes before issuing an access token. + endpoint: + uri: https://myextension.com/token + authentication: + properties: + username: auth_username + password: auth_password + type: BASIC + allowedHeaders: + - x-geo-location + - host + allowedParameters: + - device-id + rule: + condition: OR + rules: + - condition: AND + expressions: + - field: application + operator: equals + value: 29ed9110-d0eb-48e3-918c-4832e8c9c81f + - field: grantType + operator: notEquals + value: authorization_code + - condition: AND + expressions: + - field: grantType + operator: equals + value: client_credentials + preUpdatePassword: + summary: Sample payload for pre update password action + value: + name: Password Update Action + description: This action invokes before updating a user password. + endpoint: + uri: https://myextension.com/pre-update-password + authentication: + properties: + header: x-api-key + value: e12595c1-1435-4bf2-94e8-445135ab505a + type: API_KEY + passwordSharing: + format: SHA256_HASHED + certificate: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURxRENDQXBDZ0F3SUJBZ0lFWlhCR0NUQU5CZ2txaGtpRzl3MEJBUXNGQURCaU1Rc3dDUVlEVlFRR0V3SlYNClV6RUxNQWtHQTFVRUNBd0NRMEV4RkRBU0JnTlZCQWNNQzFOaGJuUmhJRU5zWVhKaE1RMHdDd1lEVlFRS0RBUlgNClUwOHlNUTB3Q3dZRFZRUUxEQVJYVTA4eU1SSXdFQVlEVlFRRERBbHNiMk5oYkdodmMzUXdIaGNOTWpNeE1qQTINCk1EazFPVE0zV2hjTk1qVXdNVEEzTURrMU9UTTNXakJpTVFzd0NRWURWUVFHRXdKVlV6RUxNQWtHQTFVRUNBd0MNClEwRXhGREFTQmdOVkJBY01DMU5oYm5SaElFTnNZWEpoTVEwd0N3WURWUVFLREFSWFUwOHlNUTB3Q3dZRFZRUUwNCkRBUlhVMDh5TVJJd0VBWURWUVFEREFsc2IyTmhiR2h2YzNRd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUINCkR3QXdnZ0VLQW9JQkFRQ2E0amx3OEtyWHMzOTZTdktmVFEwMkllUm9hWnF1ZWtvSlNpdzBsOWU5QkkyRWF2blQNCkc4SnlvcDh6MnJPcjZDNmpqZGdVeXR6NWpCaG9wYmdmeHJQMmkwTkd1akpGTE5uU1U4cmNoRDJUSjlRbzh0V3YNCmZqQUtDL1VsUnhTb0VyT1RkejdYUzFDY1BmNm9RZk56TVo2QnkyOXpmSVN1QytyV25qTHFUM002ejBGMGIzK20NCm9paVpmUTA1RjAwaHd6U0U5V0JsTCtHUnh3cHlRUVl3c2JHZlordmlJM0VHdjdzUnYreHFwTFBoVzVTTHpoR3oNCnNaaTlDME0wRzFqYnZWMWQrUFkwTVRoRTYwcmthdmpNKytSUkJlc29pNUprblprc0F0OWhPcXhZM0ExSU1kREENCk5wZEtxaGRGMWFBeURYK3ZUWkZySGZMc3VFQmVjNVBwM3RJWEFnTUJBQUdqWmpCa01BNEdBMVVkRHdFQi93UUUNCkF3SUU4REFVQmdOVkhSRUVEVEFMZ2dsc2IyTmhiR2h2YzNRd0hRWURWUjBPQkJZRUZIWFhWMm5sb2ZoaThXd2oNCncwRW9hRlNZbldiU01CMEdBMVVkSlFRV01CUUdDQ3NHQVFVRkJ3TUJCZ2dyQmdFRkJRY0RBakFOQmdrcWhraUcNCjl3MEJBUXNGQUFPQ0FRRUFSZThESThuNzJlVWxReTlHU3BpeXh2OFFVSEZkaVFhMW5CVzluVlRaZHlKb1NYMHENCmg2TjN4Vk5KWFIzL3pMdkw4TUJWTXZqa3QwT1FxdkVpeWp3bkVXTzZEYnhUUnIzdmRmK3J2NVZ3ZGtZbjRNY00NCkt4NHhGOFphZzh4aHlhWXFVUXpRWG5nNTFyVjErYzR1elh1Z0VoRTVTemRESFlFWHpYNmpvWklnMXlOK2hFUGMNCjc3UlpKSkhtd0lRclRkM2JuWnB5dEI2UmRCam5qU3loMEJlSGxKUUdtUHhvbXhZQVMxaFZzelJkZld0cnhEQUINCmZsSUppbUppSGgzZHlrY3lObHJ3QnU5MDNwTWRVR1FHcXNVeUVqaEZkN3M0QXp1cVlISnI1cll5OTUwZGY5SWINCllTaHUyWWZsVkVzV1pxSlI2MkNpYldCY0pLeUhQWW10QzBjU1JRPT0NCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K + attributes: + - http://wso2.org/claims/givenname + - http://wso2.org/claims/dob + rule: + condition: OR + rules: + - condition: AND + expressions: + - field: flow + operator: equals + value: adminInitiatedPasswordReset + - field: flow + operator: notEquals + value: adminInitiatedPasswordUpdate + - condition: AND + expressions: + - field: flow + operator: equals + value: userInitiatedPasswordReset + preUpdateProfile: + summary: Sample payload for pre update profile action + value: + name: Profile Update Action + description: This action invokes before updating a user profile. + endpoint: + uri: https://myextension.com/pre-update-profile + authentication: + properties: + header: x-api-key + value: e12595c1-1435-4bf2-94e8-445135ab505a + type: API_KEY + attributes: + - http://wso2.org/claims/givenname + - http://wso2.org/claims/dob + rule: + condition: OR + rules: + - condition: AND + expressions: + - field: flow + operator: equals + value: adminInitiatedProfileUpdate + - field: claim + operator: notEquals + value: http://wso2.org/claims/country + - condition: AND + expressions: + - field: flow + operator: equals + value: userInitiatedProfileUpdate + description: This represents the information of the action to be created. + required: true + responses: + '201': + description: Action Created + content: + application/json: + schema: + $ref: '#/components/schemas/ActionResponse' + examples: + preIssueAccessToken: + summary: Sample response for pre issue access token action + value: + id: 24f64d17-9824-4e28-8413-de45728d8e84 + name: Pre Issue Access Token + description: This action invokes before issuing an access token. + status: INACTIVE + createdAt: 2025-08-01T12:00:00Z + updatedAt: 2025-09-01T13:00:00Z + endpoint: + uri: https://myextension.com/token + authentication: + type: BASIC + allowedHeaders: + - x-geo-location + - host + allowedParameters: + - device-id + rule: + condition: OR + rules: + - condition: AND + expressions: + - field: application + operator: equals + value: 29ed9110-d0eb-48e3-918c-4832e8c9c81f + - field: grantType + operator: notEquals + value: authorization_code + - condition: AND + expressions: + - field: grantType + operator: equals + value: client_credentials + preUpdatePassword: + summary: Sample response for pre update password action + value: + id: 24f64d17-9824-4e28-8413-de45728d8e84 + name: Password Update Action + description: This action invokes before updating a user password. + status: INACTIVE + createdAt: 2025-08-01T12:00:00Z + updatedAt: 2025-09-01T13:00:00Z + endpoint: + uri: https://myextension.com/pre-update-password + authentication: + type: API_KEY + passwordSharing: + format: SHA256_HASHED + certificate: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURxRENDQXBDZ0F3SUJBZ0lFWlhCR0NUQU5CZ2txaGtpRzl3MEJBUXNGQURCaU1Rc3dDUVlEVlFRR0V3SlYNClV6RUxNQWtHQTFVRUNBd0NRMEV4RkRBU0JnTlZCQWNNQzFOaGJuUmhJRU5zWVhKaE1RMHdDd1lEVlFRS0RBUlgNClUwOHlNUTB3Q3dZRFZRUUxEQVJYVTA4eU1SSXdFQVlEVlFRRERBbHNiMk5oYkdodmMzUXdIaGNOTWpNeE1qQTINCk1EazFPVE0zV2hjTk1qVXdNVEEzTURrMU9UTTNXakJpTVFzd0NRWURWUVFHRXdKVlV6RUxNQWtHQTFVRUNBd0MNClEwRXhGREFTQmdOVkJBY01DMU5oYm5SaElFTnNZWEpoTVEwd0N3WURWUVFLREFSWFUwOHlNUTB3Q3dZRFZRUUwNCkRBUlhVMDh5TVJJd0VBWURWUVFEREFsc2IyTmhiR2h2YzNRd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUINCkR3QXdnZ0VLQW9JQkFRQ2E0amx3OEtyWHMzOTZTdktmVFEwMkllUm9hWnF1ZWtvSlNpdzBsOWU5QkkyRWF2blQNCkc4SnlvcDh6MnJPcjZDNmpqZGdVeXR6NWpCaG9wYmdmeHJQMmkwTkd1akpGTE5uU1U4cmNoRDJUSjlRbzh0V3YNCmZqQUtDL1VsUnhTb0VyT1RkejdYUzFDY1BmNm9RZk56TVo2QnkyOXpmSVN1QytyV25qTHFUM002ejBGMGIzK20NCm9paVpmUTA1RjAwaHd6U0U5V0JsTCtHUnh3cHlRUVl3c2JHZlordmlJM0VHdjdzUnYreHFwTFBoVzVTTHpoR3oNCnNaaTlDME0wRzFqYnZWMWQrUFkwTVRoRTYwcmthdmpNKytSUkJlc29pNUprblprc0F0OWhPcXhZM0ExSU1kREENCk5wZEtxaGRGMWFBeURYK3ZUWkZySGZMc3VFQmVjNVBwM3RJWEFnTUJBQUdqWmpCa01BNEdBMVVkRHdFQi93UUUNCkF3SUU4REFVQmdOVkhSRUVEVEFMZ2dsc2IyTmhiR2h2YzNRd0hRWURWUjBPQkJZRUZIWFhWMm5sb2ZoaThXd2oNCncwRW9hRlNZbldiU01CMEdBMVVkSlFRV01CUUdDQ3NHQVFVRkJ3TUJCZ2dyQmdFRkJRY0RBakFOQmdrcWhraUcNCjl3MEJBUXNGQUFPQ0FRRUFSZThESThuNzJlVWxReTlHU3BpeXh2OFFVSEZkaVFhMW5CVzluVlRaZHlKb1NYMHENCmg2TjN4Vk5KWFIzL3pMdkw4TUJWTXZqa3QwT1FxdkVpeWp3bkVXTzZEYnhUUnIzdmRmK3J2NVZ3ZGtZbjRNY00NCkt4NHhGOFphZzh4aHlhWXFVUXpRWG5nNTFyVjErYzR1elh1Z0VoRTVTemRESFlFWHpYNmpvWklnMXlOK2hFUGMNCjc3UlpKSkhtd0lRclRkM2JuWnB5dEI2UmRCam5qU3loMEJlSGxKUUdtUHhvbXhZQVMxaFZzelJkZld0cnhEQUINCmZsSUppbUppSGgzZHlrY3lObHJ3QnU5MDNwTWRVR1FHcXNVeUVqaEZkN3M0QXp1cVlISnI1cll5OTUwZGY5SWINCllTaHUyWWZsVkVzV1pxSlI2MkNpYldCY0pLeUhQWW10QzBjU1JRPT0NCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K + attributes: + - http://wso2.org/claims/givenname + - http://wso2.org/claims/dob + rule: + condition: OR + rules: + - condition: AND + expressions: + - field: flow + operator: equals + value: adminInitiatedPasswordReset + - field: flow + operator: notEquals + value: adminInitiatedPasswordUpdate + - condition: AND + expressions: + - field: flow + operator: equals + value: userInitiatedPasswordReset + preUpdateProfile: + summary: Sample response for pre update profile action + value: + id: 24f64d17-9824-4e28-8413-de45728d8e84 + name: Profile Update Action + description: This action invokes before updating a user profile. + status: INACTIVE + createdAt: 2025-08-01T12:00:00Z + updatedAt: 2025-09-01T13:00:00Z + endpoint: + uri: https://myextension.com/pre-update-profile + authentication: + type: API_KEY + attributes: + - http://wso2.org/claims/givenname + - http://wso2.org/claims/dob + rule: + condition: OR + rules: + - condition: AND + expressions: + - field: flow + operator: equals + value: adminInitiatedProfileUpdate + - field: claim + operator: notEquals + value: http://wso2.org/claims/country + - condition: AND + expressions: + - field: flow + operator: equals + value: userInitiatedProfileUpdate + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '501': + description: Not Implemented + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl - preIssueAccessToken + source: | + curl --location 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/actions/preIssueAccessToken' \ + -H 'Authorization: Bearer {bearer_token}' \ + -H 'Content-Type: application/json' \ + -d '{ + "name": "Pre Issue Access Token", + "description": "This action invokes before issuing an access token.", + "endpoint": { + "uri": "https://myextension.com/token", + "authentication": { + "properties": { + "username": "auth_username", + "password": "auth_password" + }, + "type": "BASIC" + }, + "allowedHeaders": [ "x-geo-location", "host" ], + "allowedParameters": [ "device-id" ] + } + }' + - lang: Curl - preUpdatePassword + source: | + curl --location 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/actions/preUpdatePassword' \ + -H 'Authorization: Bearer {bearer_token}' \ + -H 'Content-Type: application/json' \ + -d '{ + "name": "Password Update Action", + "description": "This action invokes before updating a user password.", + "endpoint": { + "uri": "https://myextension.com/pre-update-password", + "authentication": { + "properties": { + "header": "x-api-key", + "value": "e12595c1-1435-4bf2-94e8-445135ab505a" + }, + "type": "API_KEY" + } + }, + "passwordSharing": { + "format": "SHA256_HASHED" + }, + "attributes": ["http://wso2.org/claims/givenname", "http://wso2.org/claims/dob"] + }' + - lang: Curl - preUpdateProfile + source: | + curl --location 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/actions/preUpdateProfile' \ + -H 'Authorization: Bearer {bearer_token}' \ + -H 'Content-Type: application/json' \ + -d '{ + "name": "Profile Update Action", + "description": "This action invokes before updating a user profile.", + "endpoint": { + "uri": "https://myextension.com/pre-update-profile", + "authentication": { + "properties": { + "header": "x-api-key", + "value": "e12595c1-1435-4bf2-94e8-445135ab505a" + }, + "type": "API_KEY" + } + }, + "attributes": ["http://wso2.org/claims/givenname", "http://wso2.org/claims/dob"] + }' + x-codegen-request-body-name: body + + get: + tags: + - Actions + summary: List Actions + description: "This API returns actions according to the action type. \n\n + Scope (Permission) required: ``internal_action_mgt_view``\n\n" + operationId: getActionsByActionType + parameters: + - name: actionType + in: path + description: Name of the Action Type. + required: true + schema: + enum: + - preIssueAccessToken + - preUpdatePassword + - preUpdateProfile + - preRegistration + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/ActionResponseList' + examples: + preIssueAccessToken: + summary: Sample response for pre issue access token action + value: + - id: 24f64d17-9824-4e28-8413-de45728d8e84 + type: PRE_ISSUE_ACCESS_TOKEN + name: Pre Issue Access Token + description: This action invokes before issuing an access token. + status: ACTIVE + createdAt: 2025-08-01T12:00:00Z + updatedAt: 2025-09-01T13:00:00Z + links: + - href: "/api/server/v1/actions/preIssueAccessToken/24f64d17-9824-4e28-8413-de45728d8e84" + method: GET + rel: self + preUpdatePassword: + summary: Sample response for pre update password action + value: + - id: 24f64d17-9824-4e28-8413-de45728d8e84 + type: PRE_UPDATE_PASSWORD + name: Password Update Action + description: This action invokes before updating a user password. + status: ACTIVE + createdAt: 2025-08-01T12:00:00Z + updatedAt: 2025-09-01T13:00:00Z + links: + - href: "/api/server/v1/actions/preUpdatePassword/24f64d17-9824-4e28-8413-de45728d8e84" + method: GET + rel: self + preUpdateProfile: + summary: Sample response for pre update profile action + value: + - id: 24f64d17-9824-4e28-8413-de45728d8e84 + type: PRE_UPDATE_PROFILE + name: Profile Update Action + description: This action invokes before updating a user profile. + status: ACTIVE + createdAt: 2025-08-01T12:00:00Z + updatedAt: 2025-09-01T13:00:00Z + links: + - href: "/api/server/v1/actions/preUpdateProfile/24f64d17-9824-4e28-8413-de45728d8e84" + method: GET + rel: self + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '501': + description: Not Implemented + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/actions/{actionType}' \ + -H 'Authorization: Bearer {bearer_token}' + + /actions/{actionType}/{actionId}: + get: + tags: + - Actions + operationId: getActionByActionId + summary: Retrieve Action by ID + description: "This API provides the capability to retrieve the action by action Id. \n\n + Scope (Permission) required: ``internal_action_mgt_view``\n\n" + parameters: + - name: actionType + in: path + description: Name of the Action Type. + required: true + schema: + enum: + - preIssueAccessToken + - preUpdatePassword + - preUpdateProfile + - preRegistration + - name: actionId + in: path + description: Unique identifier of the action. + required: true + schema: + type: string + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/ActionResponse' + examples: + preIssueAccessToken: + summary: Sample response for pre issue access token action + value: + id: 24f64d17-9824-4e28-8413-de45728d8e84 + type: PRE_ISSUE_ACCESS_TOKEN + name: Pre Issue Access Token + description: This action invokes before issuing an access token. + status: ACTIVE + createdAt: 2025-08-01T12:00:00Z + updatedAt: 2025-09-01T13:00:00Z + endpoint: + uri: https://myextension.com/token + authentication: + type: BASIC + allowedHeaders: + - x-geo-location + - host + allowedParameters: + - device-id + rule: + condition: OR + rules: + - condition: AND + expressions: + - field: application + operator: equals + value: 29ed9110-d0eb-48e3-918c-4832e8c9c81f + - field: grantType + operator: notEquals + value: authorization_code + - condition: AND + expressions: + - field: grantType + operator: equals + value: client_credentials + preUpdatePassword: + summary: Sample response for pre update password action + value: + id: 24f64d17-9824-4e28-8413-de45728d8e84 + type: PRE_UPDATE_PASSWORD + name: Password Update Action + description: This action invokes before updating a user password. + status: ACTIVE + createdAt: 2025-08-01T12:00:00Z + updatedAt: 2025-09-01T13:00:00Z + endpoint: + uri: https://myextension.com/pre-update-password + authentication: + type: API_KEY + passwordSharing: + format: SHA256_HASHED + certificate: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURxRENDQXBDZ0F3SUJBZ0lFWlhCR0NUQU5CZ2txaGtpRzl3MEJBUXNGQURCaU1Rc3dDUVlEVlFRR0V3SlYNClV6RUxNQWtHQTFVRUNBd0NRMEV4RkRBU0JnTlZCQWNNQzFOaGJuUmhJRU5zWVhKaE1RMHdDd1lEVlFRS0RBUlgNClUwOHlNUTB3Q3dZRFZRUUxEQVJYVTA4eU1SSXdFQVlEVlFRRERBbHNiMk5oYkdodmMzUXdIaGNOTWpNeE1qQTINCk1EazFPVE0zV2hjTk1qVXdNVEEzTURrMU9UTTNXakJpTVFzd0NRWURWUVFHRXdKVlV6RUxNQWtHQTFVRUNBd0MNClEwRXhGREFTQmdOVkJBY01DMU5oYm5SaElFTnNZWEpoTVEwd0N3WURWUVFLREFSWFUwOHlNUTB3Q3dZRFZRUUwNCkRBUlhVMDh5TVJJd0VBWURWUVFEREFsc2IyTmhiR2h2YzNRd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUINCkR3QXdnZ0VLQW9JQkFRQ2E0amx3OEtyWHMzOTZTdktmVFEwMkllUm9hWnF1ZWtvSlNpdzBsOWU5QkkyRWF2blQNCkc4SnlvcDh6MnJPcjZDNmpqZGdVeXR6NWpCaG9wYmdmeHJQMmkwTkd1akpGTE5uU1U4cmNoRDJUSjlRbzh0V3YNCmZqQUtDL1VsUnhTb0VyT1RkejdYUzFDY1BmNm9RZk56TVo2QnkyOXpmSVN1QytyV25qTHFUM002ejBGMGIzK20NCm9paVpmUTA1RjAwaHd6U0U5V0JsTCtHUnh3cHlRUVl3c2JHZlordmlJM0VHdjdzUnYreHFwTFBoVzVTTHpoR3oNCnNaaTlDME0wRzFqYnZWMWQrUFkwTVRoRTYwcmthdmpNKytSUkJlc29pNUprblprc0F0OWhPcXhZM0ExSU1kREENCk5wZEtxaGRGMWFBeURYK3ZUWkZySGZMc3VFQmVjNVBwM3RJWEFnTUJBQUdqWmpCa01BNEdBMVVkRHdFQi93UUUNCkF3SUU4REFVQmdOVkhSRUVEVEFMZ2dsc2IyTmhiR2h2YzNRd0hRWURWUjBPQkJZRUZIWFhWMm5sb2ZoaThXd2oNCncwRW9hRlNZbldiU01CMEdBMVVkSlFRV01CUUdDQ3NHQVFVRkJ3TUJCZ2dyQmdFRkJRY0RBakFOQmdrcWhraUcNCjl3MEJBUXNGQUFPQ0FRRUFSZThESThuNzJlVWxReTlHU3BpeXh2OFFVSEZkaVFhMW5CVzluVlRaZHlKb1NYMHENCmg2TjN4Vk5KWFIzL3pMdkw4TUJWTXZqa3QwT1FxdkVpeWp3bkVXTzZEYnhUUnIzdmRmK3J2NVZ3ZGtZbjRNY00NCkt4NHhGOFphZzh4aHlhWXFVUXpRWG5nNTFyVjErYzR1elh1Z0VoRTVTemRESFlFWHpYNmpvWklnMXlOK2hFUGMNCjc3UlpKSkhtd0lRclRkM2JuWnB5dEI2UmRCam5qU3loMEJlSGxKUUdtUHhvbXhZQVMxaFZzelJkZld0cnhEQUINCmZsSUppbUppSGgzZHlrY3lObHJ3QnU5MDNwTWRVR1FHcXNVeUVqaEZkN3M0QXp1cVlISnI1cll5OTUwZGY5SWINCllTaHUyWWZsVkVzV1pxSlI2MkNpYldCY0pLeUhQWW10QzBjU1JRPT0NCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K + attributes: + - http://wso2.org/claims/givenname + - http://wso2.org/claims/dob + rule: + condition: OR + rules: + - condition: AND + expressions: + - field: flow + operator: equals + value: adminInitiatedPasswordReset + - field: flow + operator: notEquals + value: adminInitiatedPasswordUpdate + - condition: AND + expressions: + - field: flow + operator: equals + value: userInitiatedPasswordReset + preUpdateProfile: + summary: Sample response for pre update profile action + value: + id: 24f64d17-9824-4e28-8413-de45728d8e84 + type: PRE_UPDATE_PROFILE + name: Profile Update Action + description: This action invokes before updating a user profile. + status: ACTIVE + createdAt: 2025-08-01T12:00:00Z + updatedAt: 2025-09-01T13:00:00Z + endpoint: + uri: https://myextension.com/pre-update-profile + authentication: + type: API_KEY + attributes: + - http://wso2.org/claims/givenname + - http://wso2.org/claims/dob + rule: + condition: OR + rules: + - condition: AND + expressions: + - field: flow + operator: equals + value: adminInitiatedProfileUpdate + - field: claim + operator: notEquals + value: http://wso2.org/claims/country + - condition: AND + expressions: + - field: flow + operator: equals + value: userInitiatedProfileUpdate + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '501': + description: Not Implemented + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/actions/{actionType}/{actionId}' \ + -H 'Authorization: Bearer {bearer_token}' + patch: + tags: + - Actions + summary: Update Action + description: "This API updates an action and return the updated action. \n\n + Scope (Permission) required: ``internal_action_mgt_update``\n\n" + operationId: updateAction + parameters: + - name: actionType + in: path + description: Name of the Action Type. + required: true + schema: + enum: + - preIssueAccessToken + - preUpdatePassword + - preUpdateProfile + - preRegistration + - name: actionId + in: path + description: Unique identifier of the action. + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ActionUpdateModel' + examples: + preIssueAccessToken: + summary: Sample payload for pre issue access token action update + value: + name: Updated Pre Issue Access Token + description: This action invokes before issuing an access token. + endpoint: + uri: https://myextension.com/external/token + authentication: + properties: + token: 346dfbb5-6a8c-447a-9aaa-88fa2dd95962 + type: BEARER + allowedHeaders: + - x-geo-location + - host + allowedParameters: + - device-id + rule: + condition: OR + rules: + - condition: AND + expressions: + - field: application + operator: equals + value: 29ed9110-d0eb-48e3-918c-4832e8c9c81f + - field: grantType + operator: notEquals + value: password + preUpdatePassword: + summary: Sample payload for pre update password action update + value: + name: Updated Password Update Action + description: This action invokes before updating a user password. + endpoint: + uri: https://myextension.com/external/pre-update-password + authentication: + properties: {} + type: NONE + passwordSharing: + format: PLAIN_TEXT + certificate: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURxRENDQXBDZ0F3SUJBZ0lFWlhCR0NUQU5CZ2txaGtpRzl3MEJBUXNGQURCaU1Rc3dDUVlEVlFRR0V3SlYNClV6RUxNQWtHQTFVRUNBd0NRMEV4RkRBU0JnTlZCQWNNQzFOaGJuUmhJRU5zWVhKaE1RMHdDd1lEVlFRS0RBUlgNClUwOHlNUTB3Q3dZRFZRUUxEQVJYVTA4eU1SSXdFQVlEVlFRRERBbHNiMk5oYkdodmMzUXdIaGNOTWpNeE1qQTINCk1EazFPVE0zV2hjTk1qVXdNVEEzTURrMU9UTTNXakJpTVFzd0NRWURWUVFHRXdKVlV6RUxNQWtHQTFVRUNBd0MNClEwRXhGREFTQmdOVkJBY01DMU5oYm5SaElFTnNZWEpoTVEwd0N3WURWUVFLREFSWFUwOHlNUTB3Q3dZRFZRUUwNCkRBUlhVMDh5TVJJd0VBWURWUVFEREFsc2IyTmhiR2h2YzNRd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUINCkR3QXdnZ0VLQW9JQkFRQ2E0amx3OEtyWHMzOTZTdktmVFEwMkllUm9hWnF1ZWtvSlNpdzBsOWU5QkkyRWF2blQNCkc4SnlvcDh6MnJPcjZDNmpqZGdVeXR6NWpCaG9wYmdmeHJQMmkwTkd1akpGTE5uU1U4cmNoRDJUSjlRbzh0V3YNCmZqQUtDL1VsUnhTb0VyT1RkejdYUzFDY1BmNm9RZk56TVo2QnkyOXpmSVN1QytyV25qTHFUM002ejBGMGIzK20NCm9paVpmUTA1RjAwaHd6U0U5V0JsTCtHUnh3cHlRUVl3c2JHZlordmlJM0VHdjdzUnYreHFwTFBoVzVTTHpoR3oNCnNaaTlDME0wRzFqYnZWMWQrUFkwTVRoRTYwcmthdmpNKytSUkJlc29pNUprblprc0F0OWhPcXhZM0ExSU1kREENCk5wZEtxaGRGMWFBeURYK3ZUWkZySGZMc3VFQmVjNVBwM3RJWEFnTUJBQUdqWmpCa01BNEdBMVVkRHdFQi93UUUNCkF3SUU4REFVQmdOVkhSRUVEVEFMZ2dsc2IyTmhiR2h2YzNRd0hRWURWUjBPQkJZRUZIWFhWMm5sb2ZoaThXd2oNCncwRW9hRlNZbldiU01CMEdBMVVkSlFRV01CUUdDQ3NHQVFVRkJ3TUJCZ2dyQmdFRkJRY0RBakFOQmdrcWhraUcNCjl3MEJBUXNGQUFPQ0FRRUFSZThESThuNzJlVWxReTlHU3BpeXh2OFFVSEZkaVFhMW5CVzluVlRaZHlKb1NYMHENCmg2TjN4Vk5KWFIzL3pMdkw4TUJWTXZqa3QwT1FxdkVpeWp3bkVXTzZEYnhUUnIzdmRmK3J2NVZ3ZGtZbjRNY00NCkt4NHhGOFphZzh4aHlhWXFVUXpRWG5nNTFyVjErYzR1elh1Z0VoRTVTemRESFlFWHpYNmpvWklnMXlOK2hFUGMNCjc3UlpKSkhtd0lRclRkM2JuWnB5dEI2UmRCam5qU3loMEJlSGxKUUdtUHhvbXhZQVMxaFZzelJkZld0cnhEQUINCmZsSUppbUppSGgzZHlrY3lObHJ3QnU5MDNwTWRVR1FHcXNVeUVqaEZkN3M0QXp1cVlISnI1cll5OTUwZGY5SWINCllTaHUyWWZsVkVzV1pxSlI2MkNpYldCY0pLeUhQWW10QzBjU1JRPT0NCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K + attributes: + - http://wso2.org/claims/dob + rule: + condition: OR + rules: + - condition: AND + expressions: + - field: flow + operator: equals + value: userInitiatedPasswordReset + - field: flow + operator: notEquals + value: adminInitiatedPasswordUpdate + preUpdateProfile: + summary: Sample payload for pre update profile action update + value: + name: Updated Profile Update Action + description: This action invokes before updating a user profile. + endpoint: + uri: https://myextension.com/external/pre-update-profile + authentication: + properties: {} + type: NONE + attributes: + - http://wso2.org/claims/dob + rule: + condition: OR + rules: + - condition: AND + expressions: + - field: flow + operator: equals + value: userInitiatedProfileUpdate + - field: claim + operator: notEquals + value: http://wso2.org/claims/postalcode + description: This represents the action to be updated. + required: true + responses: + '200': + description: Action Updated + content: + application/json: + schema: + $ref: '#/components/schemas/ActionResponse' + examples: + preIssueAccessToken: + summary: Sample response for pre issue access token action + value: + id: 24f64d17-9824-4e28-8413-de45728d8e84 + name: Updated Pre Issue Access Token + description: This action invokes before issuing an access token. + status: ACTIVE + createdAt: 2025-08-01T12:00:00Z + updatedAt: 2025-09-01T13:00:00Z + endpoint: + uri: https://myextension.com/external/token + authentication: + type: BEARER + allowedHeaders: + - x-geo-location + - host + allowedParameters: + - device-id + rule: + condition: OR + rules: + - condition: AND + expressions: + - field: application + operator: equals + value: 29ed9110-d0eb-48e3-918c-4832e8c9c81f + - field: grantType + operator: notEquals + value: password + preUpdatePassword: + summary: Sample response for pre update password action + value: + id: 24f64d17-9824-4e28-8413-de45728d8e84 + name: Updated Password Update Action + description: This action invokes before updating a user password. + status: ACTIVE + createdAt: 2025-08-01T12:00:00Z + updatedAt: 2025-09-01T13:00:00Z + endpoint: + uri: https://myextension.com/external/pre-update-password + authentication: + type: NONE + passwordSharing: + format: PLAIN_TEXT + certificate: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURxRENDQXBDZ0F3SUJBZ0lFWlhCR0NUQU5CZ2txaGtpRzl3MEJBUXNGQURCaU1Rc3dDUVlEVlFRR0V3SlYNClV6RUxNQWtHQTFVRUNBd0NRMEV4RkRBU0JnTlZCQWNNQzFOaGJuUmhJRU5zWVhKaE1RMHdDd1lEVlFRS0RBUlgNClUwOHlNUTB3Q3dZRFZRUUxEQVJYVTA4eU1SSXdFQVlEVlFRRERBbHNiMk5oYkdodmMzUXdIaGNOTWpNeE1qQTINCk1EazFPVE0zV2hjTk1qVXdNVEEzTURrMU9UTTNXakJpTVFzd0NRWURWUVFHRXdKVlV6RUxNQWtHQTFVRUNBd0MNClEwRXhGREFTQmdOVkJBY01DMU5oYm5SaElFTnNZWEpoTVEwd0N3WURWUVFLREFSWFUwOHlNUTB3Q3dZRFZRUUwNCkRBUlhVMDh5TVJJd0VBWURWUVFEREFsc2IyTmhiR2h2YzNRd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUINCkR3QXdnZ0VLQW9JQkFRQ2E0amx3OEtyWHMzOTZTdktmVFEwMkllUm9hWnF1ZWtvSlNpdzBsOWU5QkkyRWF2blQNCkc4SnlvcDh6MnJPcjZDNmpqZGdVeXR6NWpCaG9wYmdmeHJQMmkwTkd1akpGTE5uU1U4cmNoRDJUSjlRbzh0V3YNCmZqQUtDL1VsUnhTb0VyT1RkejdYUzFDY1BmNm9RZk56TVo2QnkyOXpmSVN1QytyV25qTHFUM002ejBGMGIzK20NCm9paVpmUTA1RjAwaHd6U0U5V0JsTCtHUnh3cHlRUVl3c2JHZlordmlJM0VHdjdzUnYreHFwTFBoVzVTTHpoR3oNCnNaaTlDME0wRzFqYnZWMWQrUFkwTVRoRTYwcmthdmpNKytSUkJlc29pNUprblprc0F0OWhPcXhZM0ExSU1kREENCk5wZEtxaGRGMWFBeURYK3ZUWkZySGZMc3VFQmVjNVBwM3RJWEFnTUJBQUdqWmpCa01BNEdBMVVkRHdFQi93UUUNCkF3SUU4REFVQmdOVkhSRUVEVEFMZ2dsc2IyTmhiR2h2YzNRd0hRWURWUjBPQkJZRUZIWFhWMm5sb2ZoaThXd2oNCncwRW9hRlNZbldiU01CMEdBMVVkSlFRV01CUUdDQ3NHQVFVRkJ3TUJCZ2dyQmdFRkJRY0RBakFOQmdrcWhraUcNCjl3MEJBUXNGQUFPQ0FRRUFSZThESThuNzJlVWxReTlHU3BpeXh2OFFVSEZkaVFhMW5CVzluVlRaZHlKb1NYMHENCmg2TjN4Vk5KWFIzL3pMdkw4TUJWTXZqa3QwT1FxdkVpeWp3bkVXTzZEYnhUUnIzdmRmK3J2NVZ3ZGtZbjRNY00NCkt4NHhGOFphZzh4aHlhWXFVUXpRWG5nNTFyVjErYzR1elh1Z0VoRTVTemRESFlFWHpYNmpvWklnMXlOK2hFUGMNCjc3UlpKSkhtd0lRclRkM2JuWnB5dEI2UmRCam5qU3loMEJlSGxKUUdtUHhvbXhZQVMxaFZzelJkZld0cnhEQUINCmZsSUppbUppSGgzZHlrY3lObHJ3QnU5MDNwTWRVR1FHcXNVeUVqaEZkN3M0QXp1cVlISnI1cll5OTUwZGY5SWINCllTaHUyWWZsVkVzV1pxSlI2MkNpYldCY0pLeUhQWW10QzBjU1JRPT0NCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K + attributes: + - http://wso2.org/claims/dob + rule: + condition: OR + rules: + - condition: AND + expressions: + - field: flow + operator: equals + value: userInitiatedPasswordReset + - field: flow + operator: notEquals + value: adminInitiatedPasswordUpdate + preUpdateProfile: + summary: Sample response for pre update profile action + value: + id: 24f64d17-9824-4e28-8413-de45728d8e84 + name: Updated Profile Update Action + description: This action invokes before updating a user profile. + status: ACTIVE + createdAt: 2025-08-01T12:00:00Z + updatedAt: 2025-09-01T13:00:00Z + endpoint: + uri: https://myextension.com/external/pre-update-profile + authentication: + type: NONE + attributes: + - http://wso2.org/claims/dob + rule: + condition: OR + rules: + - condition: AND + expressions: + - field: flow + operator: equals + value: userInitiatedProfileUpdate + - field: claim + operator: notEquals + value: http://wso2.org/claims/postalcode + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '501': + description: Not Implemented + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl - preIssueAccessToken + source: | + curl --location --request PATCH 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/actions/preIssueAccessToken/{actionId}' \ + -H 'Content-Type: application/json' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "name": "Pre Issue Access Token action", + "description": "This is the configuration of pre-action for issuing access token from myextensions.com.", + "endpoint": { + "uri": "http://myextensions.com/access-token", + "authentication": { + "type": "API_KEY", + "properties": { + "header": "sample_header", + "value": "sample_value" + } + }, + "allowedHeaders": [ "x-geo-location", "host" ], + "allowedParameters": [ "device-id" ] + } + }' + - lang: Curl - preUpdatePassword + source: | + curl --location --request PATCH 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/actions/preUpdatePassword/{actionId}' \ + -H 'Content-Type: application/json' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "name": "Updated Password Update Action", + "description": "This is the configuration of pre-action for updating password", + "endpoint": { + "uri": "http://myextensions.com/external/pre-update-password", + "authentication": { + "type": "NONE", + "properties": {} + } + }, + "passwordSharing": { + "format": "PLAIN_TEXT" + }, + "attributes": ["http://wso2.org/claims/dob"] + }' + - lang: Curl - preUpdateProfile + source: | + curl --location --request PATCH 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/actions/preUpdateProfile/{actionId}' \ + -H 'Content-Type: application/json' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "name": "Updated Profile Update Action", + "description": "This is the configuration of pre-action for updating profile", + "endpoint": { + "uri": "http://myextensions.com/external/pre-update-profile", + "authentication": { + "type": "NONE", + "properties": {} + } + }, + "attributes": ["http://wso2.org/claims/dob"] + }' + x-codegen-request-body-name: body + + delete: + tags: + - Actions + summary: Delete Action + description: "This API deletes an action using the action's type and unique ID. \n\n + Scope (Permission) required: ``internal_action_mgt_delete``\n\n" + operationId: deleteAction + parameters: + - name: actionType + in: path + description: Name of the Action Type. + required: true + schema: + enum: + - preIssueAccessToken + - preUpdatePassword + - preUpdateProfile + - preRegistration + - name: actionId + in: path + description: Unique identifier of the action. + required: true + schema: + type: string + responses: + '204': + description: Action Deleted + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '501': + description: Not Implemented + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location --request DELETE 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/actions/{actionType}/{actionId}' \ + -H 'Authorization: Bearer {bearer_token}' + + /actions/{actionType}/{actionId}/activate: + post: + tags: + - Actions + summary: Activate Action + description: "This API activates an action using the action's type and unique ID. \n\n + Scope (Permission) required: ``internal_action_mgt_update``\n\n" + operationId: activateAction + parameters: + - name: actionType + in: path + description: Name of the Action Type. + required: true + schema: + enum: + - preIssueAccessToken + - preUpdatePassword + - preUpdateProfile + - preRegistration + - name: actionId + in: path + description: Unique identifier of the action. + required: true + schema: + type: string + responses: + '200': + description: Action Activated + content: + application/json: + schema: + $ref: '#/components/schemas/ActionBasicResponse' + examples: + preIssueAccessToken: + summary: Sample response for pre issue access token action + value: + - id: 24f64d17-9824-4e28-8413-de45728d8e84 + type: PRE_ISSUE_ACCESS_TOKEN + name: Pre Issue Access Token + description: This action invokes before issuing an access token. + status: ACTIVE + createdAt: 2025-08-01T12:00:00Z + updatedAt: 2025-09-01T13:00:00Z + links: + - href: "/api/server/v1/actions/preIssueAccessToken/24f64d17-9824-4e28-8413-de45728d8e84" + method: GET + rel: self + preUpdatePassword: + summary: Sample response for pre update password action + value: + - id: 24f64d17-9824-4e28-8413-de45728d8e84 + type: PRE_UPDATE_PASSWORD + name: Password Update Action + description: This action invokes before updating a user password. + status: ACTIVE + createdAt: 2025-08-01T12:00:00Z + updatedAt: 2025-09-01T13:00:00Z + links: + - href: "/api/server/v1/actions/preUpdatePassword/24f64d17-9824-4e28-8413-de45728d8e84" + method: GET + rel: self + preUpdateProfile: + summary: Sample response for pre update profile action + value: + - id: 24f64d17-9824-4e28-8413-de45728d8e84 + type: PRE_UPDATE_PROFILE + name: Profile Update Action + description: This action invokes before updating a user profile. + status: ACTIVE + createdAt: 2025-08-01T12:00:00Z + updatedAt: 2025-09-01T13:00:00Z + links: + - href: "/api/server/v1/actions/preUpdateProfile/24f64d17-9824-4e28-8413-de45728d8e84" + method: GET + rel: self + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '501': + description: Not Implemented + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location --request POST 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/actions/{actionType}/{actionId}/activate' \ + -H 'Authorization: Bearer {bearer_token}' + + /actions/{actionType}/{actionId}/deactivate: + post: + tags: + - Actions + summary: Deactivate Action + description: "This API deactivates an action using the action's type and unique ID. \n\n + Scope (Permission) required: ``internal_action_mgt_update``\n\n" + operationId: deactivateAction + parameters: + - name: actionType + in: path + description: Name of the Action Type. + required: true + schema: + enum: + - preIssueAccessToken + - preUpdatePassword + - preUpdateProfile + - preRegistration + - name: actionId + in: path + description: Unique identifier of the action. + required: true + schema: + type: string + responses: + '200': + description: Action Deactivated + content: + application/json: + schema: + $ref: '#/components/schemas/ActionBasicResponse' + examples: + preIssueAccessToken: + summary: Sample response for pre issue access token action + value: + - id: 24f64d17-9824-4e28-8413-de45728d8e84 + type: PRE_ISSUE_ACCESS_TOKEN + name: Pre Issue Access Token + description: This action invokes before issuing an access token. + status: INACTIVE + createdAt: 2025-08-01T12:00:00Z + updatedAt: 2025-09-01T13:00:00Z + links: + - href: "/api/server/v1/actions/preIssueAccessToken/24f64d17-9824-4e28-8413-de45728d8e84" + method: GET + rel: self + preUpdatePassword: + summary: Sample response for pre update password action + value: + - id: 24f64d17-9824-4e28-8413-de45728d8e84 + type: PRE_UPDATE_PASSWORD + name: Password Update Action + description: This action invokes before updating a user password. + status: INACTIVE + createdAt: 2025-08-01T12:00:00Z + updatedAt: 2025-09-01T13:00:00Z + links: + - href: "/api/server/v1/actions/preUpdatePassword/24f64d17-9824-4e28-8413-de45728d8e84" + method: GET + rel: self + preUpdateProfile: + summary: Sample response for pre update profile action + value: + - id: 24f64d17-9824-4e28-8413-de45728d8e84 + type: PRE_UPDATE_PROFILE + name: Profile Update Action + description: This action invokes before updating a user profile. + status: INACTIVE + createdAt: 2025-08-01T12:00:00Z + updatedAt: 2025-09-01T13:00:00Z + links: + - href: "/api/server/v1/actions/preUpdateProfile/24f64d17-9824-4e28-8413-de45728d8e84" + method: GET + rel: self + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '501': + description: Not Implemented + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location --request POST 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/actions/{actionType}/{actionId}/deactivate' \ + -H 'Authorization: Bearer {bearer_token}' + +components: + securitySchemes: + BasicAuth: + type: http + scheme: basic + OAuth2: + type: oauth2 + flows: + authorizationCode: + authorizationUrl: 'https://api.asgardeo.io/t/{org-name}/oauth2/authorize' + tokenUrl: 'https://api.asgardeo.io/t/{org-name}/oauth2/token' + scopes: + read: internal_action_mgt_view + write: internal_action_mgt_create + update: internal_action_mgt_update + delete: internal_action_mgt_delete + + schemas: + ActionType: + type: string + description: Action types supported. + enum: + - PRE_ISSUE_ACCESS_TOKEN + - PRE_UPDATE_PASSWORD + - PRE_UPDATE_PROFILE + - PRE_REGISTRATION + ActionModel: + type: object + required: + - name + - endpoint + properties: + name: + type: string + minLength: 1 + maxLength: 255 + description: Name of the action. + example: Pre Issue Access Token Action + description: + type: string + maxLength: 255 + description: Description of the action. + example: This action invokes before issuing an access token. + endpoint: + $ref: '#/components/schemas/Endpoint' + rule: + $ref: '#/components/schemas/ORRule' + + Endpoint: + type: object + description: Endpoint configurations of the action. + required: + - uri + - authentication + properties: + uri: + type: string + description: HTTPS URI of the endpoint. + pattern: '^https?://.+' + example: https://myextension.com/token + authentication: + $ref: '#/components/schemas/AuthenticationType' + allowedHeaders: + type: array + description: List of HTTP headers to forward to the extension. + items: + type: string + example: [ "x-geo-location", "host"] + allowedParameters: + type: array + description: List of parameters to forward to the extension. + items: + type: string + example: [ "device-id"] + + EndpointResponse: + type: object + description: Endpoint configurations of the action. + required: + - uri + - authentication + properties: + uri: + type: string + description: HTTPS URI of the endpoint. + pattern: '^https?://.+' + example: https://myextension.com/token + authentication: + $ref: '#/components/schemas/AuthenticationTypeResponse' + allowedHeaders: + type: array + description: List of HTTP headers to forward to the extension. + items: + type: string + example: [ "x-geo-location", "host" ] + allowedParameters: + type: array + description: List of parameters to forward to the extension. + items: + type: string + example: [ "device-id" ] + + ActionResponse: + type: object + properties: + id: + type: string + example: '24f64d17-9824-4e28-8413-de45728d8e84' + description: Unique identifier of the action. + type: + $ref: '#/components/schemas/ActionType' + name: + type: string + minLength: 1 + maxLength: 255 + description: Name of the action. + example: Pre Issue Access Token + description: + type: string + maxLength: 255 + description: Description of the action. + example: This action invokes before issuing an access token. + status: + type: string + enum: + - ACTIVE + - INACTIVE + description: Status of the action. + example: ACTIVE + createdAt: + type: string + description: Created time of the action. + example: "2025-08-01T12:00:00Z" + updatedAt: + type: string + description: Last updated time of the action. + example: "2025-09-01T13:00:00Z" + endpoint: + $ref: '#/components/schemas/EndpointResponse' + rule: + $ref: '#/components/schemas/ORRuleResponse' + + ActionBasicResponse: + type: object + properties: + id: + type: string + example: '24f64d17-9824-4e28-8413-de45728d8e84' + description: Unique identifier of the action. + type: + $ref: '#/components/schemas/ActionType' + name: + type: string + minLength: 1 + maxLength: 255 + description: Name of the action. + example: Pre Issue Access Token Action + description: + type: string + maxLength: 255 + description: Description of the action. + example: This action invokes before issuing an access token. + status: + type: string + enum: + - ACTIVE + - INACTIVE + description: Status of the action. + createdAt: + type: string + description: Created time of the action. + example: "2025-08-01T12:00:00Z" + updatedAt: + type: string + description: Last updated time of the action. + example: "2025-09-01T13:00:00Z" + links: + type: array + items: + $ref: '#/components/schemas/Link' + example: + - href: "/api/server/v1/actions/preIssueAccessToken/24f64d17-9824-4e28-8413-de45728d8e84" + method: GET + rel: self + + Link: + type: object + properties: + href: + type: string + description: Url of the endpoint. + method: + type: string + enum: + - GET + description: Http method. + rel: + type: string + description: Relation to the resource. + + ActionResponseList: + type: array + items: + $ref: '#/components/schemas/ActionBasicResponse' + + ActionTypesResponse: + type: array + items: + $ref: '#/components/schemas/ActionTypesResponseItem' + + ActionTypesResponseItem: + type: object + properties: + type: + $ref: '#/components/schemas/ActionType' + displayName: + type: string + description: "Display name of the action type." + example: "Pre Issue Access Token." + description: + type: string + description: "Description of the action type." + example: "Extension point configuration for Pre Issue Access Token." + count: + type: integer + description: "Number of actions configured under the action type." + example: 1 + self: + type: string + description: "API endpoint referring to the location of the given action type." + example: "/api/server/v1/actions/preIssueAccessToken/24f64d17-9824-4e28-8413-de45728d8e84" + + AuthenticationType: + type: object + description: > + The type of authentication required by the action's endpoint. The following options are supported: + + - NONE: No authentication is required.
    + ``{ + "type": "NONE" + }`` + + - BASIC: Basic authentication with a username and password.
    + ``{ + "type": "BASIC", + "properties": { + "username": "auth_username", + "password": "auth_password" + } + }`` + + - API_KEY: API key-based authentication, where the key is provided in an HTTP header.
    + ``{ + "type": "API_KEY", + "properties": { + "header": "X-API-Key", + "value": "12345-abcde-67890" + } + }`` + + - BEARER: Bearer token-based authentication.
    + ``{ + "type": "BEARER", + "properties": { + "accessToken": "0d6fed02-eac0-332b-8998-213a543139a0" + } + }`` + required: + - type + properties: + type: + type: string + enum: + - NONE + - BEARER + - API_KEY + - BASIC + example: BASIC + properties: + type: object + description: Authentication properties specific to the selected type. + additionalProperties: true + example: + type: BASIC + properties: + username: "auth_username" + password: "auth_password" + + AuthenticationTypeResponse: + type: object + description: Authentication configurations of the action. + required: + - type + properties: + type: + type: string + enum: + - NONE + - BEARER + - API_KEY + - BASIC + description: Type of the authentication. + example: BASIC + + ActionUpdateModel: + type: object + properties: + name: + type: string + minLength: 1 + maxLength: 255 + description: Updating name of the action. + example: Pre Issue Access Token Action + description: + type: string + maxLength: 255 + description: Updating description of the action. + example: This action invokes before issuing an access token. + endpoint: + $ref: '#/components/schemas/EndpointUpdateModel' + rule: + $ref: '#/components/schemas/ORRule' + + EndpointUpdateModel: + type: object + description: Updating endpoint configurations of the action. + properties: + uri: + type: string + pattern: '^https?://.+' + description: Updating HTTPS URI of the endpoint. + example: https://myextension.com/token + authentication: + $ref: '#/components/schemas/AuthenticationType' + allowedHeaders: + type: array + description: List of HTTP headers to forward to the extension. + items: + type: string + example: [ "x-geo-location", "host" ] + allowedParameters: + type: array + description: List of parameters to forward to the extension. + items: + type: string + example: [ "device-id" ] + + ORRule: + type: object + description: Represents a rule configuration that combines multiple sub-rules with an OR condition. + If any of the sub-rules evaluate to true, the ORRule is considered satisfied. + properties: + condition: + type: string + description: The logical condition for combining the sub-rules. For ORRule, the value + must always be "OR". + enum: ["OR"] + rules: + type: array + items: + $ref: '#/components/schemas/ANDRule' + minItems: 1 + + ORRuleResponse: + type: object + description: Rule configured for the action. + properties: + condition: + type: string + enum: ["OR"] + rules: + type: array + items: + $ref: '#/components/schemas/ANDRuleResponse' + description: A list of sub-rules that are combined using the OR condition. Each sub-rule is an ANDRule. + minItems: 1 + + ANDRule: + type: object + description: A sub-rule that combines expressions with AND condition. + required: + - condition + - expressions + properties: + condition: + type: string + enum: ["AND"] + description: The logical condition for combining the expressions. For ANDRule, the value must always be "AND". + expressions: + type: array + items: + $ref: '#/components/schemas/Expression' + minItems: 1 + description: A list of expressions that are combined using the AND condition. All expressions must evaluate to true for the ANDRule to pass. + + ANDRuleResponse: + type: object + description: Represents a rule configuration that combines multiple expressions with an AND condition. All expressions in the ANDRule must evaluate to true for the rule to be satisfied. + properties: + condition: + type: string + enum: ["AND"] + description: The logical condition for combining the expressions. For ANDRule, the value must always be "AND". + expressions: + type: array + items: + $ref: '#/components/schemas/ExpressionResponse' + minItems: 1 + description: A list of expressions that are combined using the AND condition. All expressions must evaluate to true for the ANDRule to pass. + + Expression: + type: object + description: Represents a single logical condition or comparison within a rule. An expression defines a field, an operator, and a value that is evaluated. + required: + - field + - operator + - value + properties: + field: + type: string + description: The field or attribute of the entity being evaluated (e.g.,application, role). + example: application + operator: + type: string + description: The comparison operator used to evaluate the field and value. Common operators include "equals", "contains", "startsWith", etc. + example: equals + value: + type: string + description: The value that the field is compared against based on the operator. + example: myapp + + ExpressionResponse: + type: object + description: Expressions in the rule. + properties: + field: + type: string + example: application + operator: + type: string + example: equals + value: + type: string + example: myapp + + Error: + type: object + properties: + code: + type: string + example: AAA-00000 + message: + type: string + example: Some error message. + description: + type: string + example: Some error description. + traceId: + type: string + example: e0fbcfeb-3617-43c4-8dd0-7b7d38e13047 + diff --git a/docusaurus-asgardeo/static/apis/restapis/admin-identity-verification.yaml b/docusaurus-asgardeo/static/apis/restapis/admin-identity-verification.yaml new file mode 100644 index 0000000000..30d5eab44a --- /dev/null +++ b/docusaurus-asgardeo/static/apis/restapis/admin-identity-verification.yaml @@ -0,0 +1,498 @@ +openapi: 3.0.3 +info: + title: Identity Verification API + description: |- + This is the RESTful API for admins to manage users' identity verification information stored in Asgardeo. +servers: + - url: 'https://api.asgardeo.io/t/{organization-name}/api/users/v1' +security: + - OAuth2: [] + - BasicAuth: [] +paths: + /{user-id}/idv/verify: + post: + tags: + - Admin - Identity Verification + summary: Verify an Identity + description: > + This API provides the capability to verify a user with the configured verification required attributes +
    Scope(Permission) required: `internal_idv_claim_verify` + operationId: verifyIdentity + parameters: + - name: user-id + in: path + description: user id of the user + required: true + schema: + type: string + requestBody: + description: Verify an identity + content: + application/json: + schema: + $ref: '#/components/schemas/verifyRequest' + required: true + responses: + '201': + description: Accepted + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/verificationPostResponse' + '200': + description: Successful operation + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/verificationPostResponse' + '400': + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /{user-id}/idv/claims: + get: + tags: + - Admin - Identity Verification + summary: Get the identity verification claims of a user + description: > + This API provides the capability to retrieve the verification details of a user. +
    Scope(Permission) required: `internal_idv_claim_view` + operationId: getIdVClaims + parameters: + - name: user-id + in: path + description: user id of the user + required: true + schema: + type: string + - $ref: '#/components/parameters/idVPQueryParam' + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/verificationClaimResponse' + '400': + description: Invalid status value + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + post: + tags: + - Admin - Identity Verification + summary: Add identity verification claim. + description: > + This API provides the capability to add verification claim data +
    Scope(Permission) required: `internal_idv_claim_add` + operationId: addIdVClaim + parameters: + - name: user-id + in: path + description: user id of the user + required: true + schema: + type: string + responses: + '201': + description: Successful response + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/verificationClaimPostResponse' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + application/xml: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '409': + description: Conflict + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + application/xml: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + application/xml: + schema: + $ref: '#/components/schemas/Error' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/verificationClaimPostRequest' + description: This represents the identity provider to be created. + required: true + put: + tags: + - Admin - Identity Verification + summary: Update identity verification claims of a user. + description: > + This API provides the capability to update verification claims of a user +
    Scope(Permission) required: `internal_idv_claim_update` + operationId: updateIdVClaims + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/verificationClaimPostRequest' + description: This represents the identity provider to be created. + required: true + parameters: + - name: user-id + in: path + description: user id of the user + required: true + schema: + type: string + responses: + '201': + description: Successful response + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/verificationClaimPostResponse' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + application/xml: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '409': + description: Conflict + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + application/xml: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + application/xml: + schema: + $ref: '#/components/schemas/Error' + /{user-id}/idv/claims/{claim-id}: + get: + tags: + - Admin - Identity Verification + summary: Get identity verification claim + description: > + This API provides the capability to retrieve a identity verification claim of a user. +
    Scope(Permission) required: `internal_idv_claim_view` + operationId: getIdVClaim + parameters: + - name: user-id + in: path + description: user id of the user + required: true + schema: + type: string + - name: claim-id + in: path + description: Claim that needs to retrieve verification metadata + required: true + schema: + type: string + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/verificationClaimResponse' + '400': + description: Invalid status value + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + put: + tags: + - Admin - Identity Verification + summary: Update identity verification claim + description: > + This API provides the capability to update a identity verification claim of a user. +
    Scope(Permission) required: `internal_idv_claim_update` + operationId: updateIdVClaim + parameters: + - name: claim-id + in: path + description: Claim that needs to retrieve verification metadata + required: true + schema: + type: string + - name: user-id + in: path + description: user id of the user + required: true + schema: + type: string + responses: + '200': + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/verificationClaimResponse' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/verificationClaimUpdateRequest' + required: true + +components: + parameters: + limitQueryParam: + in: query + name: limit + required: false + description: | + Maximum number of records to return. + schema: + type: integer + format: int32 + offsetQueryParam: + in: query + name: offset + required: false + description: | + Number of records to skip for pagination. + schema: + type: integer + format: int32 + idVPQueryParam: + in: query + name: idVProviderId + required: false + description: | + Id of the identity verification provider. + schema: + type: string + schemas: + Error: + type: object + properties: + code: + type: string + example: AAA-00000 + message: + type: string + example: Some Error Message + description: + type: string + example: Some Error Description + traceId: + type: string + example: e0fbcfeb-***-***-8dd0-7b7d38e13047 + verificationPostResponse: + type: object + properties: + idVProviderId: + type: string + example: "d75b8685-****-****-****-80a3eecb5af2" + claims: + type: array + items: + $ref: '#/components/schemas/verificationClaimResponse' + verificationClaimResponse: + type: object + properties: + id: + type: string + example: aHR0cDovL3dzbzIub3JnL*********91c2VybmFtZQ + readOnly: true + uri: + type: string + example: 'http://wso2.org/claims/dob' + isVerified: + type: boolean + example: true + idVProviderId: + type: string + example: '2159375-r567-****-****-5566424414527' + claimMetadata: + $ref: '#/components/schemas/claimMetadata' + verificationClaimRequest: + type: object + properties: + uri: + type: string + example: 'http://wso2.org/claims/dob' + isVerified: + type: boolean + example: true + idVProviderId: + type: string + example: '2159375-r567-****-****-5566424414527' + claimMetadata: + $ref: '#/components/schemas/claimMetadata' + verificationClaimUpdateRequest: + type: object + properties: + isVerified: + type: boolean + example: true + claimMetadata: + $ref: '#/components/schemas/claimMetadata' + required: + - isVerified + - claimMetadata + claimMetadata: + type: object + additionalProperties: true + example: '{"source": "Provider", "trackingId": "123e4567-****-****-a456-556642440000" }' + verificationClaimPostRequest: + type: array + items: + $ref: '#/components/schemas/verificationClaimRequest' + verificationClaimPostResponse: + type: array + items: + $ref: '#/components/schemas/verificationClaimResponse' + verifyRequest: + type: object + properties: + idVProviderId: + type: string + example: "d75b8685-****-****-****-80a3eecb5af2" + claims: + type: array + items: + type: string + example: + - http://wso2.org/claims/dob + - http://wso2.org/claims/country + properties: + type: array + items: + $ref: '#/components/schemas/ProviderProperty' + required: + - identityVerificationProvider + - properties + ProviderProperty: + type: object + properties: + key: + type: string + example: status + value: + type: string + example: "INITIATED" + securitySchemes: + BasicAuth: + type: http + scheme: basic + OAuth2: + type: oauth2 + flows: + authorizationCode: + authorizationUrl: 'https://localhost:9443/oauth2/authorize' + tokenUrl: 'https://localhost:9443/oauth2/token' + scopes: {} diff --git a/docusaurus-asgardeo/static/apis/restapis/api-resources.yaml b/docusaurus-asgardeo/static/apis/restapis/api-resources.yaml new file mode 100644 index 0000000000..9a0f89f38d --- /dev/null +++ b/docusaurus-asgardeo/static/apis/restapis/api-resources.yaml @@ -0,0 +1,1138 @@ +openapi: 3.0.0 +info: + description: > + This document explains the RESTful API for API Resource Management in Asgardeo. + version: "v1" + title: Asgardeo - API Resource Management Rest API + +security: + - OAuth2: [] + +servers: + - url: 'https://api.asgardeo.io/t/{organization-name}/api/server/v1' + +paths: + /api-resources: + post: + tags: + - API Resources + operationId: addAPIResource + summary: Add a new API resource + description: | + Add a new API resource + + Scope(Permission) required: `internal_api_resource_create` + responses: + 200: + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/APIResourceResponse' + 400: + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 401: + description: Unauthorized + 403: + description: Forbidden + 404: + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 409: + description: Conflict + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + application/xml: + schema: + $ref: '#/components/schemas/Error' + 500: + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/APIResourceCreationModel' + description: This represents the API resource to be created. + required: true + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/api-resources' \ + -H 'Content-Type: application/json' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "name": "Greetings API", + "identifier": "greetings_api", + "description": "Greetings API representation", + "requiresAuthorization": true, + "scopes": [ + { + "name": "greetings:write", + "displayName": "Write Greetings", + "description": "Allows writing greetings" + } + ] + }' + x-codegen-request-body-name: body + get: + tags: + - API Resources + summary: List all API resources in the server + description: | + List all API resources in the server + + Scope(Permission) required: `internal_api_resource_view` + operationId: getAPIResources + parameters: + - $ref: '#/components/parameters/before' + - $ref: '#/components/parameters/after' + - $ref: '#/components/parameters/filter' + - $ref: '#/components/parameters/limit' + - $ref: '#/components/parameters/attributes' + responses: + 200: + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/APIResourceListResponse' + 401: + description: Unauthorized + 403: + description: Forbidden + 500: + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/api-resources' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + /api-resources/{apiResourceId}: + get: + tags: + - API Resources + summary: Get API resource specified by the id + description: | + Get API resource specified by the id + + Scope(Permission) required: `internal_api_resource_view` + parameters: + - $ref: '#/components/parameters/apiResourceId' + responses: + 200: + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/APIResourceResponse' + 401: + description: Unauthorized + 403: + description: Forbidden + 500: + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/api-resources/{apiResourceId}' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + patch: + tags: + - API Resources + summary: Patch API resource specified by the id + description: | + Patch API resource specified by the id. Patch operation only supports "name", "description" updating and "addedScopes" fields at the moment. + "removedScopes" field is not yet supported. + + Scope(Permission) required: `internal_api_resource_update` + parameters: + - $ref: '#/components/parameters/apiResourceId' + responses: + 204: + description: Not Content + 400: + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 401: + description: Unauthorized + 403: + description: Forbidden + 404: + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 409: + description: Conflict + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + application/xml: + schema: + $ref: '#/components/schemas/Error' + 500: + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 501: + description: Not Implemented + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/APIResourcePatchModel' + description: This represents the API resource to be patched. + required: true + x-codeSamples: + - lang: Curl + source: | + curl --location --request PATCH 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/api-resources/{apiResourceId}' \ + -H 'Content-Type: application/json' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "name": "Greetings API", + "description": "Greetings API representation", + "addedScopes": [ + { + "name": "greetings:read", + "displayName": "Read Greetings", + "description": "Allows to read greetings" + } + ] + }' + x-codegen-request-body-name: body + delete: + tags: + - API Resources + summary: Delete API resource specified by the id + description: | + Delete API resource specified by the id + + Scope(Permission) required: `internal_api_resource_delete` + parameters: + - $ref: '#/components/parameters/apiResourceId' + responses: + 204: + description: No Content + 401: + description: Unauthorized + 403: + description: Forbidden + 500: + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location --request DELETE 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/api-resources/{apiResourceId}' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + /api-resources/{apiResourceId}/scopes: + get: + tags: + - API Resource Scopes + summary: Get API resource scopes + description: | + Get API resource scopes specified by the id + + Scope(Permission) required: `internal_api_resource_view` + parameters: + - $ref: '#/components/parameters/apiResourceId' + responses: + 200: + description: OK + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/ScopeGetModel' + 401: + description: Unauthorized + 403: + description: Forbidden + 404: + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 500: + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/api-resources/{apiResourceId}/scopes' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + put: + tags: + - API Resource Scopes + summary: Add scopes to API resource + description: | + Put scopes API resource specified by the id + + Scope(Permission) required: `internal_api_resource_update` + parameters: + - $ref: '#/components/parameters/apiResourceId' + responses: + 204: + description: No Content + 400: + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 401: + description: Unauthorized + 403: + description: Forbidden + 404: + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 409: + description: Conflict + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + application/xml: + schema: + $ref: '#/components/schemas/Error' + 500: + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + + requestBody: + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/ScopeCreationModel' + example: + [ + { + "name": "greetings:write", + "displayName": "Write Greetings", + "description": "Allows writing greetings" + }, + { + "name": "greetings:read", + "displayName": "Read Greetings", + "description": "Allows reading greetings" + } + ] + description: This represents the API resource to be patched. + required: true + x-codeSamples: + - lang: Curl + source: | + curl --location --request PUT 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/api-resources/{apiResourceId}/scopes' \ + -H 'Content-Type: application/json' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '[ + { + "name": "greetings:write", + "displayName": "Write Greetings", + "description": "Allows writing greetings" + }, + { + "name": "greetings:read", + "displayName": "Read Greetings", + "description": "Allows reading greetings" + } + ]' + x-codegen-request-body-name: body + /api-resources/{apiResourceId}/scopes/{scopeName}: + delete: + tags: + - API Resource Scopes + summary: Delete API scope specified by the name + description: | + Delete API scope specified by the name + + Scope(Permission) required: `internal_api_resource_delete` + parameters: + - $ref: '#/components/parameters/apiResourceId' + - $ref: '#/components/parameters/scopeName' + responses: + 401: + description: Unauthorized + 403: + description: Forbidden + 500: + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location --request DELETE 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/api-resources/{apiResourceId}/scopes/{scopeName}' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + /scopes: + get: + tags: + - API Resource Scopes + summary: Get all scopes in the tenant + description: | + Get all scopes in the tenant + + Scope(Permission) required: `internal_api_resource_view` + parameters: + - $ref: '#/components/parameters/scopeFilter' + responses: + 200: + description: OK + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/ScopeGetModel' + 401: + description: Unauthorized + 403: + description: Forbidden + 404: + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 500: + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/scopes' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + /meta/api-resource-collections: + get: + tags: + - API Resource Collections + summary: List all API resource collections in the server + description: | + List all API resource collections in the server + + Scope(Permission) required: `internal_api_resource_view` + operationId: getAPIResourceCollections + parameters: + - $ref: '#/components/parameters/collectionFilter' + - $ref: '#/components/parameters/collectionAttributes' + responses: + 200: + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/APIResourceCollectionListResponse' + 401: + description: Unauthorized + 403: + description: Forbidden + 500: + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/meta/api-resource-collections' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + /meta/api-resource-collections/{collectionId}: + get: + tags: + - API Resource Collections + summary: Get API resource collection specified by the id + description: | + Get API resource collection specified by the id + + Scope(Permission) required: `internal_api_resource_view` + operationId: getAPIResourceCollectionByCollectionId + parameters: + - $ref: '#/components/parameters/collectionId' + responses: + 200: + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/APIResourceCollectionResponse' + 401: + description: Unauthorized + 403: + description: Forbidden + 500: + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/meta/api-resource-collections/{collectionId}' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' +components: + parameters: + organizationId: + in: path + name: organizationId + description: uuid of the org. + required: true + schema: + type: string + example: "1234-4567-4567" + + apiResourceId: + name: apiResourceId + in: path + description: ID of the API Resource. + required: true + schema: + type: string + example: er34-gf23-bv54-vb90 + + collectionId: + name: collectionId + in: path + description: ID of the API Resource Collection. + required: true + schema: + type: string + example: er34-gf23-bv54-vb90 + + scopeName: + name: scopeName + in: path + description: Name of the Scope. + required: true + schema: + type: string + + applicationId: + name: applicationId + in: path + description: ID of the Application. + required: true + schema: + type: string + + authorizationId: + name: authorizationId + in: path + description: ID of the authorization. + required: true + schema: + type: string + + before: + name: before + in: query + required: false + description: | + Base64 encoded cursor value for backward pagination. + schema: + type: string + example: Ng== + + after: + name: after + in: query + required: false + description: | + Base64 encoded cursor value for forward pagination. + schema: + type: string + example: Ng== + + filter: + name: filter + in: query + required: false + description: | + Condition to filter the retrieval of records. Supports 'sw', 'co', 'ew' and 'eq' operations. + schema: + type: string + example: identifier+eq+greetings + + scopeFilter: + name: filter + in: query + required: false + description: | + Condition to filter the retrieval of scopes by name. Supports 'sw', 'co', 'ew' and 'eq' operations. + schema: + type: string + example: name+co+greetings + + collectionFilter: + name: filter + in: query + required: false + description: | + Condition to filter the retrieval of records. Supports 'sw', 'co', 'ew' and 'eq' operations. + schema: + type: string + example: type+eq+tenant + + limit: + name: limit + in: query + required: false + description: | + Maximum number of records to return. + schema: + type: integer + example: 10 + + attributes: + name: attributes + in: query + required: false + description: Specifies the required attributes in the response. Only 'properties' attribute is currently supported. + schema: + type: string + + collectionAttributes: + name: attributes + in: query + required: false + description: Specifies the required attributes in the response. Only 'apiResources' attribute is currently supported. + schema: + type: string + + schemas: + Error: + type: object + properties: + code: + type: string + example: AAA-00000 + message: + type: string + example: Some Error Message + description: + type: string + example: Some Error Description + traceId: + type: string + example: e0fbcfeb-3617-43c4-8dd0-7b7d38e13047 + + APIResourceListItem: + type: object + required: + - id + - name + - identifier + - self + properties: + id: + type: string + example: gh43-jk34-vb34-df67 + name: + type: string + example: Greetings API + identifier: + type: string + example: greetings_api + type: + type: string + example: SYSTEM + requiresAuthorization: + type: boolean + example: true + properties: + type: array + items: + $ref: '#/components/schemas/Property' + self: + type: string + example: /api/server/v1/api-resources/eDUwOUNlcnRpZmljYXRlQXV0aGVudGljYXRvcg + + APIResourceResponse: + type: object + required: + - id + - name + - identifier + - self + properties: + id: + type: string + example: gh43-jk34-vb34-df67 + name: + type: string + example: Greetings API + description: + type: string + example: Greeting API representation + identifier: + type: string + example: greetings_api + type: + type: string + example: BUSINESS + requiresAuthorization: + type: boolean + example: true + scopes: + type: array + items: + $ref: '#/components/schemas/ScopeGetModel' + subscribedApplications: + type: array + items: + $ref: '#/components/schemas/SubscribedApplicationGetModel' + properties: + type: array + items: + $ref: '#/components/schemas/Property' + self: + type: string + example: /api/server/v1/api-resources/eDUwOUNlcnRpZmljYXRlQXV0aGVudGljYXRvcg + + APIResourceCreationModel: + type: object + required: + - identifier + - name + properties: + name: + type: string + example: Greetings API + identifier: + type: string + example: greetings_api + description: + type: string + example: Greetings API representation + requiresAuthorization: + type: boolean + example: true + scopes: + type: array + items: + $ref: '#/components/schemas/ScopeCreationModel' + + APIResourcePatchModel: + type: object + properties: + name: + type: string + example: Greetings API + description: + type: string + example: Greetings API representation + addedScopes: + type: array + items: + $ref: '#/components/schemas/ScopeCreationModel' + removedScopes: + type: array + items: + type: string + description: This field is not supported yet. + example: + { + "name": "Greetings API", + "description": "Greetings API representation", + "addedScopes": [ + { + "name": "greetings:read", + "displayName": "Read Greetings", + "description": "Allows to read greetings" + } + ] + } + PaginationLink: + type: object + properties: + rel: + type: string + example: before + href: + type: string + example: /api/server/v1/api-resources?after=NDoy + + APIResourceListResponse: + type: object + required: + - links + properties: + totalResults: + type: integer + example: 1 + links: + type: array + items: + $ref: '#/components/schemas/PaginationLink' + APIResources: + type: array + items: + $ref: '#/components/schemas/APIResourceListItem' + + APIResourceMap: + type: object + properties: + read: + type: array + items: + $ref: '#/components/schemas/APIResourceCollectionItem' + write: + type: array + items: + $ref: '#/components/schemas/APIResourceCollectionItem' + + APIResourceCollectionListItem: + type: object + required: + - id + - name + - displayName + - self + properties: + id: + type: string + example: gh43-jk34-vb34-df67 + name: + type: string + example: bulkUserImport + displayName: + type: string + example: Bulk User Import + type: + type: string + example: TENANT + apiResources: + $ref: '#/components/schemas/APIResourceMap' + self: + type: string + example: /api/server/v1/api-resource-collections/eDUwOUNlcnRpZmljYXRlQXV0aGVudGljYXRvcg + + APIResourceCollectionListResponse: + type: object + required: + - links + properties: + totalResults: + type: integer + example: 1 + apiResourceCollections: + type: array + items: + $ref: '#/components/schemas/APIResourceCollectionListItem' + example: + { + "totalResults": 2, + "apiResourceCollections": [ + { + "id": "YXBwbGljYXRpb25z", + "name": "applications", + "displayName": "Applications", + "type": "tenant", + "self": "/api/server/v1/api-resource-collections/YXBwbGljYXRpb25z" + }, + { + "id": "b3JnX2VtYWlsVGVtcGxhdGVz", + "name": "org_emailTemplates", + "displayName": "Email Templates", + "type": "organization", + "self": "/api/server/v1/api-resource-collections/b3JnX2VtYWlsVGVtcGxhdGVz" + } + ] + } + APIResourceCollectionItem: + type: object + required: + - id + - name + - displayName + - self + properties: + id: + type: string + example: gh43-jk34-vb34-df67 + name: + type: string + example: Greetings API + description: + type: string + example: Greeting API representation + identifier: + type: string + example: greetings_api + type: + type: string + example: BUSINESS + scopes: + type: array + items: + $ref: '#/components/schemas/ScopeGetModel' + self: + type: string + example: /t/carbon.super/api/server/v1/api-resources/eDUwOUNlcnRpZmljYXRlQXV0aGVudGljYXRvcg + + APIResourceCollectionResponse: + type: object + required: + - id + - name + - displayName + properties: + id: + type: string + example: gh43-jk34-vb34-df67 + name: + type: string + example: bulkUserImport + displayName: + type: string + example: Bulk User Import + type: + type: string + example: TENANT + apiResources: + $ref: '#/components/schemas/APIResourceMap' + example: + { + "id": "YXBwbGljYXRpb25z", + "name": "applications", + "displayName": "Applications", + "type": "tenant", + "apiResources": { + "read": [ + { + "id": "dea5bc01-f8e2-4a29-bc39-acdcb6c73e0e", + "name": "Userstore Management API", + "scopes": [ + { + "displayName": "View Userstore", + "name": "internal_userstore_view" + } + ], + "self": "/v1/api-resources/dea5bc01-f8e2-4a29-bc39-acdcb6c73e0e" + }, + { + "id": "ec4882d7-9628-413b-9704-1b06fc8c5888", + "name": "Identity Provider Management API", + "scopes": [ + { + "displayName": "View Identity Provider", + "name": "internal_idp_view" + } + ], + "self": "/v1/api-resources/ec4882d7-9628-413b-9704-1b06fc8c5888" + } + ] + } + } + ScopeGetModel: + type: object + required: + - id + - displayName + - name + properties: + id: + type: string + example: sf23-fg34-fy53-hj23 + displayName: + type: string + example: Write + name: + type: string + example: greetings:write + description: + type: string + example: Allow writing greetings + + ScopeCreationModel: + type: object + required: + - name + properties: + name: + type: string + example: 'greetings:write' + displayName: + type: string + example: "Write Greetings" + description: + type: string + example: "Allows writing greetings" + + SubscribedApplicationGetModel: + type: object + properties: + name: + type: string + example: Application1 + id: + type: string + example: 23fd-23gd-54vv-sdhf + + Property: + type: object + required: + - name + - value + properties: + name: + type: string + example: "label" + value: + type: string + example: "Internal" + + responses: + BadRequest: + description: Bad Request. Invalid request or validation error. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + example: + code: 400 + message: Bad Request + description: Invalid request or validation error + + Conflict: + description: Conflict. Specified resource already exists. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + example: + code: 409 + message: Conflict + description: Specified resource already exists + moreInfo: '' + error: [] + Forbidden: + description: >- + Forbidden. The request must be conditional but no condition has been + specified. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + example: + code: 403 + message: Forbidden + description: >- + The request must be conditional but no condition has been + specified + InternalServerError: + description: Internal Server Error. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + example: + code: 500 + message: Internal Server Error + description: >- + The server encountered an internal error. Please contact + administrator. + moreInfo: '' + error: [] + NotFound: + description: Not Found. The specified resource does not exist. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + example: + code: 404 + message: Not Found + description: The specified resource does not exist + moreInfo: '' + error: [] + + Unauthorized: + description: Unauthorized. The user is not authorized. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + example: + code: 401 + message: Unauthorized + description: The user is not authorized + moreInfo: '' + error: [] + + securitySchemes: + OAuth2: + type: oauth2 + flows: + authorizationCode: + authorizationUrl: 'https://api.asgardeo.io/t/{organization-name}/oauth2/authorize' + tokenUrl: 'http://api.asgardeo.io/t/{organization-name}/oauth2/token' + scopes: {} diff --git a/docusaurus-asgardeo/static/apis/restapis/app-native-authentication-api.yaml b/docusaurus-asgardeo/static/apis/restapis/app-native-authentication-api.yaml new file mode 100644 index 0000000000..3eb8935101 --- /dev/null +++ b/docusaurus-asgardeo/static/apis/restapis/app-native-authentication-api.yaml @@ -0,0 +1,455 @@ +openapi: 3.0.0 +info: + description: > + This document specifies an **Authentication RESTful API** for **Asgardeo** which can be used to perform a complete API-based user authentication. + + > This API is part of the **App-Native Authentication** capability that can authenticate users within the context of the application without external redirects. + Refer to the feature documentation for more information. + version: v1 + title: Asgardeo - Application-native Authentication Rest API + contact: + name: WSO2 + url: 'https://wso2.com/products/identity-server/' + license: + name: Apache 2.0 + url: 'https://www.apache.org/licenses/LICENSE-2.0.html' + +servers: + - url: 'https://{server-url}/t/{tenant-domain}/oauth2/' + variables: + tenant-domain: + default: "carbon.super" + server-url: + default: "localhost:9443" + +paths: + /authorize: + get: + operationId: Initiate Authentication* + description: | + This API is used to initiate application-native authentication. + + *While this is not an API specific to app-native authentication, a standard OAuth2 authorization request is used + to initiate app-native authentication with the exception of setting the `response_mode` to `direct`. Subsequent requests should be made to the `/authn` endpoint described under [Handle Authentication](#operation/Handle%20Authentication). + parameters: + - name: response_type + in: query + required: true + schema: + type: string + enum: + - code + - name: client_id + in: query + required: true + schema: + type: string + - name: response_mode + in: query + required: true + schema: + type: string + enum: + - direct + - name: redirect_uri + in: query + required: true + schema: + type: string + - name: scope + in: query + required: false + schema: + type: string + - name: state + in: query + required: false + schema: + type: string + responses: + '200': + description: Ok + content: + application/json: + schema: + $ref: '#/components/schemas/AuthResponse' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /authn: + post: + operationId: Handle Authentication + description: This API provides the capability to perform user authentication. + requestBody: + required: true + description: Authentication request body. + content: + application/json: + schema: + $ref: '#/components/schemas/AuthRequest' + responses: + '200': + description: Ok + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/AuthResponse' + - $ref: '#/components/schemas/SuccessResponse' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' +components: + schemas: + AuthRequest: + description: | + Authentication request body. + required: + - flowId + - selectedAuthenticator + type: object + properties: + flowId: + type: string + description: A unique identifier for the authentication flow. + The value of the flowId will remain the same for the entire authentication flow. + example: 3bd1f207-e5b5-4b45-8a91-13b0acfb2151 + selectedAuthenticator: + $ref: '#/components/schemas/SelectedAuthenticator' + SelectedAuthenticator: + type: object + description: Contains the data related to a selected authenticator. + required: + - authenticatorId + properties: + authenticatorId: + type: string + description: The unique identifier of the selected authenticator. + example: QmFzaWNBdXRoZW50aWNhdG9yOkxPQ0FM + params: + type: object + description: | + The parameters required for the authenticator to perform user authentication. + additionalProperties: + type: string + example: + username: johnd + password: a#m1N + AuthResponse: + type: object + description: Authentication response body. + required: + - flowId + - flowStatus + - flowType + - nextStep + - links + properties: + flowId: + type: string + description: A unique identifier for the authentication flow. + The value of the flowId will remain the same for the entire authentication flow. + example: 3bd1f207-e5b5-4b45-8a91-13b0acfb2151 + flowStatus: + type: string + enum: + - INCOMPLETE + - FAIL_INCOMPLETE + description: | + The status of the authentication flow. + - INCOMPLETE - The authentication flow is incomplete and requires further steps. + - FAIL_INCOMPLETE - The authentication flow has failed and requires further steps. + example: INCOMPLETE + flowType: + type: string + enum: + - AUTHENTICATION + description: The type of the authentication flow. This version only contains flowType AUTHENTICATION. + example: AUTHENTICATION + nextStep: + $ref: '#/components/schemas/NextStep' + links: + type: array + items: + $ref: '#/components/schemas/Link' + description: Contains the urls related to the authentication flow. + NextStep: + type: object + description: Contains the authenticator data related to the next step. + required: + - stepType + - authenticators + properties: + stepType: + type: string + enum: + - MULTI_OPTIONS_PROMPT + - AUTHENTICATOR_PROMPT + description: | + The type of the next step in the authentication flow. + - MULTI_OPTIONS_PROMPT - The next step is for authenticator selection. + - AUTHENTICATOR_PROMPT - The next step is for authenticating the user through a + configured authenticator. + example: AUTHENTICATOR_PROMPT + authenticators: + type: array + items: + $ref: '#/components/schemas/Authenticator' + description: Contains the data related to the available authentication steps. + acceptErrorParams: + type: boolean + description: | + Denote that the server is capable of handling errors on behalf of the application. When this is set to `true` + and when the application is handling part of the authentication process (ex: handling federation) when there + are errors, the application can send the params in the error response to the server to handle it appropriately. + example: false + messages: + type: array + items: + $ref: '#/components/schemas/Message' + description: Contains any messages related to the authentication step. + Authenticator: + type: object + description: Contains the data related to an authenticator. + required: + - authenticatorId + - authenticator + - idp + - metadata + properties: + authenticatorId: + type: string + description: | + The authenticator identifier. Note that this identifier is mutable and can change over time. + Therefore do not base any logic on this value. + example: QmFzaWNBdXRoZW50aWNhdG9yOkxPQ0FM + authenticator: + type: string + description: The authenticator identifier. + example: Username & Password + idp: + type: string + description: The identity provider identifier. + example: LOCAL + metadata: + $ref: '#/components/schemas/AuthenticatorMetadata' + requiredParams: + type: array + items: + type: string + description: | + Contains the required parameters that should be sent to the server for processing the current step of the + authentication request. + example: [ "username", "password" ] + AuthenticatorMetadata: + type: object + description: Contains the metadata related to an authenticator. + required: + - i18nKey + properties: + i18nKey: + type: string + description: The i18n key for the authenticator. This can be used to get the localized text for the + authenticator. + example: authenticator.basic + promptType: + type: string + enum: + - USER_PROMPT + - INTERNAL_PROMPT + - REDIRECTION_PROMPT + description: | + The type of the prompt. The prompt can be one of the following. + - USER_PROMPT - The prompt is for the user to input the required parameters for the authenticator. + - INTERNAL_PROMPT - The prompt is for the system to perform an internal action which will result in + obtaining the required parameters. ex: prompt for fido authentication, prompt for native federated authentication. + - REDIRECTION_PROMPT - The prompt is for the user to be redirected to a different url which will result in obtaining + the required parameters. ex: Authenticate using a federated authenticator which requires the user to be + redirect to the federation identity provider. In this case a redirectUrl will be available in `additionalData`. + example: USER_PROMPT + params: + type: array + items: + $ref: '#/components/schemas/Param' + description: | + Contains the data related to input parameters of the authenticator. Only present if the `promptType` is `USER_PROMPT`. + additionalData: + type: object + additionalProperties: + type: string + description: | + Contains any additional data related to the authenticator which would be needed for the application to perform + authentication. ex: Fido2 challenge, redirectUrl for federated authentication. + example: + redirectUrl: https://accounts.google.com/o/oauth2/auth?response_type=code&redirect_uri=https%3A%2F%2Fexample-app.com%2Fredirect&state=e12f-ed27-49e5-ad0a-8bbb5671d81e%2COIDC&client_id=231644702133-ds23592jt.apps.googleusercontent.com&scope=openid + Param: + type: object + description: Contains the data related to an input parameter of the authenticator. + required: + - param + - type + - isConfidential + - order + - i18nKey + properties: + param: + type: string + description: The parameter identifier. + example: username + type: + type: string + enum: + - STRING + - INTEGER + - BOOLEAN + description: Indicates the data type of the parameter. + example: STRING + isConfidential: + type: boolean + description: Indicates whether the parameter is confidential or not. + example: false + order: + type: integer + description: Indicates the recommended display order of the parameter. + example: 1 + validationRegex: + type: string + description: Contains the regex pattern to validate the parameter value. + example: ^[\S]{3,50}$ + i18nKey: + type: string + description: The i18n key for the parameter. This can be used to get the localized text for the parameter. + example: param.username + Message: + type: object + description: Contains the data related to a message for the authentication step. + required: + - type + - messageId + - message + - i18nKey + properties: + type: + type: string + enum: + - INFO + - ERROR + description: Indicates the type of the message. + example: ERROR + messageId: + type: string + description: The message identifier. + example: msg_invalid_un_pw + message: + type: string + description: The message. + example: Invalid username or password. + i18nKey: + type: string + description: The i18n key for the message. This can be used to get the localized text for the message. + example: message.msg_invalid_un_pw + context: + type: array + items: + $ref: '#/components/schemas/Context' + description: | + Contains any context information related to the message. The context information can be used to + create localized messages. The available different context information is bound to the messageId. + ex: failed attempt remaining count. + Context: + type: object + description: A property map to contain any context information for messages. + required: + - key + - value + properties: + key: + type: string + example: remainingAttempts + value: + type: string + example: 2 + Link: + type: object + description: Contains the data related to a link. + required: + - name + - href + - method + properties: + name: + type: string + description: The identifier of the link. + example: authentication + href: + type: string + description: The relative url of the link. + example: /api/authenticate/v1 + method: + type: string + enum: + - GET + - POST + description: The supported http methods of the link. + example: POST + SuccessResponse: + type: object + description: Response with authorization code received after a successful authentication. + properties: + flowStatus: + type: string + enum: + - SUCCESS_COMPLETED + description: | + The status of the authentication flow. + - SUCCESS_COMPLETED - The authentication flow has been successfully completed. + example: SUCCESS_COMPLETED + authData: + type: object + description: | + Data related to the successful authentication. This will contain the authorization code which can be used to + obtain the access token. + additionalProperties: + type: string + example: + code: dbde709c-c5a5-3643-8604-30ef32b44c90 + state: loginpg + Error: + type: object + description: Contains the data related to an error. + required: + - code + - message + - description + - traceId + properties: + code: + type: string + example: ABA-00000 + message: + type: string + example: Some error message. + description: + type: string + example: Some error description. + traceId: + type: string + example: e0fbcfeb-3617-43c4-8dd0-7b7d38e13047 diff --git a/docusaurus-asgardeo/static/apis/restapis/application-management.yaml b/docusaurus-asgardeo/static/apis/restapis/application-management.yaml new file mode 100644 index 0000000000..b812cc3e5e --- /dev/null +++ b/docusaurus-asgardeo/static/apis/restapis/application-management.yaml @@ -0,0 +1,5633 @@ +openapi: 3.0.0 +info: + description: > + This document explains the RESTful API for application management in Asgardeo. + version: "v1" + title: Asgardeo - Application Management Rest API +security: + - OAuth2: [] +paths: + /applications: + get: + tags: + - Applications + operationId: getAllApplications + summary: | + List applications + description: "This API provides the capability to retrieve the list of applications.\n\n Scope(Permission) required: ``internal_application_mgt_view``" + parameters: + - $ref: '#/components/parameters/limitQueryParam' + - $ref: '#/components/parameters/offsetQueryParam' + - $ref: '#/components/parameters/filterQueryParam' + - $ref: '#/components/parameters/sortOrderQueryParam' + - $ref: '#/components/parameters/sortByQueryParam' + - $ref: '#/components/parameters/attributesQueryParam' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/ApplicationListResponse' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '501': + description: Not Implemented + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/applications?limit=30&offset=0' \ + -H 'accept: application/json' + -H 'Authorization: Bearer {bearer_token}' + /applications/: + post: + tags: + - Applications + summary: | + Add application + operationId: createApplication + description: | + This API provides the capability to store application information provided by users. + + Scope(Permission) required: + - `internal_application_mgt_create` + + ➕ Additional Scopes + + To create an application with an authentication script, you also need the following additional scope: + + | Action | Scope | + |---------|--------| + | Create an application with an authentication script | `internal_application_script_update` | + + **Recommendation:** For authentication script updates, we recommend using the [/applications/{applicationId}/authenticationSequence/script](#tag/Applications/operation/updateAuthenticationScript) endpoint. + parameters: + - in: query + name: template + required: true + description: "Pre-defined template to use when creating the application. +

    The pre-defined template IDs are as follows: +
      +
    • SAML - `776a73da-fd8e-490b-84ff-93009f8ede85`
    • +
    • OIDC - `b9c5e11e-fc78-484b-9bec-015d247561b8`
    • +
    • Single Page App - `6a90e4b0-fbff-42d7-bfde-1efd98f07cd7`
    • +
    • Android Mobile - `44a2d9d9-bc0c-4b54-85df-1cf08f4002ec`
    • +
    " + schema: + type: string + requestBody: + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/ApplicationModelOIDC' + - $ref: '#/components/schemas/ApplicationModelSAML' + - $ref: '#/components/schemas/ApplicationModelPassiveSTS' + - $ref: '#/components/schemas/ApplicationModelCustom' + description: This represents the application to be created. + required: true + responses: + '201': + description: Successful response. + headers: + Location: + description: This denotes the location of the newly-created application. + schema: + type: string + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '409': + description: Conflict + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '501': + description: Not Implemented + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/applications/?template={template-id}' \ + -H 'accept: */*' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "name": "pickup-dispatch", + "description": "This is the configuration for Pickup-dispatch application.", + "imageUrl": "https://example.com/logo/my-logo.png", + "accessUrl": "https://example.com/login", + "templateId": "b9c5e11e-fc78-484b-9bec-015d247561b8", + "templateVersion": "v1.0.0", + "isManagementApp": false, + "claimConfiguration": { + "dialect": "LOCAL", + "claimMappings": [ + { + "applicationClaim": "firstname", + "localClaim": { + "uri": "http://wso2.org/claims/username" + } + } + ], + "requestedClaims": [ + { + "claim": { + "uri": "http://wso2.org/claims/username" + }, + "mandatory": false + } + ], + "subject": { + "claim": { + "uri": "http://wso2.org/claims/username" + }, + "includeUserDomain": false, + "includeTenantDomain": false, + "useMappedLocalSubject": false + }, + "role": { + "mappings": [ + { + "localRole": "admin", + "applicationRole": "Administrator" + } + ], + "includeUserDomain": true, + "claim": { + "uri": "http://wso2.org/claims/username" + } + } + }, + "inboundProtocolConfiguration": { + "oidc": { + "clientId": "rMfbPgCi5oWljNhv8c4Pugfuo8Aa", + "clientSecret": "MkHGGiTdAPfTyUKfXLdyOwelMywt", + "grantTypes": [ + "authorization_code", + "password" + ], + "callbackURLs": [ + "regexp=(https://app.example.com/callback1|https://app.example.com/callback2)" + ], + "allowedOrigins": [ + "https://app.example.com" + ], + "publicClient": false, + "pkce": { + "mandatory": false, + "supportPlainTransformAlgorithm": true + }, + "accessToken": { + "type": "JWT", + "userAccessTokenExpiryInSeconds": 3600, + "applicationAccessTokenExpiryInSeconds": 3600, + "bindingType": "cookie", + "revokeTokensWhenIDPSessionTerminated": true, + "validateTokenBinding": true + }, + "refreshToken": { + "expiryInSeconds": 86400, + "renewRefreshToken": true + }, + "idToken": { + "expiryInSeconds": 3600, + "audience": [ + "http://idp.xyz.com", + "http://idp.abc.com" + ], + "encryption": { + "enabled": false, + "algorithm": "RSA-OAEP", + "method": "A128CBC+HS256" + } + }, + "logout": { + "backChannelLogoutUrl": "https://app.example.com/backchannel/callback", + "frontChannelLogoutUrl": "https://app.example.com/frontchannel/callback" + }, + "validateRequestObjectSignature": false, + "scopeValidators": [ + "Role based scope validator" + ] + } + }, + "authenticationSequence": { + "type": "DEFAULT", + "steps": [ + { + "id": 1, + "options": [ + { + "idp": "LOCAL", + "authenticator": "basic" + } + ] + } + ], + "script": "string", + "subjectStepId": 1, + "attributeStepId": 1 + }, + "advancedConfigurations": { + "saas": false, + "discoverableByEndUsers": false, + "certificate": { + "type": "string", + "value": "string" + }, + "skipLoginConsent": false, + "skipLogoutConsent": false, + "useExternalConsentPage": false, + "returnAuthenticatedIdpList": false, + "enableAuthorization": true + } + }' + /applications/import: + post: + tags: + - Applications + summary: | + Create application from an exported XML file + operationId: importApplication + description: | + This API provides the ability to store the application information as a file. + + Scope(Permission) required: + + - `internal_application_mgt_create` + + ➕ Additional Scopes + + To create an application with an authentication script via file import, you also need the following additional scope: + + | Action | Scope | + |---------|--------| + | Create an application with an authentication script via file import | `internal_application_script_update` | + + **Recommendation:** For authentication script updates, we recommend using the [/applications/{applicationId}/authenticationSequence/script](#tag/Applications/operation/updateAuthenticationScript) endpoint. + requestBody: + content: + multipart/form-data: + schema: + $ref: '#/components/schemas/FileUpload' + description: This represents the application to be created. + responses: + '201': + description: Successfully created. + headers: + Location: + description: Location of the newly created application. + schema: + type: string + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '409': + description: Conflict + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/applications/import' \ + -H 'accept: */*' \ + -H 'Content-Type: multipart/form-data' \ + -H 'Authorization: Bearer {bearer_token}' \ + -F 'file=@file-name.xml;type=text/xml' + put: + tags: + - Applications + summary: | + Update application from an exported XML file + operationId: importApplicationForUpdate + description: | + This API provides the capability to update an application from information that has been exported as an XML file. + + Scope(Permission) required: + - `internal_application_mgt_update` + + ➕ Additional Scopes + + To update the authentication script of an application via file import, you also need the following additional scope: + + | Action | Scope | + |---------|--------| + | Update the authentication script via file import | `internal_application_script_update` | + + **Recommendation:** For authentication script updates, we recommend using the [/applications/{applicationId}/authenticationSequence/script](#tag/Applications/operation/updateAuthenticationScript) endpoint. + requestBody: + content: + multipart/form-data: + schema: + $ref: '#/components/schemas/FileUpload' + description: This represents the application to be updated. + responses: + '200': + description: Successfully Updated. + headers: + Location: + description: Location of the updated application. + schema: + type: string + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '409': + description: Conflict + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PUT' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/applications/import' \ + -H 'accept: */*' \ + -H 'Content-Type: multipart/form-data' \ + -H 'Authorization: Bearer {bearer_token>}' \ + -F 'file=@file-name.xml;type=text/xml' + /applications/{applicationId}: + get: + tags: + - Applications + summary: | + Retrieve application by ID + operationId: getApplication + description: "This API provides the capability to retrieve the application information by ID. \n\n Scope(Permission) required: `internal_application_mgt_view`" + parameters: + - name: applicationId + in: path + description: ID of the application. + required: true + schema: + type: string + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/ApplicationResponseModel' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + application/xml: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + application/xml: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + application/xml: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/applications/{application-id}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + patch: + tags: + - Applications + summary: | + Partially update application by ID + operationId: patchApplication + description: | + This API provides the capability to partially update an application by ID. + + Scope(Permission) required: + - `internal_application_mgt_update` + + ➕ Additional Scopes + + To update the authentication script of an application, you also need the following additional scope: + + | Action | Scope | + |---------|--------| + | Update the authentication script | `internal_application_script_update` | + + **Recommendation:** For authentication script updates, we recommend using the [/applications/{applicationId}/authenticationSequence/script](#tag/Applications/operation/updateAuthenticationScript) endpoint. + parameters: + - name: applicationId + in: path + description: ID of the application. + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ApplicationPatchModel' + description: This represents the application details to be updated. + required: true + responses: + '200': + description: Successfully Updated + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '409': + description: Conflict + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PATCH' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/applications/{application-id}' \ + -H 'accept: */*' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "name": "pickup", + "description": "This is the configuration for Pickup-dispatch application.", + "imageUrl": "https://example.com/logo/my-logo.png", + "accessUrl": "https://example.com/login", + "templateId": "adwefi2429asdfdf94444rraf44", + "templateVersion": "v1.0.0", + "claimConfiguration": { + "dialect": "LOCAL", + "claimMappings": [ + { + "applicationClaim": "firstname", + "localClaim": { + "uri": "http://wso2.org/claims/username" + } + } + ], + "requestedClaims": [ + { + "claim": { + "uri": "http://wso2.org/claims/username" + }, + "mandatory": false + } + ], + "subject": { + "claim": { + "uri": "http://wso2.org/claims/username" + }, + "includeUserDomain": false, + "includeTenantDomain": false, + "useMappedLocalSubject": false + }, + "role": { + "mappings": [ + { + "localRole": "admin", + "applicationRole": "Administrator" + } + ], + "includeUserDomain": true, + "claim": { + "uri": "http://wso2.org/claims/username" + } + } + }, + "authenticationSequence": { + "type": "DEFAULT", + "steps": [ + { + "id": 1, + "options": [ + { + "idp": "LOCAL", + "authenticator": "basic" + } + ] + } + ], + "script": "string", + "subjectStepId": 1, + "attributeStepId": 1 + }, + "advancedConfigurations": { + "saas": false, + "discoverableByEndUsers": false, + "certificate": { + "type": "string", + "value": "string" + }, + "skipLoginConsent": false, + "skipLogoutConsent": false, + "useExternalConsentPage": false, + "returnAuthenticatedIdpList": false, + "enableAuthorization": true + } + }' + delete: + tags: + - Applications + summary: | + Delete application by ID + operationId: deleteApplication + description: "This API provides the capability to delete an application by ID. \n\n Scope(Permission) required: `internal_application_mgt_delete`" + parameters: + - name: applicationId + in: path + description: ID of the application. + required: true + schema: + type: string + responses: + '204': + description: Successfully Deleted + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'DELETE' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/applications/{application-id}' \ + -H 'accept: */*' \ + -H 'Authorization: Bearer {bearer_token}' + /applications/{applicationId}/export: + get: + tags: + - Applications + operationId: exportApplication + summary: | + Export application as an XML file + description: | + This API provides the capability to retrieve the application as an XML file. + + Scope(Permission) required: + - `internal_application_mgt_view` + + ➕ Additional Scopes + + To export the application with the client secret, you also need the following additional scope: + + | Action | Scope | + |---------|--------| + | Export the client secret | `internal_application_mgt_client_secret_view` | + parameters: + - name: applicationId + in: path + description: ID of the application. + required: true + schema: + type: string + - $ref: '#/components/parameters/exportSecretsQueryParam' + responses: + '200': + description: OK + content: + application/octet-stream: + schema: + example: 'Sample application configuration xml as a string' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/applications/{application-id}/export?exportSecrets=false' \ + -H 'accept: application/octet-stream' \ + -H 'Authorization: Bearer {bearer_token}' + # /applications/{applicationId}/owner: + # put: + # tags: + # - Applications + # operationId: changeApplicationOwner + # summary: | + # Change application owner + # description: "This API provides the capability to change the application owner. \n\n Scope required: ``SYSTEM``" + # parameters: + # - name: applicationId + # in: path + # description: ID of the application. + # required: true + # schema: + # type: string + # requestBody: + # content: + # application/json: + # schema: + # $ref: '#/components/schemas/ApplicationOwner' + # responses: + # '200': + # description: Successfully Updated + # '400': + # description: Bad Request + # content: + # application/json: + # schema: + # $ref: '#/components/schemas/Error' + # '401': + # description: Unauthorized + # '403': + # description: Forbidden + # '404': + # description: Not Found + # content: + # application/json: + # schema: + # $ref: '#/components/schemas/Error' + # '500': + # description: Server Error + # content: + # application/json: + # schema: + # $ref: '#/components/schemas/Error' + /applications/{applicationId}/authenticationSequence/script: + put: + tags: + - Applications + operationId: updateAuthenticationScript + summary: Update authentication script of the application + description: | + This API provides the capability to update the authentication script of the application.
    + Scope(Permission) required: `internal_application_script_update`
    + parameters: + - name: applicationId + in: path + description: ID of the application. + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ScriptUpdateModel' + description: This represents the authentication script to be updated. + required: true + responses: + '200': + description: Successfully Updated + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PUT' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/applications/{application-id}/authenticationSequence/script' \ + -H 'accept: */*' \ + -H 'Authorization: Bearer {bearer_token}' \ + -H 'Content-Type: application/json' \ + -d '{ + "script": "var onLoginRequest = function(context) {\n executeStep(1);\n};\n" + }' + /applications/{applicationId}/authenticators: + get: + tags: + - Authenticators + summary: | + Get configured authenticators + operationId: getConfiguredAuthenticators + description: "This API provides the capability to retrieve the configured authenticators. \n\n Scope(Permission) required: ``internal_application_mgt_view``" + parameters: + - name: applicationId + in: path + description: ID of the application. + required: true + schema: + type: string + responses: + '200': + description: OK + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/ConfiguredAuthenticatorsModal' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/applications/{application-id}/authenticators' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + /applications/{applicationId}/authorized-apis: + get: + tags: + - Authorized APIs + summary: | + Get authorized APIs of the application. + operationId: getAuthorizedAPIs + description: | + This API provides the capability to retrieve all the authorized APIs of the application.
    + + Scope(Permission) required: `internal_application_mgt_view` + parameters: + - name: applicationId + in: path + description: ID of the application. + required: true + schema: + type: string + responses: + '200': + description: OK + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/AuthorizedAPIResponse' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/applications/{application-id}/authorized-apis' \ + -H 'Authorization: Bearer {bearer_token}' + post: + tags: + - Authorized APIs + summary: | + Authorized an API to the application + operationId: addAuthorizedAPI + description: | + This API provides the capability to authorized an API to the application.
    + + Scope(Permission) required: + - `internal_application_mgt_update` + + ➕ Additional Scopes + + To authorize management/organization APIs and business APIs, you also need the following additional scopes: + + | Action | Scope | + |---------|--------| + | Authorize management/organization API | `internal_application_internal_api_update` | + | Authorize business APIs | `internal_application_business_api_update` | + parameters: + - name: applicationId + in: path + description: ID of the application. + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/AuthorizedAPICreationModel' + responses: + '201': + description: Created + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/applications/{application-id}/authorized-apis' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "id": "65b52595-9ca1-4539-aca2-56178643c58b", + "policyIdentifier": "RBAC", + "scopes": [ + "bookings:read" + ] + }' + x-codegen-request-body-name: body + + /applications/{applicationId}/authorized-apis/{apiId}: + patch: + tags: + - Authorized APIs + summary: | + Update authorized API scopes + operationId: patchAuthorizedAPI + description: | + This API provides the capability to update an authorized API of the application.
    + + Scope(Permission) required: + - `internal_application_mgt_update` + + ➕ Additional Scopes + + To update authorized management/organization APIs and business APIs, you also need the following additional scopes: + + | Action | Scope | + |---------|--------| + | Update authorized management/organization API | `internal_application_internal_api_update` | + | Update authorized business APIs | `internal_application_business_api_update` | + parameters: + - name: applicationId + in: path + description: ID of the application. + required: true + schema: + type: string + - name: apiId + in: path + description: ID of the API resource. + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/AuthorizedAPIPatchModel' + responses: + '200': + description: OK + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location --request PATCH 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/applications/{application-id}/authorized-apis/{api-id}' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "addedScopes": [ + "bookings:write" + ], + "removedScopes": [ + "bookings:read" + ] + }' + x-codegen-request-body-name: body + delete: + tags: + - Authorized APIs + summary: | + Remove API authorization from the application + operationId: deleteAuthorizedAPI + description: | + This API provides the capability to delete an authorized API of the application.
    + + Scope(Permission) required: + - `internal_application_mgt_update` + + ➕ Additional Scopes + + To remove authorized management/organization APIs and business APIs, you also need the following additional scopes: + + | Action | Scope | + |---------|--------| + | Remove authorized management/organization API | `internal_application_internal_api_update` | + | Remove authorized business APIs | `internal_application_business_api_update` | + parameters: + - name: applicationId + in: path + description: ID of the application. + required: true + schema: + type: string + - name: apiId + in: path + description: ID of the API resource. + required: true + schema: + type: string + responses: + '204': + description: No Content + '401': + description: Unauthorized + '403': + description: Forbidden + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location --request DELETE 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/applications/{application-id}/authorized-apis/{api-id}' \ + -H 'Authorization: Bearer {bearer_token}' + /applications/resident: + get: + tags: + - Resident application + summary: | + Get resident application + operationId: getResidentApplication + description: "This API provides the capability to retrieve the resident application information.\n\nScope(Permission) required:`internal_application_mgt_view`" + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/ResidentApplication' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/applications/resident' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + put: + tags: + - Resident application + summary: | + Update resident application + operationId: updateResidentApplication + description: "This API provides the capability to update the Resident Application Configuration.\n\n Scope(Permission) required:`internal_application_mgt_update`" + responses: + '200': + description: Successful + '201': + description: Successful response. + headers: + Location: + description: >- + Location of the provisioning configuration of the resident + application. + schema: + type: string + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '409': + description: Conflict + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PUT' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/applications/resident' \ + -H 'accept: */*' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "inboundProvisioning": { + "proxyMode": false, + "provisioningUserstoreDomain": "PRIMARY" + }, + "outboundProvisioningIdps": [ + { + "idp": "Google", + "connector": "googleapps", + "blocking": false, + "rules": false, + "jit": false + } + ] + }' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ProvisioningConfiguration' + description: >- + This represents the provisioning configuration of the resident + application. + required: true + '/applications/{applicationId}/inbound-protocols/': + get: + tags: + - Inbound Protocols + summary: | + Retrieve inbound protocol configurations of the application + operationId: getInboundAuthenticationConfigurations + description: "This API provides the capability to retrieve authentication protocol configurations of an application.\n\nScope(Permission) required:`internal_application_mgt_view`" + parameters: + - name: applicationId + in: path + description: ID of the application. + required: true + schema: + type: string + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/InboundProtocolsListResponse' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/applications/{application-id}/inbound-protocols/' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + /applications/{applicationId}/inbound-protocols/saml: + get: + tags: + - Inbound Protocols - SAML + summary: | + Retrieve SAML2 authentication parameters of app + operationId: getInboundSAMLConfiguration + description: "This API provides the capability to retrieve SAML2 authentication protocol parameters of an application. \n\nScope(Permission) required:`internal_application_mgt_view`" + parameters: + - name: applicationId + in: path + description: ID of the application. + required: true + schema: + type: string + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/SAML2ServiceProvider' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/applications/{application-id}/inbound-protocols/saml' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + put: + tags: + - Inbound Protocols - SAML + summary: | + Update SAML2 authentication parameters of app + operationId: updateInboundSAMLConfiguration + description: "This API provides the capability to store SAML2 authentication protocol parameters of an application.\n\nScope(Permission) required:`internal_application_mgt_update` + + - There are three methods to create/update SAML2 authentication protocol configuration. +
      +
    1. Metadata File (by sending the Base64 encoded metadata file content)
    2. +
    3. Metadata URL
    4. +
    5. Manual configuration
    6. +
    " + parameters: + - name: applicationId + in: path + description: ID of the application. + required: true + schema: + type: string + responses: + '200': + description: Successful + '201': + description: Successful response. + headers: + Location: + description: Location of the newly created SAML Inbound configuration. + schema: + type: string + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '409': + description: Conflict + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PUT' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/applications/{application-id}/inbound-protocols/saml' \ + -H 'accept: */*' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "manualConfiguration": { + "issuer": "travelocity_460", + "serviceProviderQualifier": "serviceProviderQualifierValue", + "assertionConsumerUrls": [ + [ + "http://localhost:8080/travelocity_460.com/home.jsp", + "http://localhost:8080/travelocity_460.com/home1.jsp" + ] + ], + "defaultAssertionConsumerUrl": "http://localhost:8080/travelocity_460.com/home1.jsp", + "idpEntityIdAlias": "https://localhost.com", + "singleSignOnProfile": { + "bindings": [ + [ + "HTTP_POST", + "HTTP_REDIRECT" + ] + ], + "enableSignatureValidationForArtifactBinding": false, + "enableIdpInitiatedSingleSignOn": false, + "assertion": { + "nameIdFormat": "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress", + "audiences": [ + "https://app.example.com/saml" + ], + "recipients": [ + "https://app.example.com/saml" + ], + "digestAlgorithm": "http://www.w3.org/2000/09/xmldsig#sha1", + "encryption": { + "enabled": false, + "assertionEncryptionAlgorithm": "http://www.w3.org/2001/04/xmlenc#aes256-cbc", + "keyEncryptionAlgorithm": "http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p" + } + } + }, + "attributeProfile": { + "enabled": false, + "alwaysIncludeAttributesInResponse": false + }, + "singleLogoutProfile": { + "enabled": true, + "logoutRequestUrl": "https://localhost.com", + "logoutResponseUrl": "https://localhost.com", + "logoutMethod": "BACKCHANNEL", + "idpInitiatedSingleLogout": { + "enabled": false, + "returnToUrls": [ + [ + "https://localhost.com" + ] + ] + } + }, + "requestValidation": { + "enableSignatureValidation": true, + "signatureValidationCertAlias": "string" + }, + "responseSigning": { + "enabled": true, + "signingAlgorithm": "http://www.w3.org/2001/04/xmldsig-more#rsa-ripemd160" + }, + "enableAssertionQueryProfile": false + } + }' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/SAML2Configuration' + description: This represents the SAML2 protocol attributes of the application. + required: true + delete: + tags: + - Inbound Protocols - SAML + summary: | + Delete SAML2 authentication parameters of app + operationId: deleteInboundSAMLConfiguration + description: "This API provides the capability to delete SAML2 authentication protocol + parameters of an application. \n\n Scope(Permission) required: `internal_application_mgt_delete`" + parameters: + - name: applicationId + in: path + description: ID of the application. + required: true + schema: + type: string + responses: + '204': + description: Delete successful + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'DELETE' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/applications/{application-id}/inbound-protocols/saml' \ + -H 'accept: */*' \ + -H 'Authorization: Bearer {bearer_token}' + /applications/{applicationId}/inbound-protocols/oidc: + get: + tags: + - Inbound Protocols - OAuth / OIDC + summary: | + Retrieve OIDC authentication parameters of app + description: | + This API provides the capability to retrieve OIDC authentication protocol parameters of an application. + + Scope(Permission) required: + - `internal_application_mgt_view` + + ➕ Additional Scopes + + To view the client secret, you also need the following additional scope: + + | Action | Scope | + |---------|--------| + | View client secret | `internal_application_mgt_client_secret_view` | + operationId: getInboundOAuthConfiguration + parameters: + - name: applicationId + in: path + description: ID of the application + required: true + schema: + type: string + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/OpenIDConnectConfiguration' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/applications/{application-id}/inbound-protocols/oidc' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + put: + tags: + - Inbound Protocols - OAuth / OIDC + summary: | + Update OIDC authentication parameters of app + description: "This API provides the capability to store OIDC authentication protocol parameters of an application. \n\n Scope(Permission) required: `internal_application_mgt_update`" + operationId: updateInboundOAuthConfiguration + parameters: + - name: applicationId + in: path + description: ID of the application. + required: true + schema: + type: string + responses: + '200': + description: Successful + '201': + description: Created + headers: + Location: + description: This is the location of the newly created OIDC Authentication Configuration. + schema: + type: string + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '409': + description: Conflict + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PUT' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/applications/{appplication-id}/inbound-protocols/oidc' \ + -H 'accept: */*' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}'\ + -d '{ + "clientId": "rMfbPgCi5oWljNhv8c4Pugfuo8Aa", + "clientSecret": "MkHGGiTdAPfTyUKfXLdyOwelMywt", + "grantTypes": [ + "authorization_code", + "password" + ], + "callbackURLs": [ + "regexp=(https://app.example.com/callback1|https://app.example.com/callback2)" + ], + "allowedOrigins": [ + "https://app.example.com" + ], + "publicClient": false, + "pkce": { + "mandatory": false, + "supportPlainTransformAlgorithm": true + }, + "accessToken": { + "type": "JWT", + "userAccessTokenExpiryInSeconds": 3600, + "applicationAccessTokenExpiryInSeconds": 3600, + "bindingType": "cookie", + "revokeTokensWhenIDPSessionTerminated": true, + "validateTokenBinding": true + }, + "refreshToken": { + "expiryInSeconds": 86400, + "renewRefreshToken": true + }, + "idToken": { + "expiryInSeconds": 3600, + "audience": [ + "http://idp.xyz.com", + "http://idp.abc.com" + ], + "encryption": { + "enabled": false, + "algorithm": "RSA-OAEP", + "method": "A128CBC+HS256" + } + }, + "logout": { + "backChannelLogoutUrl": "https://app.example.com/backchannel/callback", + "frontChannelLogoutUrl": "https://app.example.com/frontchannel/callback" + }, + "validateRequestObjectSignature": false, + "scopeValidators": [ + "Role based scope validator" + ] + }' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OpenIDConnectConfiguration' + description: >- + This represents the OIDC authentication protocol parameters of an + application. + required: true + delete: + tags: + - Inbound Protocols - OAuth / OIDC + summary: | + Delete OIDC authentication parameters of app + description: | + This API provides the capability to delete OIDC authentication protocol + parameters of an application. \n\nScope(Permission) required: `internal_application_mgt_delete` + operationId: deleteInboundOAuthConfiguration + parameters: + - name: applicationId + in: path + description: ID of the application. + required: true + schema: + type: string + responses: + '204': + description: Delete Success + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'DELETE' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/applications/{application-id}/inbound-protocols/oidc' \ + -H 'accept: */*' \ + -H 'Authorization: Bearer {bearer_token}' + /applications/{applicationId}/inbound-protocols/oidc/regenerate-secret: + post: + tags: + - Inbound Protocols - OAuth / OIDC + summary: | + Regenerate the OAuth2/OIDC client secret of application + description: | + This API regenerates the OAuth2/OIDC client secret. + + Scope(Permission) required: `internal_application_mgt_client_secret_create` + operationId: regenerateOAuthClientSecret + parameters: + - name: applicationId + in: path + description: ID of the application + required: true + schema: + type: string + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/OpenIDConnectConfiguration' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/applications/{application-id}/inbound-protocols/oidc/regenerate-secret' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '' + /applications/{applicationId}/inbound-protocols/oidc/revoke: + post: + tags: + - Inbound Protocols - OAuth / OIDC + summary: | + Revoke the OAuth2/OIDC client secret + description: "This API revokes the OAuth2/OIDC client secret. To re-activate the client, the client secret needs to be regenerated.\n\n Scope(Permission) required: `internal_application_mgt_create`" + operationId: revokeOAuthClient + parameters: + - name: applicationId + in: path + description: ID of the application + required: true + schema: + type: string + responses: + '200': + description: Application Revoked + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/applications/application-id/inbound-protocols/oidc/revoke' \ + -H 'accept: */*' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '' + /applications/{applicationId}/inbound-protocols/passive-sts: + get: + tags: + - Inbound Protocols - Passive STS + summary: > + Retrieve Passive STS authentication parameters of app + description: "This API provides the capability to retrieve Passive STS authentication + protocol parameters of an application. \n\n Scope(Permission) required: `internal_application_mgt_view`" + operationId: getPassiveStsConfiguration + parameters: + - name: applicationId + in: path + description: ID of the application + required: true + schema: + type: string + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/PassiveStsConfiguration' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/applications/{application-id}/inbound-protocols/passive-sts' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + put: + tags: + - Inbound Protocols - Passive STS + summary: | + Update Passive STS authentication parameters of app + description: "This API provides the capability to store passive STS authentication + protocol parameters of an application. \n\n Scope(Permission) required: `internal_application_mgt_update`" + operationId: updatePassiveStsConfiguration + parameters: + - name: applicationId + in: path + description: ID of the application. + required: true + schema: + type: string + responses: + '200': + description: Successful + '201': + description: Successful response. + headers: + Location: + description: >- + Location of the newly created Passive STS Authentication + Configuration. + schema: + type: string + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '409': + description: Conflict + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PUT' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/applications/{application-id}/inbound-protocols/passive-sts' \ + -H 'accept: */*' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "realm": "string", + "replyTo": "string" + }' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PassiveStsConfiguration' + description: >- + This represents the Passive STS authentication protocol parameters of + an application. + required: true + delete: + tags: + - Inbound Protocols - Passive STS + summary: | + Delete Passive STS authentication parameters of app + description: "This API provides the capability to delete Passive STS authentication + protocol parameters of an application. \n\n Scope(Permission) required: `internal_application_mgt_delete`" + operationId: deletePassiveStsConfiguration + parameters: + - name: applicationId + in: path + description: ID of the application. + required: true + schema: + type: string + responses: + '204': + description: Delete Success + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'DELETE' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/applications/{application-id}/inbound-protocols/passive-sts' \ + -H 'accept: */*' \ + -H 'Authorization: Bearer {bearer_token}' + # '/applications/{applicationId}/inbound-protocols/ws-trust': + # get: + # tags: + # - Inbound Protocols - WS Trust + # summary: | + # Retrieve WS Trust authentication parameters of app + # description: "This API provides the capability to retrieve Passive STS authentication + # protocol parameters of an application. \n\n Scope required: `internal_application_mgt_view`" + # operationId: getWSTrustConfiguration + # parameters: + # - name: applicationId + # in: path + # description: ID of the application + # required: true + # schema: + # type: string + # responses: + # '200': + # description: OK + # content: + # application/json: + # schema: + # $ref: '#/components/schemas/WSTrustConfiguration' + # '400': + # description: Bad Request + # content: + # application/json: + # schema: + # $ref: '#/components/schemas/Error' + # '401': + # description: Unauthorized + # '403': + # description: Forbidden + # '404': + # description: Not Found + # content: + # application/json: + # schema: + # $ref: '#/components/schemas/Error' + # '500': + # description: Server Error + # content: + # application/json: + # schema: + # $ref: '#/components/schemas/Error' + # + # put: + # tags: + # - Inbound Protocols - WS Trust + # summary: | + # Update WS Trust authentication parameters of app + # description: "This API provides the capability to store WS Trust authentication + # protocol parameters of an application. \n\n Scope required: `internal_application_mgt_update`" + # operationId: updateWSTrustConfiguration + # parameters: + # - name: applicationId + # in: path + # description: ID of the application. + # required: true + # schema: + # type: string + # responses: + # '200': + # description: Successful + # '201': + # description: Successful response. + # headers: + # Location: + # description: >- + # Location of the newly created WS Trust Authentication + # Configuration. + # schema: + # type: string + # '400': + # description: Bad Request + # content: + # application/json: + # schema: + # $ref: '#/components/schemas/Error' + # '401': + # description: Unauthorized + # '403': + # description: Forbidden + # '404': + # description: Not Found + # content: + # application/json: + # schema: + # $ref: '#/components/schemas/Error' + # '409': + # description: Conflict + # content: + # application/json: + # schema: + # $ref: '#/components/schemas/Error' + # '500': + # description: Server Error + # content: + # application/json: + # schema: + # $ref: '#/components/schemas/Error' + # + # requestBody: + # content: + # application/json: + # schema: + # $ref: '#/components/schemas/WSTrustConfiguration' + # description: >- + # This represents the Passive STS authentication protocol parameters of + # an application. + # required: true + # delete: + # tags: + # - Inbound Protocols - WS Trust + # summary: | + # Delete WS Trust authentication parameters of app + # description: "This API provides the capability to delete WS Trust authentication + # protocol parameters of an application. \n\n Scope required: `internal_application_mgt_delete`" + # operationId: deleteWSTrustConfiguration + # parameters: + # - name: applicationId + # in: path + # description: ID of the application. + # required: true + # schema: + # type: string + # responses: + # '204': + # description: Delete Success + # '400': + # description: Bad Request + # content: + # application/json: + # schema: + # $ref: '#/components/schemas/Error' + # '401': + # description: Unauthorized + # '403': + # description: Forbidden + # '404': + # description: Not Found + # content: + # application/json: + # schema: + # $ref: '#/components/schemas/Error' + # '500': + # description: Server Error + # content: + # application/json: + # schema: + # $ref: '#/components/schemas/Error' + # + '/applications/{applicationId}/inbound-protocols/{inboundProtocolId}': + get: + tags: + - Inbound Protocols - Custom + summary: > + Retrieve custom Inbound authentication parameters of app + description: "This API provides the capability to retrieve custom inbound + authentication protocol parameters of an application. \n\n Scope(Permission) required: `internal_application_mgt_view`" + operationId: getCustomInboundConfiguration + parameters: + - name: applicationId + in: path + description: ID of the application + required: true + schema: + type: string + - name: inboundProtocolId + in: path + description: Inbound Authentication Protocol ID + required: true + schema: + type: string + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/CustomInboundProtocolConfiguration' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/applications/{application-id}/inbound-protocols/{inbound-protocol-id}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + put: + tags: + - Inbound Protocols - Custom + summary: | + Update custom inbound authentication parameters of app + description: "This API provides the capability to store custom inbound authentication protocol parameters of an application. \n\n Scope(Permission) required: `internal_application_mgt_update`" + operationId: updateCustomInboundConfiguration + parameters: + - name: applicationId + in: path + description: ID of the application. + required: true + schema: + type: string + - name: inboundProtocolId + in: path + description: Inbound Authentication Protocol ID + required: true + schema: + type: string + responses: + '200': + description: Successful + '201': + description: Successful response. + headers: + Location: + description: >- + Location of the newly created Custom Inbound authentication + protocol Configuration. + schema: + type: string + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '409': + description: Conflict + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PUT' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/applications/{application-id}/inbound-protocols/{inbound-protocol-id}' \ + -H 'accept: */*' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "name": "cas", + "configName": "cas", + "properties": [ + { + "key": "app-identifier", + "value": "http://app.wso2.com/employeeApp", + "friendlyName": "Application Identifier" + } + ] + }' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/CustomInboundProtocolConfiguration' + description: >- + This represents the Custom Inbound authentication protocol parameters + of an application. + required: true + delete: + tags: + - Inbound Protocols - Custom + summary: > + Delete custom inbound authentication parameters of app + description: "This API provides the capability to delete custom inbound authentication protocol of an application. \n\n Scope(Permission) required: `internal_application_mgt_delete`" + operationId: deleteCustomInboundConfiguration + parameters: + - name: applicationId + in: path + description: ID of the application. + required: true + schema: + type: string + - name: inboundProtocolId + in: path + description: Inbound Authentication Protocol ID + required: true + schema: + type: string + responses: + '204': + description: Delete Success + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'DELETE' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/applications/{application-id}/inbound-protocols/{inbound-protocol-id}' \ + -H 'accept: */*' \ + -H 'Authorization: Bearer {bearer_token}' + /applications/meta/inbound-protocols: + get: + tags: + - Application Metadata + summary: | + Retrieve the list of inbound authentication protocols available + description: "This API provides the capability to retrieve the list of inbound authentication protocols available. + If the query parameter 'customOnly' is set to true, only custom inbound protocols will be listed. + \n\n Scope(Permission) required: `internal_application_mgt_view`" + operationId: getInboundProtocols + parameters: + - $ref: '#/components/parameters/inboundProtocolsCustomOnly' + responses: + '200': + description: OK + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/AuthProtocolMetadata' + example: + - name: "saml" + displayName: "SAML2 Web SSO Configuration" + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/applications/meta/inbound-protocols?customOnly=true' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + /applications/meta/inbound-protocols/saml: + get: + tags: + - Application Metadata + summary: | + Retrieve all the metadata related to the auth protocol SAML + description: "This API provides the capability to retrieve all the metadata related to the auth protocol SAML. \n\n Scope(Permission) required: `internal_application_mgt_view`" + operationId: getSAMLMetadata + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/SAMLMetaData' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '403': + description: Forbidden + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/applications/meta/inbound-protocols/saml' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + '/applications/meta/inbound-protocols/oidc': + get: + tags: + - Application Metadata + summary: | + Retrieve all the metadata related to the authentication protocol OAuth / OIDC + description: "This API provides the capability to retrieve all the metadata related to the authentication protocol OAuth / OIDC. \n\n Scope(Permission) required: `internal_application_mgt_view`" + operationId: getOIDCMetadata + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/OIDCMetaData' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/applications/meta/inbound-protocols/oidc' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + # '/applications/meta/inbound-protocols/ws-trust': + # get: + # tags: + # - Application Metadata + # summary: | + # Retrieve all the metadata related to the auth protocol WS Trust + # description: "This API provides the capability to retrieve all the metadata related to the auth protocol `WS_Trust`. \n\n Scope required: `internal_application_mgt_view`" + # operationId: getWSTrustMetadata + # responses: + # '200': + # description: OK + # content: + # application/json: + # schema: + # $ref: '#/components/schemas/WSTrustMetaData' + # '401': + # description: Unauthorized + # '403': + # description: Forbidden + # '404': + # description: Not Found + # content: + # application/json: + # schema: + # $ref: '#/components/schemas/Error' + # '500': + # description: Server Error + # content: + # application/json: + # schema: + # $ref: '#/components/schemas/Error' + # + '/applications/meta/inbound-protocols/{inboundProtocolId}': + get: + tags: + - Application Metadata + summary: | + Retrieve all the metadata related to the custom auth protocol identified by the inboundProtocolId + description: "This API provides the capability to retrieve all the metadata related to the custom auth protocol + identified by the `inboundProtocolId`. The URL encoded inbound protocol name is used as `inboundProtocolId`. \n\n Scope(Permission) required: `internal_application_mgt_view`" + operationId: getCustomProtocolMetadata + parameters: + - name: inboundProtocolId + in: path + description: Inbound Authentication Protocol ID + required: true + schema: + type: string + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/CustomInboundProtocolMetaData' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/applications/meta/inbound-protocols/{inbound-protocol-id}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + /applications/meta/adaptive-auth-templates: + get: + tags: + - Application Metadata + summary: | + Retrieve the sample adaptive authentication templates. + description: "This API provides the capability to retrieve the sample adaptive authentication templates. \n\nScope(Permission) required: `internal_application_mgt_view`" + operationId: getAdaptiveAuthTemplates + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/AdaptiveAuthTemplates' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/applications/meta/adaptive-auth-templates' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + /applications/meta/groups: + get: + tags: + - Application Metadata + summary: | + Retrieve the list of groups available for the application. + description: > + This API provides the capability to retrieve the list of groups available for the application.

    + Scope(Permission) required: `internal_application_mgt_view` + parameters: + - $ref: '#/components/parameters/domainQueryParam' + - $ref: '#/components/parameters/groupsFilterQueryParam' + operationId: getGroups + responses: + '200': + description: OK + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/GroupBasicInfo' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '403': + description: Forbidden + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/applications/meta/groups' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + /applications/{applicationId}/share: + post: + deprecated: true + summary: | + Share the application from the root organization to the given organization(s). + description: | + **NOTE: This API is deprecated and may be removed in future versions. Use the `/applications/share` endpoint instead.
    + This API provides the capability to share an application with organizations. +
    + + Scope(Permission) required: `internal_shared_application_create` + operationId: shareOrgApplication + parameters: + - name: applicationId + in: path + description: ID of the application which will be shared to organizations. + required: true + schema: + type: string + example: c75e27f9-98c7-4518-a968-c6cd59f0ac6b + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ApplicationSharePOSTRequest' + required: true + responses: + '200': + description: Ok + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + tags: + - Application Sharing + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/applications/{application-id}/share' \ + -H 'Content-Type: application/json' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "shareWithAllChildren": false, + "sharedOrganizations": [ + "682edf68-4835-4bb8-961f-0a16bc6cc866", + "ghfbctgf-4318-46d4-8ee1-7t3s38e23098" + ] + }' + x-codegen-request-body-name: body + get: + summary: | + List of organizations that the application is shared to. + description: | + This API returns the list of organizations that the application is shared to. +

    + + Scope(Permission) required: `internal_shared_application_view` + operationId: shareOrgApplicationGet + parameters: + - name: applicationId + in: path + description: ID of the application which is shared to organizations. + required: true + schema: + type: string + - $ref: '#/components/parameters/before' + - $ref: '#/components/parameters/after' + - $ref: '#/components/parameters/filter' + - $ref: '#/components/parameters/sharedOrganizationsLimit' + - $ref: '#/components/parameters/recursiveQueryParam' + - $ref: '#/components/parameters/applicationShareExcludedQueryParam' + - $ref: '#/components/parameters/applicationShareAttributesQueryParam' + responses: + '200': + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/SharedOrganizationsResponse' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + tags: + - Application Sharing + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/applications/{application-id}/share' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + /applications/{applicationId}/shared-apps: + get: + summary: | + List of shared applications along with its organization. + description: | + This API returns the list of shared app ids along with the shared organization id. +

    + + Scope(Permission) required: `internal_shared_application_view` + operationId: sharedApplicationsGet + parameters: + - name: applicationId + in: path + description: ID of the application which is shared to organizations. + required: true + schema: + type: string + responses: + '200': + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/SharedApplicationsResponse' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + tags: + - Application Sharing + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/applications/{application-id}/shared-apps' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + delete: + deprecated: true + description: | + ** NOTE: This API is deprecated and may be removed in future versions. Use the `/applications/unshare-with-all` endpoint instead.
    + This API provides the capability to stop sharing an application to all organizations the application is shared to. +

    + + Scope(Permission) required: `internal_shared_application_delete` + summary: | + Stop sharing an application with all organizations. + operationId: sharedApplicationsAllDelete + parameters: + - name: applicationId + in: path + description: ID of the application. + required: true + schema: + type: string + responses: + '204': + description: Successfully deleted + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + tags: + - Application Sharing + x-codeSamples: + - lang: Curl + source: | + curl --location --request DELETE 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/applications/{application-id}/shared-apps' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + /applications/{applicationId}/share/{shared-organization-id}: + delete: + deprecated: true + description: | + **NOTE: This API is deprecated and may be removed in future versions. Use the `/applications/unshare` endpoint instead.
    + This API provides the capability to stop sharing an application to an organization by providing its ID. +

    + + Scope(Permission) required: `internal_shared_application_delete` + summary: | + Stop sharing an application to a organization. + operationId: shareOrgApplicationDelete + parameters: + - name: applicationId + in: path + description: ID of the application. + required: true + schema: + type: string + - name: shared-organization-id + in: path + description: ID of the organization to stop sharing. + required: true + schema: + type: string + responses: + '204': + description: Successfully deleted + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + tags: + - Application Sharing + x-codeSamples: + - lang: Curl + source: | + curl --location --request DELETE 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/applications/{application-id}/share/{shared-organization-id}' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + /applications/share: + post: + tags: [ Application Sharing ] + summary: Share a single application with specific organizations. + description: | + This API provides the capability to share an application with specific organizations. + It allows for detailed role sharing configurations per organization.
    + Scope(Permission) required: `internal_shared_application_create` + operationId: shareApplicationWithSelected + requestBody: + required: true + content: + application/json: + schema: + $ref: "#/components/schemas/ApplicationShareSelectedRequestBody" + example: + applicationId: "c75e27f9-98c7-4518-a968-c6cd59f0ac6b" + organizations: + - orgId: "13b92afa-e7ee-4b01-bee0-2afb503b4d15" + policy: "SELECTED_ORG_WITH_ALL_EXISTING_AND_FUTURE_CHILDREN" + roleSharing: + mode: "SELECTED" + roles: + - displayName: "App Viewer" + audience: + display: "Pickup App" + type: "application" + - displayName: "App Admin" + audience: + display: "Pickup App" + type: "application" + - orgId: "682edf68-4835-4bb8-961f-0a16bc6cc866" + policy: "SELECTED_ORG_ONLY" + roleSharing: + mode: "ALL" + responses: + "202": + description: Sharing process triggered successfully + content: + application/json: + schema: + $ref: "#/components/schemas/ProcessSuccessResponse" + example: + status: "Processing" + details: "Application sharing process triggered successfully." + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/applications/share' \ + -H 'Accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "applicationId": "c75e27f9-98c7-4518-a968-c6cd59f0ac6b", + "organizations": [ + { + "orgId": "13b92afa-e7ee-4b01-bee0-2afb503b4d15", + "policy": "SELECTED_ORG_WITH_ALL_EXISTING_AND_FUTURE_CHILDREN", + "roleSharing": { + "mode": "SELECTED", + "roles": [ + { + "displayName": "App Viewer", + "audience": { + "display": "Pickup App", + "type": "application" + } + }, + { + "displayName": "App Admin", + "audience": { + "display": "Pickup App", + "type": "application" + } + } + ] + } + }, + { + "orgId": "682edf68-4835-4bb8-961f-0a16bc6cc866", + "policy": "SELECTED_ORG_ONLY", + "roleSharing": { + "mode": "ALL" + } + } + ] + }' + patch: + tags: [ Application Sharing ] + summary: Perform incremental sharing operations on an already shared application. + description: | + This API allows for incremental updates to the sharing configuration of an application. + It supports adding or removing roles from organizations that the application is already shared with.
    + **NOTE:** Adding or removing roles is supported only if the role sharing mode is set to `SELECTED`.
    + Scope(Permission) required: `internal_shared_application_create` + operationId: patchApplicationSharing + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/ApplicationSharingPatchRequest' + examples: + addRolesToOrg: + summary: Add roles to an organization + value: + applicationId: "app-123" + Operations: + - op: "add" + path: "organizations[orgId eq 13b92afa-e7ee-4b01-bee0-2afb503b4d15].roles" + value: + - displayName: "App Viewer" + audience: + display: "My Org 1" + type: "organization" + - displayName: "App Admin" + audience: + display: "My Org 1" + type: "organization" + removeRolesFromOrg: + summary: Remove roles from an organization + value: + applicationId: "app-123" + Operations: + - op: "remove" + path: "organizations[orgId eq 13b92afa-e7ee-4b01-bee0-2afb503b4d15].roles" + value: + - displayName: "App Viewer" + audience: + display: "My Org 2" + type: "organization" + responses: + '202': + description: Operation processed successfully + content: + application/json: + schema: + $ref: '#/components/schemas/ProcessSuccessResponse' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location --request PATCH 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/applications/share' \ + -H 'Accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "applicationId": "c75e27f9-98c7-4518-a968-c6cd59f0ac6b", + "Operations": [ + { + "op": "add", + "path": "organizations[orgId eq 13b92afa-e7ee-4b01-bee0-2afb503b4d15].roles", + "value": [ + { + "displayName": "App Viewer", + "audience": { + "display": "Pickup App", + "type": "application" + } + } + ] + } + ] + }' + /applications/share-with-all: + post: + tags: [ Application Sharing ] + summary: Share a single application with all organizations. + description: | + This API provides the capability to share an application with all existing and/or future organizations. + It allows for role sharing configurations that apply to all organizations.
    + Scope(Permission) required: `internal_shared_application_create` + operationId: shareApplicationWithAll + requestBody: + required: true + content: + application/json: + schema: + $ref: "#/components/schemas/ApplicationShareAllRequestBody" + example: + applicationId: "c75e27f9-98c7-4518-a968-c6cd59f0ac6b" + policy: "ALL_EXISTING_AND_FUTURE_ORGS" + roleSharing: + mode: "ALL" + responses: + "202": + description: Sharing process triggered successfully + content: + application/json: + schema: + $ref: "#/components/schemas/ProcessSuccessResponse" + example: + status: "Processing" + details: "Application sharing process triggered successfully." + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/applications/share-with-all' \ + -H 'Accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "applicationId": "c75e27f9-98c7-4518-a968-c6cd59f0ac6b", + "policy": "ALL_EXISTING_AND_FUTURE_ORGS", + "roleSharing": { + "mode": "ALL" + } + }' + /applications/unshare: + post: + tags: [ Application Sharing ] + summary: Unshare an application from specific organizations. + description: | + This API provides the capability to unshare an application from specific organizations. + It allows for detailed role unsharing configurations per organization.
    + Scope(Permission) required: `internal_shared_application_delete` + operationId: unshareApplicationFromSelected + requestBody: + required: true + content: + application/json: + schema: + $ref: "#/components/schemas/ApplicationUnshareSelectedRequestBody" + example: + applicationId: "c75e27f9-98c7-4518-a968-c6cd59f0ac6b" + orgIds: + - "13b92afa-e7ee-4b01-bee0-2afb503b4d15" + - "682edf68-4835-4bb8-961f-0a16bc6cc866" + responses: + "202": + description: Unsharing process triggered successfully + content: + application/json: + schema: + $ref: "#/components/schemas/ProcessSuccessResponse" + example: + status: "Processing" + details: "Application unsharing process triggered successfully." + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/applications/unshare' \ + -H 'Accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "applicationId": "c75e27f9-98c7-4518-a968-c6cd59f0ac6b", + "orgIds": [ + "13b92afa-e7ee-4b01-bee0-2afb503b4d15", + "682edf68-4835-4bb8-961f-0a16bc6cc866" + ] + }' + /applications/unshare-with-all: + post: + tags: [ Application Sharing ] + summary: Unshare an application from all organizations. + description: | + This API provides the capability to unshare an application from all organizations. + It allows for role unsharing configurations that apply to all organizations.
    + Scope(Permission) required: `internal_shared_application_delete` + operationId: unshareApplicationFromAll + requestBody: + required: true + content: + application/json: + schema: + $ref: "#/components/schemas/ApplicationUnshareAllRequestBody" + example: + applicationId: "c75e27f9-98c7-4518-a968-c6cd59f0ac6b" + responses: + "202": + description: Unsharing process triggered successfully + content: + application/json: + schema: + $ref: "#/components/schemas/ProcessSuccessResponse" + example: + status: "Processing" + details: "Application unsharing process triggered successfully." + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/applications/unshare-with-all' \ + -H 'Accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "applicationId": "c75e27f9-98c7-4518-a968-c6cd59f0ac6b" + }' +components: + parameters: + limitQueryParam: + in: query + name: limit + required: false + description: | + Maximum number of records to return. + schema: + type: integer + minimum: 1 + default: 30 + limitWithoutDefaultQueryParam: + in: query + name: limit + required: false + description: | + Maximum number of records to return. + schema: + type: integer + offsetQueryParam: + in: query + name: offset + required: false + description: | + Number of records to skip for pagination. + schema: + type: integer + default: 0 + offsetWithoutDefaultQueryParam: + in: query + name: offset + required: false + description: | + Number of records to skip for pagination. + schema: + type: integer + filterQueryParam: + in: query + name: filter + required: false + description: | + Condition to filter the retrieval of records. + Supports 'sw', 'co', 'ew', and 'eq' operations with 'and', 'or' logical operators. + Note that 'and' and 'or' operators in filters follow the general precedence of logical operators. + For example, A and B or C and D = (A and B) or (C and D)). + Currently supports only filtering based on the 'name', the 'clientId', and the 'issuer' attributes. + + `/applications?filter=name+eq+user_portal` +
    + `/applications?filter=name+co+prod+or+clientId+co+123` + schema: + type: string + domainQueryParam: + in: query + name: domain + required: false + description: | + The domain name of the user store used to filter the groups. + + /applications/meta/groups?domain=PRIMARY + schema: + type: string + before: + name: before + in: query + required: false + description: | + Base64 encoded cursor value for backward pagination. + schema: + type: string + example: Ng== + after: + name: after + in: query + required: false + description: | + Base64 encoded cursor value for forward pagination. + schema: + type: string + example: Ng== + filter: + name: filter + in: query + required: false + description: | + Condition to filter the retrieval of records. Supports 'sw', 'co', 'ew' and 'eq' operations. + schema: + type: string + example: id+eq+088fb49c-46fa-48c1-a0a8-5538ee4b7ec5 + sharedOrganizationsLimit: + name: limit + in: query + required: false + description: | + Maximum number of records to return. If you do not specify this parameter, this will return all shared organizations. + schema: + type: integer + example: 10 + recursiveQueryParam: + in: query + name: recursive + required: false + description: | + Determines whether a recursive search should happen.
    + If set to true, will include shared organizations in all levels of the hierarchy; If set to false, includes only shared organizations in the next level of the hierarchy. + schema: + type: boolean + applicationShareExcludedQueryParam: + in: query + name: excludedAttributes + description: | + excludedAttribute parameter.
    + Supported values: `roles` + required: false + schema: + type: string + applicationShareAttributesQueryParam: + in: query + name: attributes + required: false + description: | + Specifies the required parameters in the response. + supported values: `sharingMode`.
    + /applications/{applicationId}/share?attributes=sharingMode + schema: + type: string + groupsFilterQueryParam: + in: query + name: filter + required: false + description: | + Condition to filter the retrieval of records. + Supports only the 'co' operation. + Currently supports only filtering based on the 'name'. + + /applications/meta/groups?filter=name+co+Employee + schema: + type: string + sortOrderQueryParam: + in: query + name: sortOrder + required: false + description: | + Define the order in which the retrieved records should be sorted. + _This parameter is not supported yet._ + schema: + type: string + enum: + - ASC + - DESC + sortByQueryParam: + in: query + name: sortBy + required: false + description: | + Attribute by which the retrieved records should be sorted. + _This parameter is not supported yet._ + schema: + type: string + attributesQueryParam: + in: query + name: attributes + required: false + description: | + Specifies the required parameters in the response. + Only `advancedConfigurations`, `templateId`, `templateVersion`, `clientId`, and `issuer` attributes are supported currently. + + `/applications?attributes=advancedConfigurations,templateId,templateVersion,clientId,issuer` + schema: + type: string + exportSecretsQueryParam: + in: query + name: exportSecrets + required: false + description: | + Specifies whether to export secrets when exporting an application. + schema: + type: boolean + default: false + inboundProtocolsCustomOnly: + in: query + name: customOnly + required: false + description: | + Send only the custom inbound protocols. + schema: + type: boolean + example: true + default: false + templateIdPathParam: + in: path + name: template-id + required: true + description: "Pre-defined template to use when creating the application. +

    The pre-defined template IDs are as follows: +
      +
    • SAML - `776a73da-fd8e-490b-84ff-93009f8ede85`
    • +
    • OIDC - `b9c5e11e-fc78-484b-9bec-015d247561b8`
    • +
    • Single Page App - `6a90e4b0-fbff-42d7-bfde-1efd98f07cd7`
    • +
    • Android Mobile - `44a2d9d9-bc0c-4b54-85df-1cf08f4002ec`
    • +
    " + schema: + type: string + example: "b9c5e11e-fc78-484b-9bec-015d247561b8" + securitySchemes: + OAuth2: + type: oauth2 + flows: + authorizationCode: + authorizationUrl: 'https://api.asgardeo.io/t/{organization-name}/oauth2/authorize' + tokenUrl: 'https://api.asgardeo.io/t/{organization-name}/oauth2/token' + scopes: {} + schemas: + Link: + type: object + properties: + href: + type: string + example: "applications?offset=10&limit=10" + description: This is the address that points to the location of the an application. + rel: + type: string + example: "next" + description: Describes the relationship between the current application and the application that is identified by the `href` property. + + ApplicationListResponse: + type: object + properties: + totalResults: + type: integer + description: Number of results that match the listing operation. + example: 1 + startIndex: + type: integer + description: Index of the first element of the page, which will be equal to offset + 1. + example: 1 + count: + type: integer + description: Number of elements in the returned page. + example: 10 + applications: + type: array + items: + $ref: '#/components/schemas/ApplicationListItem' + links: + type: array + items: + $ref: '#/components/schemas/Link' + + ApplicationListItem: + type: object + properties: + id: + type: string + example: "85e3f4b8-0d22-4181-b1e3-1651f71b88bd" + description: The ID of your application. + name: + type: string + example: "user-portal" + description: The name of the application. + description: + type: string + example: Application representing user portal + description: The detailed description about the application. + image: + type: string + example: 'https://example.com/logo/my-logo.png' + description: The URL to the logo of your application. + accessUrl: + type: string + example: 'https://example.com/app/login' + description: The URL through which the users can access the application. + clientId: + type: string + example: 'SmrrDNXRYf1lMmDlnleeHTuXx_Ea' + description: The public identifier of the application. + issuer: + type: string + example: 'http://idp.example.com/metadata.php' + description: The Issuer is a unique identifier for the entity that is generating a SAML assertion. + access: + type: string + enum: + - READ + - WRITE + default: READ + description: The level of authorization that is granted to the user for accessing a particular application. + self: + type: string + example: "/t//api/server/v1/applications/85e3f4b8-0d22-4181-b1e3-1651f71b88bd" + description: The URL of the current application. + advancedConfigurations: + $ref: '#/components/schemas/AdvancedApplicationConfiguration' + templateId: + description: "Pre-defined template to use when creating the application. +

    The pre-defined template IDs are as follows: +
      +
    • SAML - `776a73da-fd8e-490b-84ff-93009f8ede85`
    • +
    • OIDC - `b9c5e11e-fc78-484b-9bec-015d247561b8`
    • +
    • Single Page App - `6a90e4b0-fbff-42d7-bfde-1efd98f07cd7`
    • +
    • Android Mobile - `44a2d9d9-bc0c-4b54-85df-1cf08f4002ec`
    • +
    " + type: string + example: "b9c5e11e-fc78-484b-9bec-015d247561b8" + templateVersion: + description: "Version of the template which is used to configure the current application." + type: string + example: "v1.0.0" + + ApplicationModelOIDC: + type: object + title: Add OIDC application + required: + - name + properties: + id: + type: string + example: "394b8adcce24c64a8a09a0d80abf8c337bd253de" + readOnly: true + description: The ID of your application. + name: + type: string + example: pickup-dispatch + description: The name of the application. + description: + type: string + example: This is the configuration for Pickup-dispatch application. + description: The description for your application. + imageUrl: + type: string + example: 'https://example.com/logo/my-logo.png' + description: The URL to the logo of your application. + accessUrl: + type: string + example: 'https://example.com/login' + description: The URL through which the users can access the application. + templateId: + description: "Pre-defined template to use when creating the application. +

    The pre-defined template IDs are as follows: +
      +
    • SAML - `776a73da-fd8e-490b-84ff-93009f8ede85`
    • +
    • OIDC - `b9c5e11e-fc78-484b-9bec-015d247561b8`
    • +
    • Single Page App - `6a90e4b0-fbff-42d7-bfde-1efd98f07cd7`
    • +
    • Android Mobile - `44a2d9d9-bc0c-4b54-85df-1cf08f4002ec`
    • +
    " + type: string + example: "b9c5e11e-fc78-484b-9bec-015d247561b8" + templateVersion: + description: "Version of the template which is used to configure the current application." + type: string + example: "v1.0.0" + isManagementApp: + default: false + type: boolean + example: false + description: Decides whether the application is used to access System APIs. + claimConfiguration: + $ref: '#/components/schemas/ClaimConfiguration' + inboundProtocolConfiguration: + type: object + properties: + oidc: + type: object + required: + - grantTypes + properties: + clientId: + type: string + example: "rMfbPgCi5oWljNhv8c4Pugfuo8Aa" + description: The public identifier of the application that you create. + clientSecret: + type: string + example: "MkHGGiTdAPfTyUKfXLdyOwelMywt" + description: The secret corresponding to the `clientId` of the application. This is confidential and will be used to make requests and authenticate into your application. + state: + type: string + enum: + - ACTIVE + - REVOKED + readOnly: true + default: ACTIVE + description: This value describes the state of the access token obtained for the application. + grantTypes: + type: array + example: + - authorization_code + - password + items: + type: string + description: "The This will determine how the application communicates with the token service. Asgardeo supports following grant types: +
      +
    • authorization_code
    • +
    • client_credentials
    • +
    • refresh_token
    • +
    • implicit
    • +
    • password
    • +
    " + minItems: 1 + callbackURLs: + type: array + description: This is the callback location where the tokens should be sent. + example: + - 'regexp=(https://app.example.com/callback1|https://app.example.com/callback2)' + items: + type: string + allowedOrigins: + type: array + description: Authorized JavaScript origins. CORS requests are allowed for these origins. + example: + - 'https://app.example.com' + items: + type: string + publicClient: + type: boolean + default: false + description: >- + Enabling this option will allow the client to authenticate without a + client secret. + example: false + pkce: + $ref: '#/components/schemas/OAuth2PKCEConfiguration' + accessToken: + $ref: '#/components/schemas/AccessTokenConfiguration' + refreshToken: + $ref: '#/components/schemas/RefreshTokenConfiguration' + idToken: + $ref: '#/components/schemas/IdTokenConfiguration' + logout: + $ref: '#/components/schemas/OIDCLogoutConfiguration' + validateRequestObjectSignature: + type: boolean + default: false + example: false + description: Specifies whether to validate the signature of the request object in an OpenID Connect authentication request. + scopeValidators: + type: array + example: + - Role based scope validator + items: + type: string + authenticationSequence: + $ref: '#/components/schemas/AuthenticationSequence' + advancedConfigurations: + $ref: '#/components/schemas/AdvancedApplicationConfiguration' + # provisioningConfigurations: + # $ref: '#/components/schemas/ProvisioningConfiguration' + + ApplicationModelSAML: + type: object + title: Add SAML application + required: + - name + properties: + id: + type: string + example: "394b8adcce24c64a8a09a0d80abf8c337bd253de" + readOnly: true + description: The ID of the application. + name: + type: string + example: pickup-dispatch + description: The name of the application. + description: + type: string + example: This is the configuration for Pickup-dispatch application. + description: The detailed description for your application. + imageUrl: + type: string + example: 'https://example.com/logo/my-logo.png' + description: The URL to the logo of your application. + accessUrl: + type: string + example: 'https://example.com/login' + description: The URL through which the users can access the application. + templateId: + description: "Pre-defined template to use when creating the application. +

    The pre-defined template IDs are as follows: +
      +
    • SAML - `776a73da-fd8e-490b-84ff-93009f8ede85`
    • +
    • OIDC - `b9c5e11e-fc78-484b-9bec-015d247561b8`
    • +
    • Single Page App - `6a90e4b0-fbff-42d7-bfde-1efd98f07cd7`
    • +
    • Android Mobile - `44a2d9d9-bc0c-4b54-85df-1cf08f4002ec`
    • +
    " + type: string + example: "b9c5e11e-fc78-484b-9bec-015d247561b8" + templateVersion: + description: "Version of the template which is used to configure the current application." + type: string + example: "v1.0.0" + isManagementApp: + default: false + type: boolean + example: false + description: Decides whether the application is used to access System APIs. + claimConfiguration: + $ref: '#/components/schemas/ClaimConfiguration' + inboundProtocolConfiguration: + type: object + properties: + saml: + type: object + properties: + metadataFile: + type: string + example: 'Base64 encoded metadata file content' + description: Base64 encoded XML document that provides information about a SAML entity, + metadataURL: + type: string + example: 'https://example.com/samlsso/meta' + description: This URL provides access to a SAML metadata file. + manualConfiguration: + $ref: '#/components/schemas/SAML2ServiceProvider' + encryption: + $ref: '#/components/schemas/AssertionEncryptionConfiguration' + authenticationSequence: + $ref: '#/components/schemas/AuthenticationSequence' + advancedConfigurations: + $ref: '#/components/schemas/AdvancedApplicationConfiguration' + # provisioningConfigurations: + # $ref: '#/components/schemas/ProvisioningConfiguration' + + ApplicationModelPassiveSTS: + type: object + title: Add PassiveSTS application + required: + - name + properties: + id: + type: string + example: "394b8adcce24c64a8a09a0d80abf8c337bd253de" + readOnly: true + description: The ID of your application. + name: + type: string + example: pickup-dispatch + description: The name of the application. + description: + type: string + example: This is the configuration for Pickup-dispatch application. + description: The detailed description for your application. + imageUrl: + type: string + example: 'https://example.com/logo/my-logo.png' + description: The URL to the logo of your application. + accessUrl: + type: string + example: 'https://example.com/login' + description: The URL through which the users can access the application. + templateId: + description: "Pre-defined template to use when creating the application. +

    The pre-defined template IDs are as follows: +
      +
    • SAML - `776a73da-fd8e-490b-84ff-93009f8ede85`
    • +
    • OIDC - `b9c5e11e-fc78-484b-9bec-015d247561b8`
    • +
    • Single Page App - `6a90e4b0-fbff-42d7-bfde-1efd98f07cd7`
    • +
    • Android Mobile - `44a2d9d9-bc0c-4b54-85df-1cf08f4002ec`
    • +
    " + type: string + example: "b9c5e11e-fc78-484b-9bec-015d247561b8" + templateVersion: + description: "Version of the template which is used to configure the current application." + type: string + example: "v1.0.0" + isManagementApp: + default: false + type: boolean + example: false + description: Decides whether the application is used to access System APIs. + claimConfiguration: + $ref: '#/components/schemas/ClaimConfiguration' + inboundProtocolConfiguration: + type: object + properties: + passivests: + type: object + required: + - realm + - replyTo + properties: + realm: + type: string + replyTo: + type: string + encryption: + $ref: '#/components/schemas/AssertionEncryptionConfiguration' + authenticationSequence: + $ref: '#/components/schemas/AuthenticationSequence' + advancedConfigurations: + $ref: '#/components/schemas/AdvancedApplicationConfiguration' + # provisioningConfigurations: + # $ref: '#/components/schemas/ProvisioningConfiguration' + ApplicationModelCustom: + type: object + title: Add custom inbound protocol application + required: + - name + properties: + id: + type: string + example: "394b8adcce24c64a8a09a0d80abf8c337bd253de" + readOnly: true + description: The ID of your application. + name: + type: string + example: pickup-dispatch + description: The name of the application. + description: + type: string + example: This is the configuration for Pickup-dispatch application. + imageUrl: + type: string + example: 'https://example.com/logo/my-logo.png' + description: The URL to the logo of your application. + accessUrl: + type: string + example: 'https://example.com/login' + description: The URL through which the users can access the application. + templateId: + description: "Pre-defined template to use when creating the application. +

    The pre-defined template IDs are as follows: +
      +
    • SAML - `776a73da-fd8e-490b-84ff-93009f8ede85`
    • +
    • OIDC - `b9c5e11e-fc78-484b-9bec-015d247561b8`
    • +
    • Single Page App - `6a90e4b0-fbff-42d7-bfde-1efd98f07cd7`
    • +
    • Android Mobile - `44a2d9d9-bc0c-4b54-85df-1cf08f4002ec`
    • +
    " + type: string + example: "b9c5e11e-fc78-484b-9bec-015d247561b8" + templateVersion: + description: "Version of the template which is used to configure the current application." + type: string + example: "v1.0.0" + isManagementApp: + default: false + type: boolean + example: false + description: Decides whether the application is used to access System APIs. + claimConfiguration: + $ref: '#/components/schemas/ClaimConfiguration' + inboundProtocolConfiguration: + type: object + properties: + custom: + type: object + required: + - name + - configName + properties: + name: + type: string + example: cas + configName: + type: string + example: cas + properties: + type: array + items: + $ref: '#/components/schemas/PropertyModel' + encryption: + $ref: '#/components/schemas/AssertionEncryptionConfiguration' + authenticationSequence: + $ref: '#/components/schemas/AuthenticationSequence' + advancedConfigurations: + $ref: '#/components/schemas/AdvancedApplicationConfiguration' + # provisioningConfigurations: + # $ref: '#/components/schemas/ProvisioningConfiguration' + + ApplicationResponseModel: + type: object + required: + - name + properties: + id: + type: string + example: "394b8adcce24c64a8a09a0d80abf8c337bd253de" + readOnly: true + description: The ID of the application. + name: + type: string + example: pickup-dispatch + description: The name of the application. + description: + type: string + example: This is the configuration for Pickup-dispatch application. + description: The detailed description for your application. + imageUrl: + type: string + example: 'https://example.com/logo/my-logo.png' + description: The URL to the logo of your application. + accessUrl: + type: string + example: 'https://example.com/login' + description: The URL through which the users can access the application. + clientId: + type: string + example: 'SmrrDNXRYf1lMmDlnleeHTuXx_Ea' + description: The public identifier of the application. + issuer: + type: string + example: 'http://idp.example.com/metadata.php' + description: The Issuer is a unique identifier for the entity that is generating a SAML assertion. + templateId: + description: "Pre-defined template to use when creating the application. +

    The pre-defined template IDs are as follows: +
      +
    • SAML - `776a73da-fd8e-490b-84ff-93009f8ede85`
    • +
    • OIDC - `b9c5e11e-fc78-484b-9bec-015d247561b8`
    • +
    • Single Page App - `6a90e4b0-fbff-42d7-bfde-1efd98f07cd7`
    • +
    • Android Mobile - `44a2d9d9-bc0c-4b54-85df-1cf08f4002ec`
    • +
    " + type: string + example: "adwefi2429asdfdf94444rraf44" + templateVersion: + description: "Version of the template which is used to configure the current application." + type: string + example: "v1.0.0" + isManagementApp: + type: boolean + example: false + description: Decides whether the application is used to access System APIs. + claimConfiguration: + $ref: '#/components/schemas/ClaimConfiguration' + inboundProtocols: + $ref: '#/components/schemas/InboundProtocolsListResponse' + authenticationSequence: + $ref: '#/components/schemas/AuthenticationSequence' + advancedConfigurations: + $ref: '#/components/schemas/AdvancedApplicationConfiguration' + # provisioningConfigurations: + # $ref: '#/components/schemas/ProvisioningConfiguration' + access: + type: string + enum: + - READ + - WRITE + default: READ + description: The level of authorization that is granted to the user for accessing a particular application. + + ApplicationPatchModel: + type: object + properties: + name: + type: string + example: pickup + description: The name of the application. + description: + type: string + example: This is the configuration for Pickup-dispatch application. + description: The detailed description for your application. + imageUrl: + type: string + example: 'https://example.com/logo/my-logo.png' + description: The URL to the logo of your application. + accessUrl: + type: string + example: 'https://example.com/login' + description: The URL through which the users can access the application. + templateId: + description: "Pre-defined template to use when creating the application. +

    The pre-defined template IDs are as follows: +
      +
    • SAML - `776a73da-fd8e-490b-84ff-93009f8ede85`
    • +
    • OIDC - `b9c5e11e-fc78-484b-9bec-015d247561b8`
    • +
    • Single Page App - `6a90e4b0-fbff-42d7-bfde-1efd98f07cd7`
    • +
    • Android Mobile - `44a2d9d9-bc0c-4b54-85df-1cf08f4002ec`
    • +
    " + type: string + example: "adwefi2429asdfdf94444rraf44" + templateVersion: + description: "Version of the template which is used to configure the current application." + type: string + example: "v1.0.0" + claimConfiguration: + $ref: '#/components/schemas/ClaimConfiguration' + authenticationSequence: + $ref: '#/components/schemas/AuthenticationSequence' + advancedConfigurations: + $ref: '#/components/schemas/AdvancedApplicationConfiguration' + # provisioningConfigurations: + # $ref: '#/components/schemas/ProvisioningConfiguration' + + ResidentApplication: + type: object + properties: + provisioningConfigurations: + $ref: '#/components/schemas/ProvisioningConfiguration' + + ProvisioningConfiguration: + type: object + properties: + inboundProvisioning: + $ref: '#/components/schemas/InboundSCIMProvisioningConfiguration' + outboundProvisioningIdps: + type: array + items: + $ref: '#/components/schemas/OutboundProvisioningConfiguration' + InboundSCIMProvisioningConfiguration: + type: object + properties: + proxyMode: + type: boolean + example: false + provisioningUserstoreDomain: + type: string + example: PRIMARY + description: >- + This property becomes applicable only if the proxy-mode config is + set to false + OutboundProvisioningConfiguration: + type: object + properties: + idp: + type: string + example: Google + connector: + type: string + example: googleapps + blocking: + type: boolean + example: false + rules: + type: boolean + example: false + jit: + type: boolean + example: false + description: Specifies whether JIT provisioning is enabled for the IdP. + ScriptUpdateModel: + type: object + required: + - script + properties: + script: + type: string + example: "var onLoginRequest = function(context) {\n executeStep(1);\n};\n" + description: Authentication Script to be updated. + ConfiguredAuthenticatorsModal: + type: object + properties: + stepId: + type: integer + example: 1 + description: This is the authentication step number. For example `1` is the first authentication step. + localAuthenticators: + type: array + items: + $ref: '#/components/schemas/ConfiguredAuthenticator' + federatedAuthenticators: + type: array + items: + $ref: '#/components/schemas/ConfiguredAuthenticator' + ConfiguredAuthenticator: + type: object + properties: + name: + type: string + example: sampleIdP + description: The name of the authenticator. + type: + type: string + example: SampleAuthenticator + description: The type of authenticator. This can be obtained from the lsit of configured authenticators. + AdvancedApplicationConfiguration: + type: object + properties: + saas: + type: boolean + example: false + description: Decides whether the application is accessible across tenants. + discoverableByEndUsers: + type: boolean + example: false + description: Decides whether the application is visible for end users. + discoverableGroups: + type: array + items: + $ref: '#/components/schemas/DiscoverableGroup' + description: List of groups from user stores where users in those groups can discover the application. + certificate: + $ref: '#/components/schemas/Certificate' + skipLoginConsent: + type: boolean + example: false + description: Decides whether user consent needs to be skipped during login flows. + skipLogoutConsent: + type: boolean + example: false + description: Decides whether user consent needs to be skipped during logout flows. + useExternalConsentPage: + type: boolean + example: false + description: Decides whether user needs to use external consent page. + returnAuthenticatedIdpList: + type: boolean + example: false + description: Decides whether the list of authenticated identity providers needs to be returned in the authentication response. + enableAuthorization: + type: boolean + description: Decides whether authorization policies need to be engaged during authentication flows. + example: true + AdditionalProperties: + type: array + description: Denotes additional properties of the application. It is only supported by `getApplication` and `getAllApplications` requests. + items: + $ref: "#/components/schemas/AdditionalSpProperty" + AdditionalSpProperty: + type: object + required: + - name + - value + properties: + name: + type: string + example: "isInternalApp" + value: + type: string + example: "true" + displayName: + type: string + example: "Internal Application" + Certificate: + type: object + properties: + type: + type: string + description: >- + Certificate type. This should be either JWKS or PEM. + value: + type: string + description: >- + Certificate value. If the type is `JWKS`, the value should be `jwks` URL. If the + type is `PEM`, the value should be the certificate in `PEM` format. + InboundProtocols: + type: object + properties: + oidc: + $ref: '#/components/schemas/OpenIDConnectConfiguration' + # saml: + # $ref: '#/components/schemas/SAML2Configuration' + # passiveSts: + # $ref: '#/components/schemas/PassiveStsConfiguration' + # wsTrust: + # $ref: '#/components/schemas/WSTrustConfiguration' + # custom: + # type: array + # items: + # $ref: '#/components/schemas/CustomInboundProtocolConfiguration' + + InboundProtocolsListResponse: + type: array + items: + $ref: '#/components/schemas/InboundProtocolListItem' + InboundProtocolListItem: + type: object + required: + - type + - name + - self + properties: + type: + type: string + example: "samlsso" + description: The type of the inbound authentication protocol. + name: + type: string + example: "SAML2 Inbound" + description: The name of the inbound authentication protocol. + self: + type: string + example: "/t//api/server/v1/applications/29048810-1447-4ea0-a348-30d15ab65fa3/inbound-protocols/saml" + description: The URL of the current application. + ClaimConfiguration: + type: object + properties: + dialect: + type: string + enum: + - CUSTOM + - LOCAL + default: LOCAL + claimMappings: + type: array + items: + $ref: '#/components/schemas/ClaimMappings' + requestedClaims: + type: array + items: + $ref: '#/components/schemas/RequestedClaimConfiguration' + subject: + $ref: '#/components/schemas/SubjectConfig' + role: + $ref: '#/components/schemas/RoleConfig' + SubjectConfig: + type: object + properties: + claim: + $ref: '#/components/schemas/Claim' + includeUserDomain: + type: boolean + example: false + description: Specifies whether to append user's domain in subject attrbute. + includeTenantDomain: + type: boolean + example: false + description: Specifies whether to append organization name in subject attrbute. + useMappedLocalSubject: + type: boolean + example: false + description: Specifies whether to use the local subject identifier when asserting the identity. + mappedLocalSubjectMandatory: + type: boolean + example: false + description: Specifies whether to mandate using the local subject identifier when asserting the identity. + RoleConfig: + type: object + properties: + mappings: + type: array + items: + $ref: '#/components/schemas/RoleMapping' + includeUserDomain: + type: boolean + example: true + description: Specifies whether to append user's domain to user roles. + claim: + $ref: '#/components/schemas/Claim' + RoleMapping: + type: object + required: + - localRole + - applicationRole + properties: + localRole: + type: string + example: admin + description: The claim URI for local role. + applicationRole: + type: string + example: Administrator + description: The claim URI for application role. + RequestedClaimConfiguration: + type: object + required: + - claim + description: >- + User claims that need to be sent back to the application. If the + claim mappings are local, use local claim URIs. If the custom claim + mappings are configured, use the mapped application claim URI + properties: + claim: + $ref: '#/components/schemas/Claim' + mandatory: + type: boolean + example: false + description: When a user logs in to this service provider, if the identity provider does not provide a value for any of the mandatory claims, the user will be prompted to provide them at the time of login. + ClaimMappings: + type: object + required: + - applicationClaim + - localClaim + properties: + applicationClaim: + type: string + description: Claim URI received by the application + example: firstname + localClaim: + $ref: '#/components/schemas/Claim' + Claim: + type: object + required: + - uri + properties: + id: + type: string + example: aHR0cDovL3dzbzIub3JnL2NsYWltcy91c2VybmFtZQ + readOnly: true + description: The claim ID. + uri: + type: string + example: 'http://wso2.org/claims/username' + description: The unique URI specific to the claim. + displayName: + type: string + example: Username + readOnly: true + description: the display name of the claim. + + SAML2Configuration: + type: object + properties: + # metadataFile: + # type: string + # example: 'Base64 encoded metadata file content' + # metadataURL: + # type: string + # example: 'https://example.com/samlsso/meta' + manualConfiguration: + $ref: '#/components/schemas/SAML2ServiceProvider' + + SingleSignOnProfile: + type: object + properties: + bindings: + type: array + items: + type: string + example: + - HTTP_POST + - HTTP_REDIRECT + description: Specifies the mechanisms to transport SAML messages in communication protocols. + enableSignatureValidationForArtifactBinding: + type: boolean + description: Enables Signature validation for SAML artifact binding. Applicable only if SAML artifact binding is enabled through the bindings option. + default: false + + attributeConsumingServiceIndex: + type: string + readOnly: true + + enableIdpInitiatedSingleSignOn: + type: boolean + default: false + description: Specifies whether to initiate Single Sign-On (SSO) from the IdP instead of the application. + + assertion: + $ref: '#/components/schemas/SAMLAssertionConfiguration' + + SAMLAttributeProfile: + type: object + properties: + enabled: + type: boolean + default: false + description: Specifies whether to include the user's attributes in the SAML assertions as part of the attribute statement. + alwaysIncludeAttributesInResponse: + type: boolean + default: false + description: Specifies whether or not to include user attributes in the SAML response. + nameFormat: + type: string + default: urn:oasis:names:tc:SAML:2.0:attrname-format:basic + enum: + - urn:oasis:names:tc:SAML:2.0:attrname-format:basic + - urn:oasis:names:tc:SAML:2.0:attrname-format:uri + description: Specifies the type of attribute names used in the attribute statement of SAML assertions. + + SingleLogoutProfile: + type: object + properties: + enabled: + type: boolean + default: true + description: Specifies whether you want to enable single-logout to your application. + logoutRequestUrl: + type: string + description: Single logout request accepting endpoint + example: https://localhost.com + logoutResponseUrl: + type: string + description: Single logout response accepting endpoint + example: https://localhost.com + logoutMethod: + type: string + enum: + - BACKCHANNEL + - FRONTCHANNEL_HTTP_REDIRECT + - FRONTCHANNEL_HTTP_POST + description: "Specifies the logout method that is supported by the application. \n Asgardeo supports below logout methods: +
      +
    • Back Channel logout
    • +
    • Front Channel HTTP Redirect
    • +
    • Front Channel HTTP Post
    • +
    " + idpInitiatedSingleLogout: + $ref: '#/components/schemas/IdpInitiatedSingleLogout' + + IdpInitiatedSingleLogout: + type: object + properties: + enabled: + type: boolean + default: false + description: Specifies whether to support IdP initiated logout. + returnToUrls: + type: array + items: + type: string + example: + - 'https://localhost.com' + description: Specifies the URLs to which the user should be redirected after the logout. + + SAMLAssertionConfiguration: + type: object + properties: + nameIdFormat: + type: string + default: 'urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified' + example: 'urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress' + description: Specifies the name identifier format that is used to exchange information regarding the user in the SAML assertion. + + audiences: + type: array + description: Additional audience values to be added to the SAML Assertions. + example: + - 'https://app.example.com/saml' + items: + type: string + + recipients: + type: array + description: Additional recipient values to be added to the SAML Assertions. + example: + - 'https://app.example.com/saml' + items: + type: string + + digestAlgorithm: + type: string + default: "http://www.w3.org/2000/09/xmldsig#sha1" + example: "http://www.w3.org/2000/09/xmldsig#sha1" + description: The digest algorithm used in authentication response and logout response. + encryption: + $ref: '#/components/schemas/AssertionEncryptionConfiguration' + + AssertionEncryptionConfiguration: + type: object + properties: + enabled: + type: boolean + default: false + description: Specifies whether to enable encryption for SAML assertion. + assertionEncryptionAlgorithm: + type: string + default: "http://www.w3.org/2001/04/xmlenc#aes256-cbc" + description: The Assertion encryption algorithm you select specifies the symmetric encryption algorithm that is used for encrypting the SAML Assertion. + keyEncryptionAlgorithm: + type: string + default: "http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p" + description: The key encryption algorithm you select specifies the asymmetric encryption algorithm that is used for encrypting the SAML2 key. + + SAMLRequestValidation: + type: object + properties: + enableSignatureValidation: + type: boolean + default: true + description: Specifies whether Asgardeo must validate the signature of the SAML authentication request and the SAML logout request that are sent by the application. + signatureValidationCertAlias: + type: string + description: Specifies the alias of the certificate that will be used to validate the signature of the SAML assertions. + + SAMLResponseSigning: + type: object + properties: + enabled: + type: boolean + default: true + description: Specifies if response signing is enabled for the application. + signingAlgorithm: + type: string + example: http://www.w3.org/2001/04/xmldsig-more#rsa-ripemd160 + description: The signing algorithm to sign the authentication response and logout response. + SAML2ServiceProvider: + type: object + required: + - issuer + - assertionConsumerUrls + + properties: + issuer: + type: string + example: travelocity_460 + description: The issuer is a unique identifier for the entity that is generating a SAML assertion. + serviceProviderQualifier: + type: string + example: "serviceProviderQualifierValue" + description: This is the unique identifier of an application entity. You can configure a number of SAML applications with the same issuer and different service provider qualifiers. + assertionConsumerUrls: + type: array + items: + type: string + example: + - 'http://localhost:8080/travelocity_460.com/home.jsp' + - 'http://localhost:8080/travelocity_460.com/home1.jsp' + minItems: 1 + description: The Assertion Consumer Service (ACS) URL determines where Asgardeo will send the SAML response. + defaultAssertionConsumerUrl: + type: string + description: If not provided, the first assertion consumer URL on the `assertionConsumerUrls` will be picked as the default assertion consumer URL. + example: http://localhost:8080/travelocity_460.com/home1.jsp + idpEntityIdAlias: + type: string + description: Default value is the IdP's entity ID value specified in the resident IdP. + example: https://localhost.com + singleSignOnProfile: + $ref: '#/components/schemas/SingleSignOnProfile' + + attributeProfile: + $ref: '#/components/schemas/SAMLAttributeProfile' + + singleLogoutProfile: + $ref: '#/components/schemas/SingleLogoutProfile' + + requestValidation: + $ref: '#/components/schemas/SAMLRequestValidation' + + responseSigning: + $ref: '#/components/schemas/SAMLResponseSigning' + + enableAssertionQueryProfile: + type: boolean + default: false + description: Specifies whether to enable assertion query profile or not. + + OpenIDConnectConfiguration: + type: object + required: + - grantTypes + properties: + clientId: + type: string + example: "rMfbPgCi5oWljNhv8c4Pugfuo8Aa" + description: The public identifier of the application. + clientSecret: + type: string + example: "MkHGGiTdAPfTyUKfXLdyOwelMywt" + description: The secret corresponding to the `clientId` of the application. This is confidential and will be used to make requests and authenticate into your application. + state: + type: string + enum: + - ACTIVE + - REVOKED + readOnly: true + default: ACTIVE + description: This value describes the state of the access token obtained for the application. + grantTypes: + type: array + example: + - authorization_code + - password + items: + type: string + minItems: 1 + description: "The This will determine how the application communicates with the token service. Asgardeo supports following grant types: +
      +
    • authorization_code
    • +
    • client_credentials
    • +
    • refresh_token
    • +
    • implicit
    • +
    • password
    • +
    " + callbackURLs: + type: array + example: + - 'regexp=(https://app.example.com/callback1|https://app.example.com/callback2)' + items: + type: string + description: This is the callback location where the tokens should be sent. + allowedOrigins: + type: array + description: Authorized JavaScript origins. CORS requests are allowed for these origins. + example: + - 'https://app.example.com' + items: + type: string + publicClient: + type: boolean + default: false + description: >- + Enabling this option will allow the client to authenticate without a + client secret. + example: false + pkce: + $ref: '#/components/schemas/OAuth2PKCEConfiguration' + accessToken: + $ref: '#/components/schemas/AccessTokenConfiguration' + refreshToken: + $ref: '#/components/schemas/RefreshTokenConfiguration' + idToken: + $ref: '#/components/schemas/IdTokenConfiguration' + logout: + $ref: '#/components/schemas/OIDCLogoutConfiguration' + validateRequestObjectSignature: + type: boolean + default: false + example: false + scopeValidators: + type: array + example: + - Role based scope validator + items: + type: string + OAuth2PKCEConfiguration: + type: object + properties: + mandatory: + type: boolean + example: false + description: Specifies whether `pkce` is mandatory for the application. It is recommended to use pkce for public applications. + supportPlainTransformAlgorithm: + type: boolean + example: true + description: Specifies whether to support the use of plain (unencrypted) algorithms for transforming subject identities between different identity domains. + AccessTokenConfiguration: + type: object + properties: + type: + type: string + example: JWT + description: The access token type used by the application. + userAccessTokenExpiryInSeconds: + type: integer + format: int64 + example: 3600 + description: The expiry time of the access token obtained by the user in seconds. + applicationAccessTokenExpiryInSeconds: + type: integer + format: int64 + example: 3600 + description: The expiry time of the access token obtained by the application in seconds. + bindingType: + type: string + description: OAuth2 access token and refresh token can be bound to an external attribute during the token generation so that it can be optionally validated during API invocation. + default: "None" + example: cookie + revokeTokensWhenIDPSessionTerminated: + type: boolean + description: If enabled, when the IDP session is terminated, all the access tokens bound to the session will get revoked. + validateTokenBinding: + type: boolean + description: If enabled, both the access token and the token binding need to be present for a successful API invocation. + enableJwtScopeAsArray: + type: boolean + description: If enabled, the scope claim in JWT access tokens will be formatted as a JSON array instead of a space-separated string. + example: false + RefreshTokenConfiguration: + type: object + properties: + expiryInSeconds: + type: integer + format: int64 + example: 86400 + description: The expiry time of the refresh token in seconds. + renewRefreshToken: + description: Decides whether the refresh token needs to be renewed during refresh grant flow. + type: boolean + example: true + IdTokenConfiguration: + type: object + properties: + expiryInSeconds: + type: integer + format: int64 + example: 3600 + description: Time in seconds until the ID Token expires + audience: + type: array + example: + - 'http://idp.xyz.com' + - 'http://idp.abc.com' + items: + type: string + encryption: + $ref: '#/components/schemas/IdTokenEncryptionConfiguration' + IdTokenEncryptionConfiguration: + type: object + properties: + enabled: + type: boolean + default: false + example: false + description: Specifies if `id_token` encryption is enabled. + algorithm: + type: string + example: RSA-OAEP + description: Specifies the `id_token` encryption algorithm. + method: + type: string + example: A128CBC+HS256 + description: Specifies the `id_token` encryption method. + OIDCLogoutConfiguration: + type: object + properties: + backChannelLogoutUrl: + type: string + example: 'https://app.example.com/backchannel/callback' + description: The URL used for sending logout requests from the IdP to the application in a back-channel manner, without involving the user's browser. + frontChannelLogoutUrl: + type: string + example: 'https://app.example.com/frontchannel/callback' + description: The URL endpoint that the identity provider sends the logout request to when the user logs out of the application. + PassiveStsConfiguration: + type: object + required: + - realm + - replyTo + properties: + realm: + type: string + description: The unique identifier that specifies the security realm where the user wants to authenticate. + replyTo: + type: string + description: The address that the response should be sent to after a successful authentication. + WSTrustConfiguration: + type: object + required: + - audience + - certificateAlias + properties: + audience: + type: string + description: Audience value of the trusted service + example: https://wstrust.endpoint.com + certificateAlias: + type: string + example: "Asgardeo" + CustomInboundProtocolConfiguration: + type: object + required: + - name + - configName + properties: + name: + type: string + example: cas + configName: + type: string + example: cas + properties: + type: array + items: + $ref: '#/components/schemas/PropertyModel' + PropertyModel: + type: object + properties: + key: + type: string + example: app-identifier + value: + type: string + example: 'http://app.wso2.com/employeeApp' + friendlyName: + type: string + example: Application Identifier + AuthenticationSequence: + type: object + properties: + type: + type: string + description: " +
      +
    • DEFAULT type indicates that the application will use the default authentication sequence specified at the organization level. When the DEFAULT type is used, the information given in the other fields of the `AuthenticationSequence` will be ignored and overriden with values defined at the organization level.
    • +
    • USER_DEFINED type indicates that the application will use a user-defined authentication sequence.
    • +
    " + enum: + - DEFAULT + - USER_DEFINED + default: DEFAULT + steps: + type: array + items: + $ref: '#/components/schemas/AuthenticationStepModel' + script: + type: string + description: Specifies the conditional authentication script. + subjectStepId: + type: integer + default: 1 + example: 1 + description: Specifies the authentication step used as the user identifier. + attributeStepId: + type: integer + default: 1 + example: 1 + description: Specifies the authentication step used to pick attributes for the application. + + AuthenticationStepModel: + type: object + required: + - id + - options + properties: + id: + type: integer + minimum: 1 + example: 1 + options: + type: array + items: + $ref: '#/components/schemas/Authenticator' + minItems: 1 + Authenticator: + type: object + required: + - idp + - authenticator + properties: + idp: + type: string + example: LOCAL + description: Specifies the identity provider for the step. + authenticator: + type: string + example: basic + description: Specifies the local authenticator for the step. + + AuthProtocolMetadata: + type: object + properties: + name: + type: string + displayName: + type: string + MetadataProperty: + type: object + properties: + options: + type: array + items: + type: string + example: + - 'Option 1' + - 'Option 2' + defaultValue: + type: string + example: 'Option 1' + GrantTypeMetaData: + type: object + properties: + options: + type: array + items: + $ref: '#/components/schemas/GrantType' + GrantType: + type: object + properties: + name: + type: string + example: authorization_code + description: The name of the grant type. + displayName: + type: string + example: Code + description: The display name of the grant type. + SAMLMetaData: + type: object + properties: + defaultNameIdFormat: + type: string + example: 'urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress' + description: If the `nameIdFormat` is not specified, this will be used as the name identifier format to exchange information regarding the user in the SAML assertion. + certificateAlias: + $ref: '#/components/schemas/MetadataProperty' + responseSigningAlgorithm: + $ref: '#/components/schemas/MetadataProperty' + responseDigestAlgorithm: + $ref: '#/components/schemas/MetadataProperty' + assertionEncryptionAlgorithm: + $ref: '#/components/schemas/MetadataProperty' + keyEncryptionAlgorithm: + $ref: '#/components/schemas/MetadataProperty' + OIDCMetaData: + type: object + properties: + allowedGrantTypes: + $ref: '#/components/schemas/GrantTypeMetaData' + defaultUserAccessTokenExpiryTime: + type: string + example: '3600' + defaultApplicationAccessTokenExpiryTime: + type: string + example: '3600' + defaultRefreshTokenExpiryTime: + type: string + example: '86400' + defaultIdTokenExpiryTime: + type: string + example: '3600' + idTokenEncryptionAlgorithm: + $ref: '#/components/schemas/MetadataProperty' + idTokenEncryptionMethod: + $ref: '#/components/schemas/MetadataProperty' + scopeValidators: + $ref: '#/components/schemas/MetadataProperty' + accessTokenType: + $ref: '#/components/schemas/MetadataProperty' + accessTokenBindingType: + $ref: '#/components/schemas/MetadataProperty' + WSTrustMetaData: + type: object + properties: + certificateAlias: + $ref: '#/components/schemas/MetadataProperty' + CustomInboundProtocolMetaData: + type: object + properties: + displayName: + type: string + example: 'My Custom Protocol' + configName: + type: string + example: 'Custom Protocol' + properties: + type: array + items: + $ref: '#/components/schemas/CustomInboundProtocolProperty' + CustomInboundProtocolProperty: + type: object + properties: + name: + type: string + example: 'encryptionAlgorithm' + displayName: + type: string + example: 'Encryption Algorithm' + type: + type: string + enum: + - STRING + - BOOLEAN + - INTEGER + example: STRING + required: + type: boolean + example: true + availableValues: + type: array + items: + type: string + example: + - 'http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p' + - 'http://www.w3.org/2001/04/xmlenc#rsa-1_5' + defaultValue: + type: string + example: 'http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p' + validationRegex: + type: string + example: '^[a-b][A-B]*' + displayOrder: + type: integer + example: 1 + isConfidential: + type: boolean + default: false + + AdaptiveAuthTemplates: + type: object + properties: + templatesJSON: + type: string + example: 'Adaptive Auth Templates JSON' + + FileUpload: + type: object + properties: + file: + type: string + format: binary + description: The `.xml` file to upload. + ApplicationTemplatesList: + type: object + properties: + templates: + type: array + items: + $ref: '#/components/schemas/ApplicationTemplatesListItem' + + ApplicationTemplatesListItem: + type: object + properties: + id: + type: string + example: "85e3f4b8-0d22-4181-b1e3-1651f71b88bd" + description: The ID of the application template. + name: + type: string + example: "OIDC Protocol Template" + description: + type: string + example: "Template to be used for Single Page Applications" + image: + type: string + example: "https://example.com/logo/my-logo.png" + authenticationProtocol: + type: string + example: "oidc" + types: + type: array + items: + type: string + example: + - react + - angular + category: + type: string + enum: [DEFAULT, VENDOR] + example: 'DEFAULT' + displayOrder: + type: integer + example: 2 + templateGroup: + type: string + example: "web-application" + self: + type: string + example: "/t//api/server/v1/applications/templates/85e3f4b8-0d22-4181-b1e3-1651f71b88bd" + description: The URL of the current application. + + ApplicationTemplateModel: + type: object + properties: + id: + type: string + readOnly: true + example: "85e3f4b8-0d22-4181-b1e3-1651f71b88bd" + description: The ID of the application template. + name: + type: string + example: "OIDC Protocol Template" + description: + type: string + example: "Template to be used for Single Page Applications" + image: + type: string + example: "https://example.com/logo/my-logo.png" + authenticationProtocol: + type: string + example: "oidc" + types: + type: array + items: + type: string + example: + - react + - angular + category: + type: string + enum: [DEFAULT, VENDOR] + example: 'DEFAULT' + templateGroup: + type: string + example: "web-application" + displayOrder: + type: integer + example: 2 + application: + $ref: '#/components/schemas/ApplicationModelOIDC' + required: + - name + - application + ApplicationOwner: + type: object + properties: + id: + type: string + example: "85e3f4b8-0d22-4181-b1e3-1651f71b88bd" + required: + - id + AuthorizedAPIResponse: + type: object + properties: + id: + type: string + example: 65b52595-9ca1-4539-aca2-56178643c58b + identifier: + type: string + example: https://greetings.io/v1/greet + displayName: + type: string + example: Greetings API + policyId: + type: string + example: RBAC + type: + type: string + example: BUSINESS + authorizedScopes: + type: array + items: + $ref: '#/components/schemas/AuthorizedScope' + + AuthorizedScope: + type: object + properties: + id: + type: string + example: 65b52595-9ca1-4539-aca2-56178643c58b + name: + type: string + example: bookings:read + displayName: + type: string + example: Read Bookings + + AuthorizedAPICreationModel: + type: object + properties: + id : + type: string + example: 65b52595-9ca1-4539-aca2-56178643c58b + policyIdentifier: + type: string + example: RBAC + scopes: + type: array + items: + type: string + example: bookings:read + + AuthorizedAPIPatchModel: + type: object + properties: + addedScopes: + type: array + items: + type: string + example: bookings:write + removedScopes: + type: array + items: + type: string + example: bookings:read + Error: + type: object + properties: + code: + type: string + example: AAA-00000 + message: + type: string + example: Some error message. + description: + type: string + example: Some error description. + traceId: + type: string + example: e0fbcfeb-3617-43c4-8dd0-7b7d38e13047 + ApplicationSharePOSTRequest: + type: object + properties: + shareWithAllChildren: + type: boolean + default: false + sharedOrganizations: + type: array + items: + type: string + example: + - 682edf68-4835-4bb8-961f-0a16bc6cc866 + - ghfbctgf-4318-46d4-8ee1-7t3s38e23098 + SharedOrganizationsResponse: + type: object + properties: + links: + type: array + items: + $ref: '#/components/schemas/Link' + example: + [ + { + "href": "/api/server/v1/applications/67f5a202-48c4-4313-9327-016da5f08f17/share?limit=10&recursive=false&next=MTA=", + "rel": "next", + }, + { + "href": "/api/server/v1/applications/67f5a202-48c4-4313-9327-016da5f08f17/share?limit=10&recursive=false&before=MTA=", + "rel": "previous", + } + ] + sharingMode: + $ref: '#/components/schemas/SharingMode' + example: + - "policy": "ALL_EXISTING_AND_FUTURE_ORGS" + "roleSharing": + mode: "SELECTED" + roles: + - "displayName": "App Viewer" + "audience": + "display": "My Org 1" + "type": "organization" + organizations: + type: array + items: + $ref: '#/components/schemas/BasicOrganizationResponse' + SharingMode: + type: object + required: [ roleSharing ] + properties: + policy: + type: string + enum: [ "ALL_EXISTING_AND_FUTURE_ORGS", "SELECTED_ORG_WITH_ALL_EXISTING_AND_FUTURE_CHILDREN" ] + description: | + This will only shows the future sharing modes. + - ALL_EXISTING_AND_FUTURE_ORGS: Share with all current and any newly created organizations in future. + - SELECTED_ORG_WITH_ALL_EXISTING_AND_FUTURE_CHILDREN: Share with this organization and its current & future children. + roleSharing: + $ref: "#/components/schemas/RoleSharing" + SharedApplicationsResponse: + type: object + properties: + sharedApplications: + type: array + items: + $ref: '#/components/schemas/SharedApplicationResponse' + SharedApplicationResponse: + type: object + properties: + applicationId: + type: string + description: Shared application's id. + example: 'ca322554-fe79-4c04-9c94-492855ef92a3' + organizationId: + type: string + description: Shared application residing organization id. + example: '682edf68-4835-4bb8-961f-0a16bc6cc866' + BasicOrganizationResponse: + type: object + required: + - id + - name + - orgHandle + - parentId + - status + - ref + - hasChildren + - depthFromRoot + - roles + properties: + id: + type: string + example: 'b4526d91-a8bf-43d2-8b14-c548cf73065b' + name: + type: string + example: 'ABC Builders' + orgHandle: + type: string + example: 'abcbuilders' + parentId: + type: string + example: '08f8c1d2-4b3e-4c5a-9f6b-7d8e9f0a1b2c' + description: | + The parent organization ID. + status: + type: string + enum: [ ACTIVE, DISABLED ] + example: ACTIVE + ref: + type: string + example: '/t//api/server/v1/organizations/b4526d91-a8bf-43d2-8b14-c548cf73065b' + hasChildren: + type: boolean + example: true + depthFromRoot: + type: integer + example: 1 + sharingMode: + $ref: '#/components/schemas/SharingMode' + roles: + type: array + items: + $ref: '#/components/schemas/RoleShareConfig' + description: "List of roles that are shared with the application in this organization." + ApplicationShareSelectedRequestBody: + type: object + required: [ applicationId, organizations ] + properties: + applicationId: + type: string + organizations: + type: array + items: + $ref: "#/components/schemas/OrgShareConfig" + + OrgShareConfig: + type: object + required: [ orgId, policy, roleSharing ] + properties: + orgId: + type: string + policy: + type: string + enum: [ "SELECTED_ORG_ONLY", + "SELECTED_ORG_WITH_ALL_EXISTING_AND_FUTURE_CHILDREN"] + description: | + - SELECTED_ORG_ONLY: Share app with only this specific organizations. + - SELECTED_ORG_WITH_ALL_EXISTING_AND_FUTURE_CHILDREN: Share with this organization and its current & future children. + roleSharing: + $ref: "#/components/schemas/RoleSharing" + + ApplicationShareAllRequestBody: + type: object + required: [ applicationId, policy, roleSharing ] + properties: + applicationId: + type: string + policy: + type: string + enum: [ "ALL_EXISTING_ORGS_ONLY", + "ALL_EXISTING_AND_FUTURE_ORGS"] + description: | + - ALL_EXISTING_ORGS_ONLY: Share with all organizations currently present. + - ALL_EXISTING_AND_FUTURE_ORGS: Share with all current and any newly created organizations in future. + roleSharing: + $ref: "#/components/schemas/RoleSharing" + + ApplicationUnshareSelectedRequestBody: + type: object + required: [ applicationId, orgIds ] + properties: + applicationId: + type: string + orgIds: + type: array + items: + type: string + + ApplicationUnshareAllRequestBody: + type: object + required: [ applicationId ] + properties: + applicationId: + type: string + ApplicationSharingPatchRequest: + type: object + required: [ applicationId, Operations ] + properties: + applicationId: + type: string + Operations: + type: array + items: + $ref: "#/components/schemas/ApplicationSharingPatchOperation" + ApplicationSharingPatchOperation: + type: object + required: [ op, path ] + properties: + op: + type: string + description: "Patch operation type (like SCIM): Currently only 'add' and 'remove' are supported." + path: + type: string + description: "Path in the format 'organizations[orgId eq \"abc123\"].roles'" + value: + type: array + description: "List of roles to add/remove" + items: + type: object + example: + - "displayName": "App Viewer" + "audience": + - "display": "My Org 1" + "type": "organization" + RoleSharing: + type: object + required: [ mode ] + properties: + mode: + type: string + enum: [ ALL, NONE, SELECTED ] + roles: + type: array + description: "List of roles (required when mode=SELECTED)" + items: + $ref: "#/components/schemas/RoleShareConfig" + description: |- + - ALL => share all roles + - NONE => share no roles + - SELECTED => provide a list of specific roles + example: + - "mode": "SELECTED" + "roles": + - "displayName": "App Viewer" + "audience": + "display": "My Org 1" + "type": "organization" + RoleShareConfig: + type: object + required: [ displayName, audience ] + properties: + displayName: + type: string + description: "The human-readable name of the role" + audience: + type: object + required: [ display, type ] + properties: + display: + type: string + description: "Display name of the audience (e.g., organization or application name)" + type: + type: string + description: | + The type of the role audience: + - `organization`: Role is scoped at organization level. + - `application`: Role is scoped at application level. + ProcessSuccessResponse: + type: object + properties: + status: + type: string + example: "Processing" + details: + type: string + example: "Application sharing process triggered successfully." + DiscoverableGroup: + type: object + required: + - userStore + - groups + properties: + userStore: + type: string + description: The user store domain to which the groups belong. + example: "PRIMARY" + groups: + type: array + items: + $ref: '#/components/schemas/GroupBasicInfo' + minItems: 1 + description: List of groups configured for discoverability. + GroupBasicInfo: + type: object + required: + - id + properties: + id: + type: string + description: The unique identifier of the group. + example: "bf5abd05-3667-4a2a-a6c2-2fb9f4d26e47" + name: + type: string + description: The name of the group. + example: "GroupA" +servers: + - url: 'https://api.asgardeo.io/t/{organization-name}/api/server/v1' diff --git a/docusaurus-asgardeo/static/apis/restapis/approvals.yaml b/docusaurus-asgardeo/static/apis/restapis/approvals.yaml new file mode 100644 index 0000000000..7bcc34865d --- /dev/null +++ b/docusaurus-asgardeo/static/apis/restapis/approvals.yaml @@ -0,0 +1,377 @@ +openapi: 3.0.0 +info: + title: Asgardeo - Workflow Approval API + description: | + This is the RESTful API for a user to manage pending approvals in Asgardeo. This API can be used to retrieve pending approvals and update the status of the approval tasks for the authenticated user. + version: v2 +servers: + - url: 'https://api.asgardeo.io/t/{organization-name}/api/users/v2' +security: + - OAuth2: [] +tags: + - name: me + description: Operations for the authenticated user. +paths: + /me/approval-tasks: + get: + tags: + - me + summary: Retrieves available approvals for the authenticated user + description: | + Retrieve the available approval tasks in the system for the authenticated user. This API returns the following types of approvals: + * READY - Tasks that are _claimable_ by the user. If a particular task is in the READY state, the user is eligible to self-assign the task and complete it. + * RESERVED - Tasks that are _assigned_ to the user and to be approved by this user. + * COMPLETED - Tasks that are already _completed_ (approved or denied) by this user. + + A user can also invoke the endpoint with the following query parameters. + security: + - OAuth2: + - internal_approval_task_view + operationId: listApprovalTasksForLoggedInUser + parameters: + - $ref: '#/components/parameters/limitQueryParam' + - $ref: '#/components/parameters/offsetQueryParam' + - $ref: '#/components/parameters/statusQueryParam' + responses: + "200": + description: Array of approval tasks matching the search criteria + content: + 'application/json': + schema: + type: array + items: + $ref: '#/components/schemas/TaskSummary' + example: + - id: "453" + name: "Sample Task 1" + presentationSubject: Update Claims + presentationName: SampleWorkflowTask + taskType: TASK + status: RESERVED + priority: 0 + createdTimeInMillis: "1565597712157" + - id: "452" + name: "Sample Task 2" + presentationSubject: Update Claims + presentationName: SampleWorkflowTask + taskType: TASK + status: COMPLETED + priority: 0 + createdTimeInMillis: "1565597675414" + - id: "451" + name: "Sample task 3" + presentationSubject: Update Claims + presentationName: SampleWorkflowTask + taskType: TASK + status: READY + priority: 0 + createdTimeInMillis: "1565597569021" + 400: + $ref: '#/components/responses/InvalidInput' + 401: + $ref: '#/components/responses/Unauthorized' + 403: + $ref: '#/components/responses/Forbidden' + 500: + $ref: '#/components/responses/ServerError' + /me/approval-tasks/{task-id}: + get: + tags: + - me + summary: Retrieves an approval task by the task-id + description: | + Retrieves information of a specific approval task identified by the task-id + + security: + - OAuth2: + - internal_approval_task_view + operationId: getApprovalTaskInfo + parameters: + - $ref: '#/components/parameters/taskIdPathParam' + responses: + "200": + description: Detailed information of the approval task identified by the + task-id + content: + 'application/json': + schema: + $ref: '#/components/schemas/TaskData' + example: + id: "452" + subject: Update Claims + description: You have a request to approve claim update action of + a user. + priority: 0 + initiator: admin + approvalStatus: APPROVE + assignees: + - key: group + value: admin + properties: + - key: REQUEST ID + value: "34172334-fccb-4ef4-9830-08c3caeaab9e," + - key: Username + value: "aysh234," + - key: User Store Domain + value: "PRIMARY," + - key: Profile + value: "default," + - key: Claims + value: "http://wso2.org/claims/organization:,http://wso2.org/claims/telephone:,http://wso2.org/claims/im:,http://wso2.org/claims/country:Sri\ + \ Lanka,http://wso2.org/claims/mobile:,http://wso2.org/claims/emailaddress:ayesha@wso2.com,profileConfiguration:default,http://wso2.org/claims/lastname:Dissanayaka,http://wso2.org/claims/url:,http://wso2.org/claims/givenname:Ayesha," + 400: + $ref: '#/components/responses/InvalidInput' + 401: + $ref: '#/components/responses/Unauthorized' + 403: + $ref: '#/components/responses/Forbidden' + 404: + $ref: '#/components/responses/NotFound' + 409: + $ref: '#/components/responses/Conflict' + 500: + $ref: '#/components/responses/ServerError' + /me/approval-tasks/{task-id}/state: + put: + tags: + - me + summary: Changes the state of an approval task + description: | + Update the approval task status by defining one of the following actions: + * CLAIM - Reserve the task for the user. Status of the task will be changed from READY to RESERVED. + * RELEASE - Release the task for other users to claim. Status of the task will be changed from RESERVED to READY. + * APPROVE - Approve the task. Status of the task will be changed to COMPLETED. + * REJECT - Deny the task. Status of the task will be changed to COMPLETED. + + security: + - OAuth2: + - internal_approval_task_update + operationId: updateStateOfTask + parameters: + - $ref: '#/components/parameters/taskIdPathParam' + requestBody: + description: To which state the task should be changed. + content: + 'application/json': + schema: + $ref: '#/components/schemas/StateDTO' + required: false + responses: + 200: + $ref: '#/components/responses/OK' + 400: + $ref: '#/components/responses/InvalidInput' + 401: + $ref: '#/components/responses/Unauthorized' + 403: + $ref: '#/components/responses/Forbidden' + 404: + $ref: '#/components/responses/NotFound' + 500: + $ref: '#/components/responses/ServerError' +components: + schemas: + TaskSummary: + type: object + properties: + id: + type: string + description: Unique ID to represent an Approval Task + example: "451" + name: + type: string + description: Unique name for the Approval Task + example: s367:testTask + presentationSubject: + type: string + description: Display value for Approval Operation + example: Add new Role + presentationName: + type: string + description: Display value for Approval Task + example: sampleTask + taskType: + type: string + description: Type of the Approval + example: TASK + status: + type: string + description: State of the Approval task + example: READY + enum: + - READY + - RESERVED + - COMPLETED + priority: + type: integer + description: Priority of the Approval task + example: 0 + createdTimeInMillis: + type: string + description: The time that the operation for approval initiated + example: "1565597569021" + TaskData: + type: object + properties: + id: + type: string + description: Unique ID to represent a approval task + example: "451" + subject: + type: string + description: Subject of the Approval + example: Add new Role + description: + type: string + description: Description on the Approval task + example: Adds a new role to the system + priority: + type: integer + description: Priority of the Approval task + example: 0 + initiator: + type: string + description: The user who initiated the task + example: some-user-name + approvalStatus: + type: string + description: | + Available only for the completed Tasks, APPROVED or REJECTED if the task has been completed, PENDING otherwise + example: APPROVE + enum: + - PENDING + - APPROVED + - REJECTED + assignees: + type: array + description: | + To whom the task is assigned: + * user - username(s) if the task is reserved for specific user(s). + * group - role name(s) if the task is assignable for group(s). + items: + $ref: '#/components/schemas/Property' + properties: + type: array + items: + $ref: '#/components/schemas/Property' + Property: + type: object + properties: + key: + type: string + value: + type: string + StateDTO: + type: object + properties: + action: + type: string + description: Action to perform on the task. + example: APPROVE + enum: + - CLAIM + - RELEASE + - APPROVE + - REJECT + Error: + required: + - code + - message + type: object + properties: + code: + type: string + example: some_error_code + message: + type: string + example: Some Error Message + description: + type: string + example: Some Error Description + traceId: + type: string + example: Some Correlation for Error Instance + responses: + NotFound: + description: The specified resource is not found + content: + 'application/json': + schema: + $ref: '#/components/schemas/Error' + Unauthorized: + description: Unauthorized + ServerError: + description: Internal Server Error + content: + 'application/json': + schema: + $ref: '#/components/schemas/Error' + InvalidInput: + description: Invalid input request + content: + 'application/json': + schema: + $ref: '#/components/schemas/Error' + Conflict: + description: Element Already Exists + content: + 'application/json': + schema: + $ref: '#/components/schemas/Error' + Created: + description: Item Created + OK: + description: OK + Deleted: + description: Item Deleted + Forbidden: + description: Resource Forbidden + parameters: + taskIdPathParam: + name: task-id + in: path + description: Task ID + required: true + schema: + type: string + offsetQueryParam: + name: offset + in: query + description: Number of records to skip for pagination + schema: + minimum: 0 + type: integer + format: int32 + limitQueryParam: + name: limit + in: query + description: Maximum number of records to return + schema: + minimum: 0 + type: integer + format: int32 + statusQueryParam: + name: status + in: query + description: | + Approval task's status to filter tasks by their status: + * **RESERVED** - Tasks that are **assigned to** the authenticated user. + * **READY** - Tasks that **can be assigned to** and **can be approved by** the authenticated user. + * **COMPLETED** - Tasks that are **completed by** the user + * \ - **All** the viewable tasks will be retrieved if this parameter is not specified. + style: form + explode: false + schema: + type: array + items: + enum: [READY, RESERVED, COMPLETED] + securitySchemes: + OAuth2: + type: oauth2 + flows: + authorizationCode: + authorizationUrl: 'https://api.asgardeo.io/t/{organization-name}/oauth2/authorize' + tokenUrl: 'https://api.asgardeo.io/t/{organization-name}/oauth2/token' + scopes: + internal_approval_task_view: View approval tasks + internal_approval_task_update: Update approval tasks diff --git a/docusaurus-asgardeo/static/apis/restapis/association-management-by-admin.yaml b/docusaurus-asgardeo/static/apis/restapis/association-management-by-admin.yaml new file mode 100644 index 0000000000..c5ad60ccc2 --- /dev/null +++ b/docusaurus-asgardeo/static/apis/restapis/association-management-by-admin.yaml @@ -0,0 +1,589 @@ +openapi: 3.0.1 +info: + title: User Account Association API + description: | + This document specifies a **User Account Association Management RESTful API** for Asgardeo. + The APIs provide the capability for privileged users to retrieve/delete associated local/federated accounts of other users. + version: v1 +servers: + - url: https://api.asgardeo.io/t/{organization-name}/api/users/v1 + variables: + serverUrl: + default: https://api.asgardeo.io/t/{organization-name} + tenantDomain: + default: carbon.super +security: + - OAuth2: [] +tags: + - name: admin + description: | + Operations available for privileged users, to be invoked on behalf of another user. +paths: + /{user-id}/associations: + get: + tags: + - admin + summary: Get user's associations + description: | + This API is used to retrieve the associations of the user.
    + + Scope(Permission) required: `internal_user_association_view` + parameters: + - name: user-id + in: path + description: user id + required: true + schema: + type: string + responses: + 200: + description: Successful operation + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/User' + 204: + description: No content + content: {} + 401: + description: Unauthorized request + content: {} + 403: + description: Resource Forbidden + content: {} + 404: + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 500: + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/users/v1/{user-id}/associations' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer-token}' + delete: + tags: + - admin + summary: Delete user's all user associations + description: | + This API is used to delete all associations of the user.
    + + Scope(Permission) required: `internal_user_association_delete` + parameters: + - name: user-id + in: path + required: true + schema: + type: string + responses: + 204: + description: No content + content: {} + 401: + description: Unauthorized request + content: {} + 403: + description: Resource Forbidden + content: {} + 404: + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 500: + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'DELETE' \ + 'https://api.asgardeo.io/t/{organization-name}/api/users/v1/{user-id}/associations' \ + -H 'accept: */*' \ + -H 'Authorization: Bearer {bearer-token}' + /{user-id}/federated-associations: + get: + tags: + - admin + summary: Get user's federated associations + description: | + This API is used to retrieve the federated associations of the user.
    + + Scope(Permission) required: `internal_user_association_view` + parameters: + - name: user-id + in: path + description: user id + required: true + schema: + type: string + responses: + 200: + description: Successful operation + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/FederatedAssociation' + 204: + description: No content + content: {} + 401: + description: Unauthorized request + content: {} + 403: + description: Resource Forbidden + content: {} + 404: + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 500: + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/users/v1/{user-id}/federated-associations' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer-token}' + post: + tags: + - admin + summary: Create federated user association + description: | + This API allows administrators to explicitly associate a local user with a federated identity.
    + Scope(Permission) required: `internal_user_association_create` + parameters: + - name: user-id + in: path + required: true + description: user id + type: string + - name: association + in: body + description: User details to be associated. + required: true + schema: + $ref: '#/definitions/FederatedAssociationRequest' + responses: + 201: + description: Successfully created + schema: + $ref: '#/definitions/FederatedAssociation' + 400: + description: Bad Request + schema: + $ref: '#/definitions/Error' + 401: + description: Unauthorized + schema: + $ref: '#/definitions/Error' + 403: + description: Resource Forbidden + schema: + $ref: '#/definitions/Error' + 500: + description: Server Error + schema: + $ref: '#/definitions/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{organization-name}/api/users/v1/{user-id}/federated-associations' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer-token}' \ + -H 'Content-Type: application/json' \ + -d '{ + "idp": "exampleIdP", + "federatedUserId": "john@example.com" + }' + delete: + tags: + - admin + summary: Delete user's all user-federated associations + description: | + This API is used to delete all federated associations of the user.
    + + Scope(Permission) required: `internal_user_association_delete` + parameters: + - name: user-id + in: path + required: true + schema: + type: string + responses: + 204: + description: No content + content: {} + 401: + description: Unauthorized request + content: {} + 403: + description: Resource Forbidden + content: {} + 404: + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 500: + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'DELETE' \ + 'https://api.asgardeo.io/t/{organization-name}/api/users/v1/{user-id}/federated-associations' \ + -H 'accept: */*' \ + -H 'Authorization: Bearer {bearer-token}' + /{user-id}/federated-associations/{id}: + delete: + tags: + - admin + summary: Delete the user's federated association + description: | + This API is used to delete a federated association of the user.
    + + Scope(Permission) required: `internal_user_association_delete` + parameters: + - name: user-id + in: path + required: true + schema: + type: string + - name: id + in: path + required: true + schema: + type: string + responses: + 204: + description: No content + content: {} + 401: + description: Unauthorized request + content: {} + 403: + description: Resource Forbidden + content: {} + 404: + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 500: + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'DELETE' \ + 'https://api.asgardeo.io/t/{organization-name}/api/users/v1/user-id/federated-associations/federated-association-id' \ + -H 'accept: */*' \ + -H 'Authorization: Bearer {bearer-token}' + /federated-associations/bulk: + post: + tags: + - admin + summary: Create and Delete users associations in bulk + description: | + This API is used to create and delete users association in bulk.
    + Maximum number of supported operations in a single request is 1000 by default. + It can be configured using a server level configuration. + Scope required: + * internal_user_fed_association_bulk + parameters: + - name: body + in: body + required: false + schema: + $ref: '#/definitions/BulkFederatedAssociationRequest' + responses: + 200: + description: Success + schema: + $ref: '#/definitions/BulkFederatedAssociationResponse' + 400: + description: Bad Request + schema: + $ref: '#/definitions/Error' + 401: + description: Unauthorized + schema: + $ref: '#/definitions/Error' + 403: + description: Forbidden + schema: + $ref: '#/definitions/Error' + 500: + description: Internal Server Error + schema: + $ref: '#/definitions/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{organization-name}/api/users/v1/federated-associations/bulk' \ + -H 'accept: */*' \ + -H 'Authorization: Bearer {bearer-token}' \ + -d '{ + "failOnErrors": 0, + "operations": [ + { + "method": "POST", + "bulkId": "qewvaewv", + "path": "/1ca49238-3ab0-474b-9d42-8067780a503c/federated-associations", + "data": { + "idp": "Google", + "federatedUserId": "sam@gmail,com" + } + }, + { + "method": "POST", + "bulkId": "fgnruyt", + "path": "/7589bffc-b315-4dbd-83a5-86f5b8aa4776/federated-associations", + "data": { + "idp": "Google", + "federatedUserId": "mike@gmail,com" + } + }, + { + "method": "DELETE", + "bulkId": "useffger", + "path": "/0a2d94e2-3b98-49ea-89d6-e8dd9e0ff89b/federated-associations" + }, + { + "method": "DELETE", + "bulkId": "eefvrtgnrtn", + "path": "/197fc0fa-c2b0-48e6-92a6-a551afc3d125/federated-associations/0dcc3f5a-3bee-4f36-a91f-8ee60dbae875" + } + ] + }' + +components: + schemas: + Error: + required: + - code + - message + type: object + properties: + code: + type: string + example: some_error_code + message: + type: string + example: Some Error Message + description: + type: string + example: Some Error Description + traceId: + type: string + example: Some Correlation for Error Instance + User: + type: object + properties: + userId: + type: string + example: 23e22434234234329jj9iin + username: + type: string + example: john + userStoreDomain: + type: string + example: PRIMARY + tenantDomain: + type: string + example: carbon.super + firstName: + type: string + example: john + lastName: + type: string + example: doe + email: + type: string + example: john.doe@wso2.com + FederatedAssociation: + type: object + properties: + id: + type: string + example: eeqweisfhkdfik + idp: + $ref: '#/components/schemas/Idp' + federatedUserId: + type: string + example: john@google.com + Idp: + type: object + properties: + id: + type: string + example: eeqweisfhkdfikaefcqwesfceqwqas + name: + type: string + example: google.com + displayName: + type: string + example: Google + imageUrl: + type: string + example: https://is.example.com/sample.jpg + Property: + type: object + properties: + key: + type: string + example: test-key + value: + type: string + example: test-value + AssociationUserRequest: + type: object + properties: + userId: + type: string + example: john + password: + type: string + example: userpassword + properties: + type: array + items: + $ref: '#/components/schemas/Property' + FederatedAssociationRequest: + type: object + properties: + idp: + type: string + example: exampleIdP + description: Name of the IdP + federatedUserId: + type: string + example: john@example.com + description: User identifier in the federated IdP + BulkFederatedAssociationRequest: + type: object + properties: + failOnErrors: + type: integer + example: 1 + description: | + This represents whether the API should stop processing the operations if any of them fail. The subsequent + operations after the the fail count is reached will not be processed. + If set to 0 or not set, the API will continue processing the operations even if some of them fail. + operations: + type: array + items: + $ref: '#/definitions/BulkFederatedAssociationOperation' + + BulkFederatedAssociationOperation: + type: object + required: + - method + - bulkId + - path + properties: + method: + type: string + enum: + - POST + - DELETE + example: POST + description: | + HTTP method to be used for the operation. Supported methods are POST and, DELETE. These values + If the method is not specified, the operation will be treated as a bad request. + bulkId: + type: string + example: "ytrewq" + path: + type: string + example: "/b1781d25-bde5-460a-a58a-8fe8dbfd8487/federated-associations" + description: | + The path to the resource to be operated on. The path should be relative to the base path of the API. + Full path for a federated association operation would be + `/t/{tenant-domain}/api/users/v1/{user-id}/federated-associations/{association-id}`. + data: + $ref: '#/definitions/UserFederatedAssociationData' + + UserFederatedAssociationData: + type: object + properties: + idp: + type: string + example: "exampleIdP" + description: Name of the IdP + federatedUserId: + type: string + example: "john@example.com" + description: User identifier in the federated IdP + + BulkFederatedAssociationResponse: + type: object + properties: + Operations: + type: array + items: + $ref: '#/definitions/BulkAssociationOperationResponse' + + BulkAssociationOperationResponse: + type: object + properties: + bulkId: + type: string + example: "qwerty" + status: + type: object + properties: + statusCode: + type: integer + example: "400" + errorCode: + type: string + example: "UAA-10012" + errorMessage: + type: string + example: "Error while adding federated user association: 1890c6c0-d1a0-4eb4-8075-320756d75946" + errorDescription: + type: string + example: "The federated association is already associated to a local user" + securitySchemes: + OAuth2: + type: oauth2 + flows: + authorizationCode: + authorizationUrl: https://api.asgardeo.io/t/{organization-name}/oauth2/authorize + tokenUrl: https://api.asgardeo.io/t/{organization-name}/oauth2/token + scopes: {} diff --git a/docusaurus-asgardeo/static/apis/restapis/association-management-by-user.yaml b/docusaurus-asgardeo/static/apis/restapis/association-management-by-user.yaml new file mode 100644 index 0000000000..5bdb122a89 --- /dev/null +++ b/docusaurus-asgardeo/static/apis/restapis/association-management-by-user.yaml @@ -0,0 +1,404 @@ +openapi: 3.0.1 +info: + title: User Account Associations API + description: | + This document specifies a **User Account Association Management RESTful API** for Asgardeo. + The APIs provide the capability to `add`/`retrieve`/`delete` associated local/federated accounts of an authenticated user. + version: v1 +servers: + - url: https://api.asgardeo.io/t/{organization-name}/api/users/v1 +security: + - OAuth2: [] +tags: + - name: me + description: Operations for the authenticated user. + +paths: + /me/associations: + get: + tags: + - me + summary: Retrieve the associations of the authenticated user + description: | + This API is used to retrieve the associations of the authenticated user.
    + + Scope(Permission) required: `internal_login` + responses: + 200: + description: Successful operation + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/User' + 204: + description: No content + content: {} + 401: + description: Unauthorized + content: {} + 403: + description: Resource Forbidden + content: {} + 500: + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/users/v1/me/associations' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer-token}' + post: + tags: + - me + summary: | + Associate a user to the authenticated user + description: | + This API is used to associate a user to the authenticated user. For example, if it is required to associate your user account to the user account of 'john', this endpoint can be used. The userId and the password are required to associate the accounts.
    + + Scope(Permission) required: `internal_login` + requestBody: + description: User details to be associated. userId should be the fully qualified + username of the user. + content: + application/json: + schema: + $ref: '#/components/schemas/AssociationUserRequest' + required: true + responses: + 201: + description: Successfully created + content: {} + 400: + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 401: + description: Unauthorized + content: {} + 403: + description: Resource Forbidden + content: {} + 409: + description: Conflict + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 500: + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{organization-name}/api/users/v1/me/associations' \ + -H 'accept: */*' \ + -H 'Authorization: Bearer {bearer-token}' \ + -H 'Content-Type: application/json' \ + -d '{ + "userId": "john", + "password": "userpassword", + "properties": [ + { + "key": "test-key", + "value": "test-value" + } + ] + }' + x-codegen-request-body-name: association + delete: + tags: + - me + summary: Delete all my user associations + description: | + This API is used to delete all associations of the authenticated user.
    + + Scope(Permission) required: `internal_login` + responses: + 204: + description: No content + content: {} + 401: + description: Unauthorized + content: {} + 403: + description: Resource Forbidden + content: {} + 500: + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'DELETE' \ + 'https://api.asgardeo.io/t/{organization-name}/api/users/v1/me/associations' \ + -H 'accept: */*' \ + -H 'Authorization: Bearer {bearer-token}' + /me/associations/{associated-user-id}: + delete: + tags: + - me + summary: Delete the given user account from associations + description: | + This API is used to delete the given user account from the associations of the authenticated user.
    + + Scope(Permission) required: `internal_login` + parameters: + - name: associated-user-id + in: path + required: true + schema: + type: string + responses: + 204: + description: No content + content: {} + 401: + description: Unauthorized + content: {} + 403: + description: Resource Forbidden + content: {} + 500: + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'DELETE' \ + 'https://api.asgardeo.io/t/{organization-name}/api/users/v1/me/associations/{associated-user-id}' \ + -H 'accept: */*' \ + -H 'Authorization: Bearer {bearer-token}' + /me/federated-associations: + get: + tags: + - me + summary: Retrieve the federated associations of the authenticated user. + description: | + This API is used to retrieve the federated associations of the authenticated user.
    + + Scope(Permission) required: `internal_login` + responses: + 200: + description: Successful operation + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/FederatedAssociation' + 204: + description: No content + content: {} + 401: + description: Unauthorized + content: {} + 403: + description: Resource Forbidden + content: {} + 500: + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/users/v1/me/federated-associations' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer-token}' + delete: + tags: + - me + summary: Delete all my federated user associations + description: | + This API is used to delete all the federated associations of the authenticated user.
    + + Scope(Permission) required: `internal_login` + responses: + 204: + description: No content + content: {} + 401: + description: Unauthorized + content: {} + 403: + description: Resource Forbidden + content: {} + 500: + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'DELETE' \ + 'https://api.asgardeo.io/t/{organization-name}/api/users/v1/me/federated-associations' \ + -H 'accept: */*' \ + -H 'Authorization: Bearer {bearer-token}' + /me/federated-associations/{id}: + delete: + tags: + - me + summary: Delete my federated association + description: | + This API is used to delete a federated association of the authenticated user.
    + + Scope required: `internal_login` + parameters: + - name: id + in: path + required: true + schema: + type: string + responses: + 204: + description: No content + content: {} + 401: + description: Unauthorized request + content: {} + 403: + description: Resource Forbidden + content: {} + 404: + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 500: + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'DELETE' \ + 'https://api.asgardeo.io/t/{organization-name}/api/users/v1/me/federated-associations/{federated-association-id}' \ + -H 'accept: */*' \ + -H 'Authorization: Bearer {bearer-token}' +components: + schemas: + Error: + required: + - code + - message + type: object + properties: + code: + type: string + example: some_error_code + message: + type: string + example: Some Error Message + description: + type: string + example: Some Error Description + traceId: + type: string + example: Some Correlation for Error Instance + User: + type: object + properties: + userId: + type: string + example: 23e22434234234329jj9iin + username: + type: string + example: john + userStoreDomain: + type: string + example: PRIMARY + tenantDomain: + type: string + example: carbon.super + firstName: + type: string + example: john + lastName: + type: string + example: doe + email: + type: string + example: john.doe@wso2.com + FederatedAssociation: + type: object + properties: + id: + type: string + example: eeqweisfhkdfik + idp: + $ref: '#/components/schemas/Idp' + federatedUserId: + type: string + example: john@google.com + Idp: + type: object + properties: + id: + type: string + example: eeqweisfhkdfikaefcqwesfceqwqas + name: + type: string + example: google.com + displayName: + type: string + example: Google + imageUrl: + type: string + example: https://is.example.com/sample.jpg + Property: + type: object + properties: + key: + type: string + example: test-key + value: + type: string + example: test-value + AssociationUserRequest: + type: object + properties: + userId: + type: string + example: john + password: + type: string + example: userpassword + properties: + type: array + items: + $ref: '#/components/schemas/Property' + securitySchemes: + OAuth2: + type: oauth2 + flows: + authorizationCode: + authorizationUrl: https://api.asgardeo.io/t/{organization-name}/oauth2/authorize + tokenUrl: https://api.asgardeo.io/t/{organization-name}/oauth2/token + scopes: {} diff --git a/docusaurus-asgardeo/static/apis/restapis/attribute-management.yaml b/docusaurus-asgardeo/static/apis/restapis/attribute-management.yaml new file mode 100644 index 0000000000..d0592682e1 --- /dev/null +++ b/docusaurus-asgardeo/static/apis/restapis/attribute-management.yaml @@ -0,0 +1,1537 @@ +openapi: 3.0.1 +info: + title: Asgardeo Attribute Management API + description: This is the RESTful API for attribute (claim) management related operations in + Asgardeo. This API allows adding, retrieving, updating, and deleting + local/external claims and claim dialects. + version: v1 +servers: +- url: https://api.asgardeo.io/t/{organization-name}/api/server/v1 +security: +- OAuth2: [] +paths: + /claim-dialects/local/claims: + get: + tags: + - Claims (local) + summary: Retrieve local claims. + description: Retrieve local claims.

    Scope(Permission) required: + ``internal_claim_meta_view`` + operationId: getLocalClaims + parameters: + - name: attributes + in: query + description: Define only the required attributes to be sent in the response + object.
    This option is not yet supported. + schema: + type: string + - name: limit + in: query + description: Maximum number of records to return.
    This option is not yet supported. + schema: + type: integer + format: int32 + - name: offset + in: query + description: Number of records to skip for pagination.
    This option is not yet supported. + schema: + type: integer + format: int32 + - name: filter + in: query + description: Condition to filter the retrieval of records.
    This option is not yet supported. + schema: + type: string + - name: sort + in: query + description: Define the order by which the retrieved records should be sorted.
    This option is not yet supported. + schema: + type: string + - name: profile + in: query + description: | + The claims belong to the given profile. This is used to filter claims based on the profile. +
    Available profiles: +
      +
    • console
    • +
    • endUser
    • +
    • selfRegistration
    • +
    + schema: + type: string + - name: exclude-identity-claims + in: query + description: Exclude identity claims when listing local claims. + schema: + type: boolean + - name: exclude-hidden-claims + in: query + description: Exclude hidden claims when listing local claims. + schema: + type: boolean + responses: + 200: + description: Local claims. + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/LocalClaimRes' + 401: + description: Unauthorized. + content: {} + 500: + description: Internal Server Error. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 501: + description: Not Implemented. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/claim-dialects/local/claims' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + post: + tags: + - Claims (local) + summary: Add a local claim. + description: Add a new claim.
    +
    Scope(Permission) required: ``internal_claim_meta_create`` + operationId: addLocalClaim + requestBody: + description: Local claim to be added. + content: + application/json: + schema: + $ref: '#/components/schemas/LocalClaimReq' + required: false + responses: + 201: + description: Item Created. + headers: + Location: + description: URI of the created resource. + schema: + type: string + content: {} + 400: + description: Invalid input request. + content: + '*/*': + schema: + $ref: '#/components/schemas/Error' + 401: + description: Unauthorized. + content: {} + 403: + description: Resource Forbidden. + content: {} + 409: + description: Element Already Exists. + content: + '*/*': + schema: + $ref: '#/components/schemas/Error' + 500: + description: Internal Server Error. + content: + '*/*': + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/claim-dialects/local/claims' \ + -H 'accept: */*' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "claimURI": "http://wso2.org/claims/username", + "description": "Some description about the claim.", + "displayOrder": 10, + "displayName": "Username", + "readOnly": true, + "regEx": "^([a-zA-Z)$", + "required": true, + "supportedByDefault": true, + "attributeMapping": [ + { + "mappedAttribute": "username", + "userstore": "SECONDARY" + } + ], + "properties": [ + { + "key": "string", + "value": "string" + } + ] + }' + x-codegen-request-body-name: localClaim + /claim-dialects/local/claims/{claim-id}: + get: + tags: + - Claims (local) + summary: Retrieve a local claim. + description: Retrieve a local claim matching the given claim ID.

    Scope(Permission) required: ``internal_claim_meta_view`` + operationId: getLocalClaim + parameters: + - name: claim-id + in: path + description: Id of the claim. + required: true + schema: + type: string + responses: + 200: + description: Requested claim. + content: + application/json: + schema: + $ref: '#/components/schemas/LocalClaimRes' + 400: + description: Invalid input request. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 401: + description: Unauthorized. + content: {} + 403: + description: Resource Forbidden. + content: {} + 404: + description: The specified resource is not found. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 500: + description: Internal Server Error. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/claim-dialects/local/claims/{claim-id}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + put: + tags: + - Claims (local) + summary: Update a local claim. + description: Update a local claim.

    Scope(Permission) required: ``internal_claim_meta_update`` + operationId: updateLocalClaim + parameters: + - name: claim-id + in: path + description: Id of the claim. + required: true + schema: + type: string + requestBody: + description: Updated local claim. + content: + application/json: + schema: + $ref: '#/components/schemas/LocalClaimReq' + required: false + responses: + 200: + description: OK. + content: {} + 400: + description: Invalid input request. + content: + '*/*': + schema: + $ref: '#/components/schemas/Error' + 401: + description: Unauthorized. + content: {} + 403: + description: Resource Forbidden. + content: {} + 409: + description: Element Already Exists. + content: + '*/*': + schema: + $ref: '#/components/schemas/Error' + 500: + description: Internal Server Error. + content: + '*/*': + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PUT' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/claim-dialects/local/claims/{claim-id}' \ + -H 'accept: */*' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "claimURI": "http://wso2.org/claims/username", + "description": "Some description about the claim.", + "displayOrder": 10, + "displayName": "Username", + "readOnly": true, + "regEx": "^([a-zA-Z)$", + "required": true, + "supportedByDefault": true, + "attributeMapping": [ + { + "mappedAttribute": "username", + "userstore": "SECONDARY" + } + ], + "properties": [ + { + "key": "string", + "value": "string" + } + ] + }' + x-codegen-request-body-name: localClaim + delete: + tags: + - Claims (local) + summary: Delete a local claim. + description: Delete a claim by claim ID.

    Scope(Permission) required: ``internal_claim_meta_delete`` + operationId: deleteLocalClaim + parameters: + - name: claim-id + in: path + description: Id of the claim. + required: true + schema: + type: string + responses: + 204: + description: No Content. + content: {} + 400: + description: Invalid input request. + content: + '*/*': + schema: + $ref: '#/components/schemas/Error' + 401: + description: Unauthorized. + content: {} + 403: + description: Resource Forbidden. + content: {} + 500: + description: Internal Server Error. + content: + '*/*': + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'DELETE' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/claim-dialects/local/claims/{claim-id}' \ + -H 'accept: */*' \ + -H 'Authorization: Bearer {bearer_token}' + + /claim-dialects: + get: + tags: + - Claim dialects + summary: Retrieve claim dialects. + description: Retrieve claim dialects.

    Scope(Permission) required: ``internal_claim_meta_view`` + operationId: getClaimDialects + parameters: + - name: limit + in: query + description: Maximum number of records to return.
    This option is not yet supported. + schema: + type: integer + format: int32 + - name: offset + in: query + description: Number of records to skip for pagination.
    This option is not yet supported. + schema: + type: integer + format: int32 + - name: filter + in: query + description: Condition to filter the retrieval of records.
    This option is not yet supported. + schema: + type: string + - name: sort + in: query + description: Define the order by which the retrieved records should be sorted.
    This option is not yet supported. + schema: + type: string + responses: + 200: + description: Claim dialects. + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/ClaimDialectRes' + 401: + description: Unauthorized. + content: {} + 500: + description: Internal Server Error. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 501: + description: Not Implemented. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/claim-dialects' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + post: + tags: + - Claim dialects + summary: Add a claim dialect. + description: Add a new claim dialect.

    Scope(Permission) required:``internal_claim_meta_create`` + operationId: addClaimDialect + requestBody: + description: claim dialect to add. + content: + application/json: + schema: + $ref: '#/components/schemas/ClaimDialectReq' + required: false + responses: + 201: + description: Item Created. + headers: + Location: + description: URI of the created resource. + schema: + type: string + content: {} + 400: + description: Invalid input request. + content: + '*/*': + schema: + $ref: '#/components/schemas/Error' + 401: + description: Unauthorized. + content: {} + 403: + description: Resource Forbidden. + content: {} + 409: + description: Element Already Exists. + content: + '*/*': + schema: + $ref: '#/components/schemas/Error' + 500: + description: Internal Server Error. + content: + '*/*': + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/claim-dialects' \ + -H 'accept: */*' \ + -H 'Authorization: Bearer {bearer_token}' \ + -H 'Content-Type: application/json' \ + -d '{ + "dialectURI": "urn:ietf:params:scim:schemas:core:2.0:User" + }' + x-codegen-request-body-name: claimDialect + /claim-dialects/{dialect-id}: + get: + tags: + - Claim dialects + summary: Retrieve a claim dialect. + description: Retrieve a claim dialect matching the given dialect id.

    Scope(Permission) required: ``internal_claim_meta_view`` + operationId: getClaimDialect + parameters: + - name: dialect-id + in: path + description: Id of the claim dialect. + required: true + schema: + type: string + responses: + 200: + description: Requested claim dialect. + content: + application/json: + schema: + $ref: '#/components/schemas/ClaimDialectRes' + 400: + description: Invalid input request. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 401: + description: Unauthorized. + content: {} + 403: + description: Resource Forbidden. + content: {} + 404: + description: The specified resource is not found. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 500: + description: Internal Server Error. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/claim-dialects/{dialect-id}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + put: + tags: + - Claim dialects + summary: Update a claim dialect. + description: Update a claim dialect.

    Scope(Permission) required:``internal_claim_meta_update`` + operationId: updateClaimDialect + parameters: + - name: dialect-id + in: path + description: Id of the claim dialect. + required: true + schema: + type: string + requestBody: + description: Updated claim dialect. + content: + application/json: + schema: + $ref: '#/components/schemas/ClaimDialectReq' + required: false + responses: + 200: + description: OK. + content: {} + 400: + description: Invalid input request. + content: + '*/*': + schema: + $ref: '#/components/schemas/Error' + 401: + description: Unauthorized. + content: {} + 403: + description: Resource Forbidden. + content: {} + 500: + description: Internal Server Error. + content: + '*/*': + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PUT' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/claim-dialects/{dialect-id}' \ + -H 'accept: */*' \ + -H 'Authorization: Bearer {bearer_token}' \ + -H 'Content-Type: application/json' \ + -d '{ + "dialectURI": "urn:ietf:params:scim:schemas:core:2.0:User" + }' + x-codegen-request-body-name: claimDialect + delete: + tags: + - Claim dialects + summary: Delete a claim dialect. + description: Delete a claim dialect by claim ID.

    Scope(Permission) required: ``internal_claim_meta_delete`` + operationId: deleteClaimDialect + parameters: + - name: dialect-id + in: path + description: Id of the claim dialect. + required: true + schema: + type: string + responses: + 204: + description: No Content. + content: {} + 400: + description: Invalid input request. + content: + '*/*': + schema: + $ref: '#/components/schemas/Error' + 401: + description: Unauthorized. + content: {} + 403: + description: Resource Forbidden. + content: {} + 500: + description: Internal Server Error. + content: + '*/*': + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'DELETE' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/claim-dialects/{dialect-id}' \ + -H 'accept: */*' \ + -H 'Authorization: Bearer {bearer_token}' + + /claim-dialects/{dialect-id}/claims: + get: + tags: + - Claims (external) + summary: Retrieve external claims. + description: Retrieve External claims.

    Scope(Permission) required: ``internal_claim_meta_view`` + operationId: getExternalClaims + parameters: + - name: dialect-id + in: path + description: Id of the claim dialect. + required: true + schema: + type: string + - name: limit + in: query + description: Maximum number of records to return.
    This option is not yet supported. + schema: + type: integer + format: int32 + - name: offset + in: query + description: Number of records to skip for pagination.
    This option is not yet supported. + schema: + type: integer + format: int32 + - name: filter + in: query + description: Condition to filter the retrieval of records.
    This option is not yet supported. + schema: + type: string + - name: sort + in: query + description: Define the order by which the retrieved records should be sorted.
    This option is not yet supported. + schema: + type: string + responses: + 200: + description: External claims. + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/ExternalClaimRes' + 401: + description: Unauthorized. + content: {} + 404: + description: The specified resource is not found. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 500: + description: Internal Server Error. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 501: + description: Not Implemented. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/claim-dialects/{dialect-id}/export' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + + post: + tags: + - Claims (External) + summary: Add an external claim. + description: Add a new external claim.

    Scope(Permission) required: ``internal_claim_meta_create`` + operationId: addExternalClaim + parameters: + - name: dialect-id + in: path + description: Id of the claim dialect. + required: true + schema: + type: string + requestBody: + description: External claim to add. + content: + application/json: + schema: + $ref: '#/components/schemas/ExternalClaimReq' + required: false + responses: + 201: + description: Item Created. + headers: + Location: + description: URI of the created resource. + schema: + type: string + content: {} + 400: + description: Invalid input request. + content: + '*/*': + schema: + $ref: '#/components/schemas/Error' + 401: + description: Unauthorized. + content: {} + 403: + description: Resource Forbidden. + content: {} + 404: + description: The specified resource is not found. + content: + '*/*': + schema: + $ref: '#/components/schemas/Error' + 409: + description: Element Already Exists. + content: + '*/*': + schema: + $ref: '#/components/schemas/Error' + 500: + description: Internal Server Error. + content: + '*/*': + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/claim-dialects/{dialect-id}/claims' \ + -H 'accept: */*' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "claimURI": "urn:ietf:params:scim:schemas:core:2.0:User:userName", + "mappedLocalClaimURI": "http://wso2.org/claims/username" + }' + x-codegen-request-body-name: externalClaim + /claim-dialects/{dialect-id}/claims/{claim-id}: + get: + tags: + - Claims (External) + summary: Retrieve an external claim. + description: Retrieve an external claim matching the given dialect ID and claim + ID.

    Scope(Permission) required: ``internal_claim_meta_view`` + operationId: getExternalClaim + parameters: + - name: dialect-id + in: path + description: Id of the claim dialect. + required: true + schema: + type: string + - name: claim-id + in: path + description: Id of the claim. + required: true + schema: + type: string + responses: + 200: + description: Requested claim. + content: + application/json: + schema: + $ref: '#/components/schemas/ExternalClaimRes' + 400: + description: Invalid input request. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 401: + description: Unauthorized. + content: {} + 403: + description: Resource Forbidden. + content: {} + 404: + description: The specified resource is not found. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 500: + description: Internal Server Error. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/claim-dialects/{dialect-id}/claims/{claim-id}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + + put: + tags: + - Claims (External) + summary: Update an external claim. + description: Update an external claim.

    Scope(Permission) required: ``internal_claim_meta_update`` + operationId: updateExternalClaim + parameters: + - name: dialect-id + in: path + description: Id of the claim dialect. + required: true + schema: + type: string + - name: claim-id + in: path + description: Id of the claim. + required: true + schema: + type: string + requestBody: + description: Updated external claim. + content: + application/json: + schema: + $ref: '#/components/schemas/ExternalClaimReq' + required: false + responses: + 200: + description: OK. + content: {} + 400: + description: Invalid input request. + content: + '*/*': + schema: + $ref: '#/components/schemas/Error' + 401: + description: Unauthorized. + content: {} + 403: + description: Resource Forbidden. + content: {} + 409: + description: Element Already Exists. + content: + '*/*': + schema: + $ref: '#/components/schemas/Error' + 500: + description: Internal Server Error. + content: + '*/*': + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PUT' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/claim-dialects/{dialect-id}/claims/{claim-id}' \ + -H 'accept: */*' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "claimURI": "urn:ietf:params:scim:schemas:core:2.0:User:userName", + "mappedLocalClaimURI": "http://wso2.org/claims/username" + }' + + x-codegen-request-body-name: externalClaim + delete: + tags: + - Claims (External) + summary: Delete an external claim. + description: Delete a claim by dialect ID and claim ID.

    Scope(Permission) required: ``internal_claim_meta_delete`` + operationId: deleteExternalClaim + parameters: + - name: dialect-id + in: path + description: Id of the claim dialect. + required: true + schema: + type: string + - name: claim-id + in: path + description: Id of the claim. + required: true + schema: + type: string + responses: + 204: + description: No Content. + content: {} + 400: + description: Invalid input request. + content: + '*/*': + schema: + $ref: '#/components/schemas/Error' + 401: + description: Unauthorized. + content: {} + 403: + description: Resource Forbidden. + content: {} + 500: + description: Internal Server Error. + content: + '*/*': + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'DELETE' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/claim-dialects/{dialect-id}/claims/{claim-id}' \ + -H 'accept: */*' \ + -H 'Authorization: Bearer {bearer_token}' + + /claim-dialects/{dialect-id}/export: + get: + tags: + - Claim dialects + summary: Export a claim dialect with claims. + description: Retrieve a claim dialect for a given dialect ID along with all + related claims as a XML, YAML, or JSON file. +

    Scope(Permission) required: ``internal_claim_meta_view`` + operationId: exportClaimDialectToFile + parameters: + - $ref: '#/components/parameters/dialectIdPathParam' + - $ref: '#/components/parameters/fileTypeHeaderParam' + responses: + '200': + description: Successful response + content: + application/json: + schema: + type: string + example: 'Sample claim dialect configurations in the requested format' + application/xml: + schema: + type: string + example: 'Sample claim dialect configurations in the requested format' + application/yaml: + schema: + type: string + example: 'Sample claim dialect configurations in the requested format' + '400': + $ref: '#/components/responses/InvalidInput' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/claim-dialects/{dialect-id}/export' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + + /claim-dialects/import: + put: + tags: + - Claim dialects + summary: Update a claim dialect with claims. + description: Update a claim dialect and all related claims from a file + in XML, YAML, or JSON format. +

    Scope(Permission) required: ``internal_claim_meta_create`` + operationId: updateClaimDialectFromFile + parameters: + - $ref: '#/components/parameters/preserveClaimsParam' + requestBody: + content: + multipart/form-data: + schema: + $ref: '#/components/schemas/FileUpload' + responses: + '201': + $ref: '#/components/responses/Created' + '400': + $ref: '#/components/responses/InvalidInput' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PUT' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/claim-dialects/import?preserveClaims=false' \ + -H 'accept: */*' \ + -H 'Content-Type: multipart/form-data' \ + -H 'Authorization: Bearer {bearer_token}' + + post: + tags: + - Claim dialects + summary: Import an external claim dialect with claims. + description: Import a external claim dialect with related claims from a file + in XML, YAML, or JSON format.
    + Scope(Permission) required: ``internal_claim_meta_create`` + operationId: importClaimDialectFromFile + requestBody: + required: true + content: + multipart/form-data: + schema: + $ref: '#/components/schemas/FileUpload' + responses: + '201': + $ref: '#/components/responses/Created' + '400': + $ref: '#/components/responses/InvalidInput' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/claim-dialects/import' \ + -H 'accept: */*' \ + -H 'Content-Type: multipart/form-data' \ + -H 'Authorization: Bearer {bearer_token}' +components: + schemas: + LocalClaimReq: + required: + - attributeMapping + - claimURI + - description + - displayName + type: object + properties: + claimURI: + type: string + description: A unique URI specific to the claim. + example: http://wso2.org/claims/username + description: + type: string + description: Description of the claim. + example: Some description about the claim. + displayOrder: + type: integer + description: The order in which the claim is displayed among other claims + under the same dialect. + example: 10 + displayName: + type: string + description: Name of the claim to be displayed in the UI. + example: Username + readOnly: + type: boolean + description: Specifies if the claim is read-only. + example: true + regEx: + type: string + description: Regular expression used to validate inputs. + example: ^([a-zA-Z)$ + required: + type: boolean + description: Specifies if the claim is required for user registration. + example: true + supportedByDefault: + type: boolean + description: Specifies if the claim will be prompted during user registration + and displayed on the user profile. + example: true + dataType: + type: string + description: The data type of the attribute. + enum: + - string + - boolean + - date_time + - integer + - complex + - decimal + example: string + subAttributes: + type: array + description: The sub attributes of the complex attribute. + items: + type: string + example: ["http://wso2.org/claims/manager.role", "http://wso2.org/claims/manager.department"] + canonicalValues: + type: array + description: The possible values for the attribute. + items: + $ref: '#/components/schemas/LabelValue' + multiValued: + type: boolean + description: Specifies if the claim can hold multiple values or not. + example: true + uniquenessScope: + type: string + description: Specifies the scope of uniqueness validation for the claim value. + enum: + - NONE + - WITHIN_USERSTORE + - ACROSS_USERSTORES + example: "NONE" + sharedProfileValueResolvingMethod: + type: string + description: Specifies claim value resolving method for shared user profile. + enum: + - FromOrigin + - FromSharedProfile + - FromFirstFoundInHierarchy + example: "FromOrigin" + attributeMapping: + type: array + description: Userstore attribute mappings. + items: + $ref: '#/components/schemas/AttributeMapping' + properties: + type: array + description: Define any additional properties if required. + items: + $ref: '#/components/schemas/Property' + description: Local claim request. + LocalClaimRes: + type: object + properties: + id: + type: string + description: claim ID. + example: 394b8adcce24c64a8a09a8d80abf8c337bd253de + claimURI: + type: string + description: A unique URI specific to the claim. + example: http://wso2.org/claims/username + dialectURI: + type: string + description: URI of the claim dialect. + example: http://wso2.org/claims + description: + type: string + description: Description of the claim. + example: Some description about the claim. + displayOrder: + type: integer + description: The order in which the claim is displayed among other claims + under the same dialect. + example: 10 + displayName: + type: string + description: Name of the claim to be displayed in the UI. + example: Username + readOnly: + type: boolean + description: Specifies if the claim is read-only. + example: true + regEx: + type: string + description: Regular expression used to validate inputs. + example: ^([a-zA-Z)$ + required: + type: boolean + description: Specifies if the claim is required for user registration. + example: true + supportedByDefault: + type: boolean + description: Specifies if the claim will be prompted during user registration + and displayed on the user profile. + example: true + dataType: + type: string + description: The data type of the attribute. + enum: + - string + - boolean + - date_time + - integer + - complex + - decimal + example: string + subAttributes: + type: array + description: The sub attributes of the complex attribute. + items: + type: string + example: ["http://wso2.org/claims/manager.role", "http://wso2.org/claims/manager.department"] + canonicalValues: + type: array + description: The possible values for the attribute. + items: + $ref: '#/components/schemas/LabelValue' + example: [{"label": "Admin", "value": "admin"}, {"label": "User", "value": "user"}] + multiValued: + type: boolean + description: Specifies if the claim can hold multiple values or not. + example: true + inputFormat: + $ref: '#/components/schemas/InputFormat' + uniquenessScope: + type: string + description: Specifies the scope of uniqueness validation for the claim value. + enum: + - NONE + - WITHIN_USERSTORE + - ACROSS_USERSTORES + example: "NONE" + sharedProfileValueResolvingMethod: + type: string + description: Specifies claim value resolving method for shared user profile. + enum: + - FromOrigin + - FromSharedProfile + - FromFirstFoundInHierarchy + example: "FromOrigin" + attributeMapping: + type: array + description: Userstore attribute mappings. + items: + $ref: '#/components/schemas/AttributeMapping' + properties: + type: array + description: Define any additional properties if required. + items: + $ref: '#/components/schemas/Property' + description: Local claim response. + AttributeMapping: + required: + - mappedAttribute + - userstore + type: object + properties: + mappedAttribute: + type: string + description: Userstore attribute to be mapped to. + example: username + userstore: + type: string + description: Userstore domain name. + example: SECONDARY + description: Claim userstore attribute mapping. + ClaimDialectReq: + required: + - dialectURI + type: object + properties: + dialectURI: + type: string + description: URI of the claim dialect. + example: urn:ietf:params:scim:schemas:core:2.0:User + description: Claim dialect request. + ClaimDialectRes: + type: object + properties: + id: + type: string + description: Dialect id. + example: 394b8adcce24c64a8a09a0d80abf8c337bd253de + dialectURI: + type: string + description: URI of the claim dialect. + example: urn:ietf:params:scim:schemas:core:2.0:User + link: + $ref: '#/components/schemas/Link' + description: Claim dialect response. + ExternalClaimReq: + required: + - claimURI + - mappedLocalClaimURI + type: object + properties: + claimURI: + type: string + description: Claim URI of the external claim. + example: urn:ietf:params:scim:schemas:core:2.0:User:userName + mappedLocalClaimURI: + type: string + description: The local claim URI to map with the external claim. + example: http://wso2.org/claims/username + description: External claim request. + ExternalClaimRes: + type: object + properties: + id: + type: string + description: External claim ID. + example: 394b8adcce24c64a8a09a0d80abf8c337dd255de + claimURI: + type: string + description: Claim URI of the external claim. + example: ' urn:ietf:params:scim:schemas:core:2.0:User:userName' + claimDialectURI: + type: string + description: Dialect URI of the external claim. + example: urn:ietf:params:scim:schemas:core:2.0:User + mappedLocalClaimURI: + type: string + description: The local claim URI to map with the external claim. + example: http://wso2.org/claims/username + description: External claim response. + Property: + required: + - key + - value + type: object + properties: + key: + type: string + value: + type: string + Link: + type: object + properties: + href: + type: string + description: Relative path to the target resource. + example: 394b8adcce24c64a8a09a8d80abf8c337bd253de/claims + rel: + type: string + description: Describes how the current context is related to the target + resource. + example: claims + LabelValue: + type: object + required: + - label + - value + properties: + label: + type: string + description: The display name shown to the user. + example: Work Account + value: + type: string + description: The internal value used in processing. + example: WorkAccount + example: + label: Work Account + value: WorkAccount + InputFormat: + type: object + description: The input formatting of the attribute. + properties: + inputType: + type: string + description: Type of the input format (e.g., dropdown, checkbox, etc.) + example: dropdown + example: + inputType: dropdown + Error: + required: + - code + - message + type: object + properties: + code: + type: string + example: AAA-00000 + message: + type: string + example: Some Error Message + description: + type: string + example: Some Error Description + traceId: + type: string + example: e0fbcfeb-3617-43c4-8dd0-7b7d38e13047 + FileUpload: + type: object + properties: + file: + type: string + format: binary + description: This file represents the claim dialect. + responses: + Conflict: + description: Element Already Exists. + content: + '*/*': + schema: + $ref: '#/components/schemas/Error' + Created: + description: Item Created. + headers: + Location: + description: URI of the created resource. + schema: + type: string + content: {} + Forbidden: + description: Resource Forbidden. + content: {} + InvalidInput: + description: Invalid input request. + content: + '*/*': + schema: + $ref: '#/components/schemas/Error' + NoContent: + description: No Content. + content: {} + NotFound: + description: The specified resource is not found. + content: + '*/*': + schema: + $ref: '#/components/schemas/Error' + NotImplemented: + description: Not Implemented. + content: + '*/*': + schema: + $ref: '#/components/schemas/Error' + OK: + description: OK. + content: {} + ServerError: + description: Internal Server Error. + content: + '*/*': + schema: + $ref: '#/components/schemas/Error' + Unauthorized: + description: Unauthorized. + content: {} + parameters: + limitQueryParam: + name: limit + in: query + description: Maximum number of records to return. + schema: + type: integer + format: int32 + offsetQueryParam: + name: offset + in: query + description: Number of records to skip for pagination. + schema: + type: integer + format: int32 + filterQueryParam: + name: filter + in: query + description: Condition to filter the retrieval of records. + schema: + type: string + sortQueryParam: + name: sort + in: query + description: Define the order by which the retrieved records should be sorted. + schema: + type: string + attributesQueryParam: + name: attributes + in: query + description: Define only the required attributes to be sent in the response + object. + schema: + type: string + dialectIdPathParam: + name: dialect-id + in: path + description: Id of the claim dialect. + required: true + schema: + type: string + claimIdPathParam: + name: claim-id + in: path + description: Id of the claim. + required: true + schema: + type: string + fileTypeHeaderParam: + name: Accept + in: header + description: Content type of the file. + required: false + schema: + type: string + default: application/yaml + enum: + - application/json + - application/xml + - application/yaml + - application/x-yaml + - text/yaml + - text/xml + - text/json + preserveClaimsParam: + name: preserveClaims + in: query + description: Specify whether to merge and preserve the claims or completely replace the existing claims set. + required: false + schema: + type: boolean + default: false + securitySchemes: + OAuth2: + type: oauth2 + flows: + authorizationCode: + authorizationUrl: 'https://api.asgardeo.io/t/{organization-name}/oauth2/authorize' + tokenUrl: 'https://api.asgardeo.io/t/{organization-name}/oauth2/token' + scopes: {} diff --git a/docusaurus-asgardeo/static/apis/restapis/authenticators.yaml b/docusaurus-asgardeo/static/apis/restapis/authenticators.yaml new file mode 100644 index 0000000000..601dc6eabe --- /dev/null +++ b/docusaurus-asgardeo/static/apis/restapis/authenticators.yaml @@ -0,0 +1,616 @@ +openapi: 3.0.0 +info: + version: "v1" + title: 'Authenticators API' + description: 'This document specifies a **Authenticators RESTful API** for Asgardeo' + +servers: + - url: 'https://api.asgardeo.io/t/{organization-name}/api/server/v1' +security: + - OAuth2: [] + +paths: + /authenticators: + get: + tags: + - Authenticators + summary: List all authenticators in the server + description: | + List all authenticators in the server. + + Scope(Permission) required: `internal_authenticator_view` + parameters: + - $ref: '#/components/parameters/filterQueryParam' + - $ref: '#/components/parameters/limitQueryParam' + - $ref: '#/components/parameters/offsetQueryParam' + responses: + '200': + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/Authenticators' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + '501': + $ref: '#/components/responses/NotImplemented' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/authenticators' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer-token}' + /authenticators/{authenticator-id}/connected-apps: + get: + tags: + - Connected apps of local authenticators + summary: Get connected apps by authenticator ID + operationId: getConnectedAppsOfLocalAuthenticator + description: | + By passing in the appropriate authenticator ID, you can retrieve connected app details. + + Scope(Permission) required: `internal_authenticator_view` + parameters: + - $ref: '#/components/parameters/limitQueryParam' + - $ref: '#/components/parameters/offsetQueryParam' + - name: authenticator-id + in: path + description: ID of an authenticator + required: true + schema: + type: string + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectedApps' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/authenticators/meta/tags' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer-token}' + /authenticators/meta/tags: + get: + tags: + - Authenticators + summary: List all authenticator tags + description: | + List all authenticator tags. + + Scope(Permission) required: `internal_authenticator_view` + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Tags' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/authenticators/{authenticator-id}/connected-apps' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer-token}' + /authenticators/custom: + post: + tags: + - User defined local authenticators + summary: | + Create a new user defined local authenticator. + description: | + This API provides the capability to create a new user defined local authenticator. + + Scope(Permission) required: `internal_custom_authenticator_create` + responses: + '201': + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/Authenticator' + examples: + example: + $ref: '#/components/examples/UserDefinedAuthenticatorExample' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/UserDefinedLocalAuthenticatorCreation' + description: This represents the user defined local authenticator to be created. + required: true + /authenticators/custom/{authenticator-id}: + put: + tags: + - User defined local authenticators + summary: | + Update a user defined local authenticator. + description: | + This API provides the capability to update the user defined local authenticator configurations.
    + + Scope(Permission) required: `internal_custom_authenticator_update` + parameters: + - name: authenticator-id + in: path + description: ID of an authenticator + required: true + schema: + type: string + responses: + '200': + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/Authenticator' + examples: + example: + $ref: '#/components/examples/UserDefinedAuthenticatorExample' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/UserDefinedLocalAuthenticatorUpdate' + description: This represents the user defined local authenticator to be created. + required: true + delete: + tags: + - User defined local authenticators + summary: | + Delete a user defined local authenticator. + description: | + This API provides the capability to delete a user defined local authenticator. + + Scope(Permission) required: `internal_custom_authenticator_delete` + operationId: deleteUserDefinedLocalAuthenticator + parameters: + - name: authenticator-id + in: path + description: ID of an authenticator + required: true + schema: + type: string + responses: + '204': + description: Successful response + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + +components: + parameters: + filterQueryParam: + in: query + name: filter + required: false + description: | + Condition to filter the retrieval of records. + Only supports filtering based on the 'tag' and 'name' attribute. + For local authenticators and request path authenticators, the 'displayName' is considered as the 'name' attribute during filtering. + The 'name' attribute only supports 'eq' and 'sw operations. Filtering with multiple 'name' attributes is not supported. + The 'tag' attribute only supports 'eq' operation. Filtering with multiple 'tag' attributes is supported with only 'or' as the complex query operation. + E.g. /configs/authenticators?filter=name+sw+fi+and+(tag+eq+2FA+or+tag+eq+MFA) + + schema: + type: string + limitQueryParam: + in: query + name: limit + description: > + Maximum number of records to return. _This option is not yet + supported._ + schema: + type: integer + format: int32 + minimum: 0 + offsetQueryParam: + in: query + name: offset + description: > + Number of records to skip for pagination. _This option is not yet + supported._ + schema: + type: integer + format: int32 + minimum: 0 + schemas: + Error: + type: object + required: + - code + - message + properties: + code: + type: string + example: AUT-00000 + description: An error code. + message: + type: string + example: Some Error Message + description: An error message. + description: + type: string + example: Some Error Description + description: An error description. + traceId: + type: string + example: e0fbcfeb-3617-43c4-8dd0-7b7d38e13047 + description: An error trace identifier. + Tags: + type: array + description: The list of tags available for authenticators. + items: + type: string + example: [2FA, MFA] + Authenticators: + type: array + items: + $ref: '#/components/schemas/Authenticator' + Authenticator: + type: object + properties: + id: + type: string + example: QmFzaWNBdXRoZW50aWNhdG9y + readOnly: true + name: + type: string + example: BasicAuthenticator + displayName: + type: string + example: basic + isEnabled: + type: boolean + example: true + definedBy: + type: string + enum: + - SYSTEM + - USER + readOnly: true + type: + type: string + enum: + - LOCAL + - FEDERATED + readOnly: true + image: + type: string + example: basic-authenticator-logo-url + description: + type: string + example: The basic authenticator. + tags: + type: array + items: + type: string + example: [2FA, MFA] + readOnly: true + self: + type: string + example: /t/{organization-name}/api/server/v1/configs/authenticators/eDUwOUNlcnRpZmljYXRlQXV0aGVudGljYXRvcg + UserDefinedLocalAuthenticatorCreation: + description: This represents the configuration for creating a user defined local authenticator. + type: object + properties: + name: + type: string + description: The name of the user defined local authenticator. It must be started with 'custom-'. + example: custom-authenticator + id: + type: string + example: Y3VzdG9tLWF1dGhlbnRpY2F0b3I + displayName: + type: string + example: Custom Local Authenticator + isEnabled: + type: boolean + example: true + authenticationType: + type: string + enum: + - IDENTIFICATION + - VERIFICATION + image: + type: string + example: https://custom-authenticator-logo-url + description: + type: string + example: The user defined custom local authenticator. + endpoint: + $ref: '#/components/schemas/Endpoint' + required: + - name + - displayName + - isEnabled + - endpoint + UserDefinedLocalAuthenticatorUpdate: + description: This represents the configuration for updating a user defined local authenticator. + type: object + properties: + displayName: + type: string + example: Custom Local Authenticator + isEnabled: + type: boolean + example: true + image: + type: string + example: https://custom-authenticator-logo-url-new + description: + type: string + example: The user defined custom local authenticator. + endpoint: + $ref: '#/components/schemas/Endpoint' + required: + - displayName + - isEnabled + - endpoint + Endpoint: + type: object + properties: + uri: + type: string + example: https://abc.com/token + pattern: '^https?://.+' + authentication: + $ref: '#/components/schemas/AuthenticationType' + allowedHeaders: + type: array + description: List of HTTP headers to forward to the extension. + items: + type: string + example: [ "x-geo-location", "host"] + allowedParameters: + type: array + description: List of parameters to forward to the extension. + items: + type: string + example: [ "device-id"] + AuthenticationType: + type: object + description: > + The type of authentication required by the action's endpoint. The following options are supported: + + - NONE: No authentication is required.
    + ``{ + "type": "NONE" + }`` + + - BASIC: Basic authentication with a username and password.
    + ``{ + "type": "BASIC", + "properties": { + "username": "auth_username", + "password": "auth_password" + } + }`` + + - API_KEY: API key-based authentication, where the key is provided in an HTTP header.
    + ``{ + "type": "API_KEY", + "properties": { + "header": "X-API-Key", + "value": "12345-abcde-67890" + } + }`` + + - BEARER: Bearer token-based authentication.
    + ``{ + "type": "BEARER", + "properties": { + "accessToken": "0d6fed02-eac0-332b-8998-213a543139a0" + } + }`` + required: + - type + - properties + properties: + type: + type: string + enum: + - NONE + - BEARER + - API_KEY + - BASIC + example: BASIC + properties: + type: object + additionalProperties: true + example: + username: "auth_username" + password: "auth_password" + ConnectedApps: + type: object + properties: + totalResults: + type: integer + example: 10 + startIndex: + type: integer + example: 1 + count: + type: integer + example: 10 + links: + type: array + items: + $ref: '#/components/schemas/Link' + example: + [ + { + "href": "authenticator/123e4567-e89b-12d3-a456-556642440000/connected-apps?offset=50&limit=10", + "rel": "next" + }, { + "href": "authenticator/provider/123e4567-e89b-12d3-a456-556642440000/connected-apps?offset=30&limit=10", + "rel": "previous" + } + ] + connectedApps: + type: array + items: + $ref: '#/components/schemas/ConnectedApp' + ConnectedApp: + type: object + properties: + appId: + type: string + example: app-id + self: + type: string + example: /t/org/api/server/v1/applications/c74d74b2-cb62-4abd-ad66-6c45daeb561c + Link: + type: object + properties: + href: + type: string + description: Path to the target resource. + example: >- + '/t/{organization-name}/api/server/v1/authenticators/394b8adcce24c64a8a09a8d80abf8c337bd253de' + rel: + type: string + description: Describes how the current context is related to the target resource. + example: authenticators + readOnly: true + #----------------------------------------------------- + # Descriptions of Authenticators API responses. + #----------------------------------------------------- + responses: + BadRequest: + description: Invalid input in the request. + content: + 'application/json': + schema: + $ref: '#/components/schemas/Error' + NotFound: + description: Requested resource is not found. + content: + 'application/json': + schema: + $ref: '#/components/schemas/Error' + Unauthorized: + description: Authentication information is missing or invalid. + Forbidden: + description: Access forbidden. + ServerError: + description: Internal server error. + content: + 'application/json': + schema: + $ref: '#/components/schemas/Error' + NotImplemented: + description: Not Implemented. + content: + 'application/json': + schema: + $ref: '#/components/schemas/Error' + #----------------------------------------------------- + # Applicable authentication mechanisms. + #----------------------------------------------------- + securitySchemes: + OAuth2: + type: oauth2 + flows: + authorizationCode: + authorizationUrl: 'https://api.asgardeo.io/t/{organization-name}/oauth2/authorize' + tokenUrl: 'https://api.asgardeo.io/t/{organization-name}/oauth2/token' + scopes: {} + examples: + UserDefinedAuthenticatorExample: + summary: "Response for user defined authenticator" + value: + id: "Y3VzdG9tLWF1dGhlbnRpY2F0b3I" + name: "custom-authenticator" + displayName: "Custom Local Authenticator" + definedBy: "USER" + type: "LOCAL" + isEnabled: true + tags: [ Custom ] + self: "/t/{organization-name}/api/server/v1/configs/authenticators/Y3VzdG9tLWF1dGhlbnRpY2F0b3I=" diff --git a/docusaurus-asgardeo/static/apis/restapis/backup-code.yaml b/docusaurus-asgardeo/static/apis/restapis/backup-code.yaml new file mode 100644 index 0000000000..3367993c32 --- /dev/null +++ b/docusaurus-asgardeo/static/apis/restapis/backup-code.yaml @@ -0,0 +1,158 @@ +openapi: 3.0.0 + +info: + description: | + This is the RESTful API for a user to manage backup codes in Asgardeo. + version: "v1" + title: "Asgardeo - Backup Code API Definition" +servers: +- url: https://api.asgardeo.io/t/{organization-name}/api/users/v1 + +security: + - OAuth2: [] + +tags: + - name: me + description: Operations for the authenticated user. + +paths: + /me/backup-codes: + post: + description: + "This API is used to generate backup codes.\n\nScope required:``internal_login``" + summary: | + Generate backup codes + responses: + 201: + description: Created + content: + application/json: + schema: + $ref: '#/components/schemas/BackupCodeResponse' + 401: + description: Unauthorized + 500: + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{organization-name}/api/users/v1/me/backup-codes' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '' + tags: + - me + get: + tags: + - me + summary: Retrieve remaining backup codes count + description: + "This API is used to retrieve the count of remaining backup codes of the authenticated user.\n\nScope required:``internal_login``" + responses: + 200: + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/RemainingBackupCodeResponse' + 401: + description: Unauthorized + 500: + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/users/v1/me/backup-codes' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + delete: + tags: + - me + summary: Delete backup codes + description: + "This API is used to delete backup codes of the authenticated user.\n\nScope required:``internal_login``" + responses: + 204: + description: Backup codes deleted successfully. + 401: + description: Unauthorized + 500: + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'DELETE' \ + 'https://api.asgardeo.io/t/{organization-name}/api/users/v1/me/backup-codes' \ + -H 'accept: */*' \ + -H 'Authorization: Bearer {bearer_token}' +components: + schemas: + Error: + type: object + description: Backup code error. + required: + - code + - message + - traceId + properties: + code: + type: string + example: "some_error_code" + description: Error code. + message: + type: string + example: "Some Error Message" + description: Error message. + description: + type: string + example: "Some Error Description" + description: Error description. + traceId: + type: string + example: "Some Correlation for Error Instance" + description: Error trace id. + #----------------------------------------------------- + # Backup code Response object + #----------------------------------------------------- + BackupCodeResponse: + type: object + description: Backup code response. + properties: + backupCodes: + type: array + description: Backup codes of the authenticated user. + items: + type: string + example: 123456 + + RemainingBackupCodeResponse: + type: object + description: Remaining backup code response. + properties: + remainingBackupCodesCount: + description: Remaining backup codes of the authenticated user. + type: integer + example: 4 + + securitySchemes: + OAuth2: + type: oauth2 + description: "You can use the following OAuth grant type to securely access the respective API endpoints. + \n\n **Authorization Code OAuth Flow** + \n\n Authorization URL: 'https://api.asgardeo.io/t/{org-name}/oauth2/authorize' + \n\n This flow type is used for the ```me``` endpoint of backup-codes APIs. You can use the following scope for this endpoints. + \n\n - ```internal_login```: Grant permission for an authenticated user for self management." \ No newline at end of file diff --git a/docusaurus-asgardeo/static/apis/restapis/branding-preference.yaml b/docusaurus-asgardeo/static/apis/restapis/branding-preference.yaml new file mode 100644 index 0000000000..eb53930b86 --- /dev/null +++ b/docusaurus-asgardeo/static/apis/restapis/branding-preference.yaml @@ -0,0 +1,716 @@ +openapi: 3.0.0 +info: + title: Asgardeo - Branding Preferences API + description: >- + This is the RESTful API to manage Branding Preferences of root organizations in Asgardeo. + version: v1 +servers: + - url: 'https://api.asgardeo.io/t/{organization-name}/api/server/v1' + +security: + - OAuth2: [] + +paths: + '/branding-preference': + get: + tags: + - Branding Preference + operationId: getBrandingPreference + summary: Get branding preference of a tenant. + description: | + This API provides the capability to retrieve the branding preference of a tenant/specific application.
    + If there is no branding preference available for the requested locale, API will check for the default locale('en-US') and return it.
    + If there is no branding preference available for the requested application, API will check for the tenant's branding preference and return it.
    + + Scope(Permission) required: None + parameters: + - $ref: '#/components/parameters/typeQueryParam' + - $ref: '#/components/parameters/nameQueryParam' + - $ref: '#/components/parameters/localeQueryParam' + responses: + '200': + description: OK + content: + 'application/json': + schema: + $ref: '#/components/schemas/BrandingPreferenceModel' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/branding-preference?type=ORG&name=WSO2&locale=en-US' \ + -H 'accept: application/json' + post: + tags: + - Branding Preference + operationId: addBrandingPreference + summary: Add branding preferences for a tenant. + description: | + This API provides the capability to add a custom branding preference for a tenant/application.
    + Currently this API provides the capability to only configure tenant wise branding preference for 'en-US' locale.
    + + Scope(Permission) required: `internal_branding_preference_update` + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/BrandingPreferenceModel' + description: This represents the branding preferences to be added. + required: true + responses: + '201': + description: Successfully created. + content: + application/json: + schema: + $ref: '#/components/schemas/BrandingPreferenceModel' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + "409": + $ref: '#/components/responses/Conflict' + '500': + $ref: '#/components/responses/ServerError' + '501': + $ref: '#/components/responses/NotImplemented' + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/branding-preference' \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "type": "ORG", + "name": "WSO2", + "locale": "en-US", + "preference": { + "organizationDetails": { + "displayName": "Ballerina.io", + "siteTitle": "Login - Ballerina", + "copyrightText": "© 2021 WSO2", + "supportEmail": "support@ballerina.io" + }, + "images": { + "logo": { + "imgURL": "https://ballerina.io/img/ballerina-logo.svg", + "altText": "Ballerina.io Logo" + }, + "favicon": { + "imgURL": "https://central.ballerina.io/favicon.ico" + } + }, + "urls": { + "privacyPolicyURL": "https://ballerina.io/privacy-policy", + "termsOfUseURL": "https://ballerina.io/terms-of-service/", + "cookiePolicyURL": "https://ballerina.io/privacy-policy/#cookie-policy" + }, + "stylesheets": { + "accountApp": "https://firebasestorage.googleapis.com/v0/b/asgardeo-branding.appspot.com/o/ballerina%2Flogin-portal.overrides.css?alt=media&token=0315462e-534e-4f33-83f9-e4c092d0273d", + "myAccountApp": "https://asgardeo-branding/user-portal.css" + }, + "configs": { + "isBrandingEnabled": true, + "removeDefaultBranding": false, + "selfSignUpEnabled": true + } + } + }' + put: + tags: + - Branding Preference + operationId: updateBrandingPreference + summary: Update branding preferences of a tenant. + description: | + This API provides the capability to update the branding preference of a tenant/application.
    + + Scope(Permission) required: `internal_branding_preference_update` + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/BrandingPreferenceModel' + description: This represents the branding preferences to be updated. + required: true + responses: + '200' : + description: Successfully updated + content: + application/json: + schema: + $ref: '#/components/schemas/BrandingPreferenceModel' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PUT' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/branding-preference' \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "type": "ORG", + "name": "WSO2", + "locale": "en-US", + "preference": { + "organizationDetails": { + "displayName": "Ballerina.io", + "siteTitle": "Login - Ballerina", + "copyrightText": "© 2021 WSO2", + "supportEmail": "support@ballerina.io" + }, + "images": { + "logo": { + "imgURL": "https://ballerina.io/img/ballerina-logo.svg", + "altText": "Ballerina.io Logo" + }, + "favicon": { + "imgURL": "https://central.ballerina.io/favicon.ico" + } + }, + "urls": { + "privacyPolicyURL": "https://ballerina.io/privacy-policy", + "termsOfUseURL": "https://ballerina.io/terms-of-service/", + "cookiePolicyURL": "https://ballerina.io/privacy-policy/#cookie-policy" + }, + "stylesheets": { + "accountApp": "https://firebasestorage.googleapis.com/v0/b/asgardeo-branding.appspot.com/o/ballerina%2Flogin-portal.overrides.css?alt=media&token=0315462e-534e-4f33-83f9-e4c092d0273d", + "myAccountApp": "https://asgardeo-branding/user-portal.css" + }, + "configs": { + "isBrandingEnabled": true, + "removeDefaultBranding": false, + "selfSignUpEnabled": true + } + } + }' + delete: + tags: + - Branding Preference + operationId: deleteBrandingPreference + summary: Deletes branding preferences of a tenant. + description: | + This API provides the capability to delete the branding preferences of a tenant/application.
    + + Scope(Permission) required: `internal_branding_preference_update` + parameters: + - $ref: '#/components/parameters/typeQueryParam' + - $ref: '#/components/parameters/nameQueryParam' + - $ref: '#/components/parameters/localeQueryParam' + responses: + '204' : + description: Successfully deleted. + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X 'DELETE' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/branding-preference?type=ORG&name=WSO2&locale=en-US' \ + -H 'accept: */*' + '/branding-preference/resolve': + get: + tags: + - Branding Preference + operationId: resolveBrandingPreference + summary: Resolve branding preference of an organization. + description: | + This API provides the capability to retrieve the branding preference of an organization/specific application.
    + If there is no branding preference available for the requested locale, API will check for the default locale('en-US') and return it.
    + If there is no branding preference available for the requested application, API will check for the organization's branding preference and return it.
    + + Scope(Permission) required: None + parameters: + - $ref: '#/components/parameters/typeQueryParam' + - $ref: '#/components/parameters/nameQueryParam' + - $ref: '#/components/parameters/localeQueryParam' + - $ref: '#/components/parameters/restrictToPublishedQueryParam' + responses: + '200': + description: OK + content: + 'application/json': + schema: + $ref: '#/components/schemas/BrandingPreferenceModel' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/branding-preference/resolve?type=ORG&name=WSO2&locale=en-US' \ + -H 'accept: application/json' + '/branding-preference/text': + get: + tags: + - Custom Text + operationId: getCustomText + summary: Get Custom text of a tenant. + description: | + This API provides the capability to retrieve the existing custom text configurations of a tenant for the specified screen and locale.
    + If there is no custom texts available for the requested locale, API will check for the default locale('en-US') and return it.
    + + Scope(Permission) required: None + parameters: + - $ref: '#/components/parameters/typeQueryParam' + - $ref: '#/components/parameters/nameQueryParam' + - $ref: '#/components/parameters/localeQueryParam' + - $ref: '#/components/parameters/screenQueryParam' + responses: + '200': + description: OK + content: + 'application/json': + schema: + $ref: '#/components/schemas/CustomTextModel' + '400': + $ref: '#/components/responses/BadRequest' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/branding-preference/text?type=ORG&name=WSO2&locale=en-US&screen=login' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + post: + tags: + - Custom Text + operationId: addCustomText + summary: Add custom text for a tenant. + description: | + This API provides the capability to add custom texts for the specified screen & locale.
    + + Scope(Permission) required: `internal_branding_preference_update` + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/CustomTextModel' + description: This represents the custom text to be added. + required: true + responses: + '201': + description: Successfully created. + content: + application/json: + schema: + $ref: '#/components/schemas/CustomTextModel' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + "409": + $ref: '#/components/responses/Conflict' + '500': + $ref: '#/components/responses/ServerError' + '501': + $ref: '#/components/responses/NotImplemented' + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/branding-preference/text' \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + -d '{ + "type": "ORG", + "name": "WSO2", + "locale": "en-US", + "screen": "login", + "preference": { + "login": "Sign In", + "welcome": "Welcome", + "account.linking": "Account Linking", + "username": "Username", + "email.username": "Email address", + "back.to.sign.in": "Back to Sign In", + "or": "Or", + "dont.have.an.account": "Don'\''t have an account?" + } + }' \ + -H 'Authorization: Bearer {bearer_token}' + put: + tags: + - Custom Text + operationId: updateCustomText + summary: Update custom text of a tenant. + description: | + This API provides the capability to update the custom texts for the specified screen & locale.
    + + Scope(Permission) required: `internal_branding_preference_update` + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/CustomTextModel' + description: This represents the custom text content to be updated for the specified screen & locale. + required: true + responses: + '200' : + description: Successfully updated + content: + application/json: + schema: + $ref: '#/components/schemas/CustomTextModel' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PUT' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/branding-preference/text' \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + -d '{ + "type": "ORG", + "name": "WSO2", + "locale": "en-US", + "screen": "login", + "preference": { + "login": "Sign In", + "welcome": "Welcome", + "account.linking": "Account Linking", + "username": "Username", + "email.username": "Email address", + "back.to.sign.in": "Back to Sign In", + "or": "Or", + "dont.have.an.account": "Don'\''t have an account?" + } + }' \ + -H 'Authorization: Bearer {bearer_token}' + delete: + tags: + - Custom Text + operationId: deleteCustomText + summary: Deletes custom text. + description: | + This API provides the capability to delete the custom texts for the specified screen & locale of a tenant.
    + If no query parameter was specified in the delete request, all the custom texts configured in the tenant will be deleted.
    + + Scope(Permission) required: `internal_branding_preference_update` + parameters: + - $ref: '#/components/parameters/typeQueryParam' + - $ref: '#/components/parameters/nameQueryParam' + - $ref: '#/components/parameters/localeQueryParam' + - $ref: '#/components/parameters/screenQueryParam' + responses: + '204' : + description: Successfully deleted. + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X 'DELETE' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/branding-preference/text?type=ORG&name=WSO2&locale=en-US&screen=login' \ + -H 'accept: */*' \ + -H 'Authorization: Bearer {bearer_token}' + '/branding-preference/text/resolve': + get: + tags: + - Custom Text + operationId: resolveCustomText + summary: Resolve custom text of an organization. + description: | + This API provides the capability to retrieve the custom text configurations of an organization/specific application.
    + If there is no custom text available for the requested locale, API will check for the default locale('en-US') and return it.
    + If there is no custom text available for the requested organization, API will check for the parent organization's custom text configurations and return it.
    + + Scope(Permission) required: None + parameters: + - $ref: '#/components/parameters/typeQueryParam' + - $ref: '#/components/parameters/nameQueryParam' + - $ref: '#/components/parameters/localeQueryParam' + - $ref: '#/components/parameters/screenQueryParam' + responses: + '200': + description: OK + content: + 'application/json': + schema: + $ref: '#/components/schemas/CustomTextModel' + '400': + $ref: '#/components/responses/BadRequest' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/branding-preference/text/resolve?type=ORG&name=WSO2&locale=en-US&screen=login' \ + -H 'accept: application/json' +components: + parameters: + typeQueryParam: + in: query + name: type + required: false + description: Type to filter the retrieval of customizations. + schema: + type: string + enum: + - ORG + - APP + - CUSTOM + example: "ORG" + nameQueryParam: + in: query + name: name + required: false + description: Tenant/Application name to filter the retrieval of customizations. + schema: + type: string + example: "WSO2" + localeQueryParam: + in: query + name: locale + required: false + description: Locale to filter the retrieval of customizations. + schema: + type: string + example: "en-US" + screenQueryParam: + in: query + name: screen + required: false + description: Screen to filter the retrieval of customizations. + schema: + type: string + example: "login" + restrictToPublishedQueryParam: + in: query + name: restrictToPublished + required: false + description: | + Specifies whether to limit resolving to published branding preferences. + If set to true, branding preference will be resolved only using published branding preferences. + If set to false, branding preference will be resolved using both published and unpublished branding preferences. + schema: + type: boolean + default: false + example: true + + schemas: + BrandingPreferenceModel: + required: + - type + - preference + type: object + properties: + type: + type: string + enum: + - ORG + - APP + - CUSTOM + example: "ORG" + name: + type: string + example: "WSO2" + locale: + type: string + example: "en-US" + default: "en-US" + preference: + type: object + description: "This is the JSON structured branding preference" + example: { + "organizationDetails": { + "displayName": "Ballerina.io", + "siteTitle": "Login - Ballerina", + "copyrightText": "© 2021 WSO2", + "supportEmail": "support@ballerina.io" + }, + "images": { + "logo": { + "imgURL": "https://ballerina.io/img/ballerina-logo.svg", + "altText": "Ballerina.io Logo" + }, + "favicon": { + "imgURL": "https://central.ballerina.io/favicon.ico" + } + }, + "urls": { + "privacyPolicyURL": "https://ballerina.io/privacy-policy", + "termsOfUseURL": "https://ballerina.io/terms-of-service/", + "cookiePolicyURL": "https://ballerina.io/privacy-policy/#cookie-policy" + }, + "stylesheets": { + "accountApp": "https://firebasestorage.googleapis.com/v0/b/asgardeo-branding.appspot.com/o/ballerina%2Flogin-portal.overrides.css?alt=media&token=0315462e-534e-4f33-83f9-e4c092d0273d", + "myAccountApp": "https://asgardeo-branding/user-portal.css" + }, + "configs": { + "isBrandingEnabled": true, + "removeDefaultBranding": false, + "selfSignUpEnabled": true + } + } + + CustomTextModel: + required: + - type + - screen + - preference + type: object + properties: + type: + type: string + enum: + - ORG + - APP + - CUSTOM + example: "ORG" + name: + type: string + example: "WSO2" + locale: + type: string + example: "en-US" + default: "en-US" + screen: + type: string + example: "login" + preference: + type: object + description: "This is the JSON structured branding preference" + example: { + "login": "Sign In", + "welcome": "Welcome", + "account.linking": "Account Linking", + "username": "Username", + "email.username": "Email address", + "back.to.sign.in": "Back to Sign In", + "or": "Or", + "dont.have.an.account": "Don't have an account?" + } + + Error: + type: object + required: + - code + - message + properties: + code: + type: string + example: BPM-60001 + message: + type: string + example: Some Error Message + description: + type: string + example: Some Error Description + traceId: + type: string + example: 3erfee-232-efewv-2321-43ferfe24r + + #----------------------------------------------------- + # Descriptions of Branding Preference API responses. + #----------------------------------------------------- + responses: + BadRequest: + description: Invalid input in the request. + content: + 'application/json': + schema: + $ref: '#/components/schemas/Error' + Unauthorized: + description: Authentication information is missing or invalid. + Forbidden: + description: Access forbidden. + NotFound: + description: Requested resource is not found. + content: + 'application/json': + schema: + $ref: '#/components/schemas/Error' + Conflict: + description: Conflict. + content: + 'application/json': + schema: + $ref: '#/components/schemas/Error' + ServerError: + description: Internal server error. + content: + 'application/json': + schema: + $ref: '#/components/schemas/Error' + NotImplemented: + description: Not Implemented. + content: + 'application/json': + schema: + $ref: '#/components/schemas/Error' + + #----------------------------------------------------- + # Applicable authentication mechanisms. + #----------------------------------------------------- + securitySchemes: + OAuth2: + type: oauth2 + flows: + authorizationCode: + authorizationUrl: 'https://api.asgardeo.io/t/{organization-name}/oauth2/authorize' + tokenUrl: 'https://api.asgardeo.io/t/{organization-name}/oauth2/token' + scopes: {} diff --git a/docusaurus-asgardeo/static/apis/restapis/consent-management.yaml b/docusaurus-asgardeo/static/apis/restapis/consent-management.yaml new file mode 100644 index 0000000000..2e2e5da4bb --- /dev/null +++ b/docusaurus-asgardeo/static/apis/restapis/consent-management.yaml @@ -0,0 +1,1561 @@ +openapi: 3.0.1 +info: + title: 'Asgardeo Consent Management Rest API ' + description: | + This document specifies a **Consent Management RESTfulAPI** for Asgardeo. + version: 1.0.0 +servers: +- url: https://api.asgardeo.io/t/{organization-name}/api/identity/consent-mgt/v1.0 +paths: + /consents: + get: + tags: + - Consent + summary: | + List Consents + description: | + This API is used to list consent elements based on the filtered attributes. + parameters: + - name: limit + in: query + description: Number of search results + schema: + type: integer + - name: offset + in: query + description: Start index of the search + schema: + type: integer + - name: piiPrincipalId + in: query + description: Subject identifier + schema: + type: string + - name: spTenantDomain + in: query + description: Service provider tenant domain + schema: + type: string + - name: service + in: query + description: Service name + schema: + type: string + - name: state + in: query + description: State (ACTIVE/REVOKED) + schema: + type: string + responses: + 200: + description: OK + headers: + Location: + description: Location to retireve the consent element to. + schema: + type: string + content: + application/json: + schema: + $ref: '#/components/schemas/ConsentResponse' + 400: + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 401: + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 500: + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/identity/consent-mgt/v1.0/consents' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + x-wso2-request: | + curl -k -X GET "https://api.asgardeo.io/t/{organization-name}/api/identity/consent-mgt/v1.0/consents?limit=&offset=&piiPrincipalId=&spTenantDomain=&service=*&state=" -H "Authorization: Basic " -H "accept: application/json" + x-wso2-curl: | + curl -k -X GET "https://api.asgardeo.io/t/{organization-name}/api/identity/consent-mgt/v1.0/consents?limit=10&offset=0&piiPrincipalId=testuser&spTenantDomain=carbon.super&service=foo*&state=ACTIVE" -H "Authorization: Basic YWRtaW46YWRtaW4=" -H "accept: application/json" + x-wso2-response: | + [{"consentReceiptID":"7a6886ab-b02f-424f-9cd4-adf5e92f0798","language":"EN","piiPrincipalId":"testuser","tenantDomain":"carbon.super","state":"ACTIVE"}] + post: + tags: + - Consent + summary: | + Add consent + description: | + This API is used to store consent information given by the user. + requestBody: + description: This represents the consent element that needs to be stored. + content: + application/json: + schema: + $ref: '#/components/schemas/ConsentRequest' + required: true + responses: + 201: + description: Successful response + headers: + Location: + description: Location of the newly created consent. + schema: + type: string + content: + application/json: + schema: + $ref: '#/components/schemas/ConsentAddResponse' + 400: + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 401: + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 409: + description: Conflict + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 500: + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{organization-name}/api/identity/consent-mgt/v1.0/consents' \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "services": [ + { + "service": "string", + "serviceDisplayName": "string", + "serviceDescription": "string", + "tenantDomain": "string", + "purposes": [ + { + "purposeId": 0, + "purposeCategoryId": [ + 0 + ], + "consentType": "string", + "piiCategory": [ + { + "piiCategoryId": 0, + "validity": "string" + } + ], + "primaryPurpose": true, + "termination": "string", + "thirdPartyDisclosure": true, + "thirdPartyName": "string" + } + ] + } + ], + "collectionMethod": "string", + "jurisdiction": "string", + "language": "string", + "policyURL": "string", + "properties": [ + { + "key": "string", + "value": "string" + } + ] + }' + x-wso2-request: | + curl -k -X POST "https://api.asgardeo.io/t/{organization-name}/api/identity/consent-mgt/v1.0/consents" -H "Authorization: Basic " -H "accept: application/json" -H "Content-Type: application/json" -d "{\"services\": [ { \"service\": \"\", \"tenantDomain\": \"\", \"purposes\": [ { \"purposeId\": , \"purposeCategoryId\": [ ], \"consentType\": \"\", \"piiCategory\": [ { \"piiCategoryId\": , \"validity\": \"days:\" }, { \"piiCategoryId\": , \"validity\": \"days:\" } ], \"primaryPurpose\": true, \"termination\": \"days:\", \"thirdPartyDisclosure\": false, \"thirdPartyName\": \"\" } ] } ], \"collectionMethod\": \"\", \"jurisdiction\": \"\", \"language\": \"\", \"policyURL\": \"", \"properties\": [ { \"key\": \"\", \"value\": \"v1\" } ]}" + x-wso2-curl: | + curl -k -X POST "https://api.asgardeo.io/t/{organization-name}/api/identity/consent-mgt/v1.0/consents" -H "Authorization: Basic YWRtaW46YWRtaW4=" -H "accept: application/json" -H "Content-Type: application/json" -d "{\"services\": [ { \"service\": \"foo-service\", \"tenantDomain\": \"carbon.super\", \"purposes\": [ { \"purposeId\": 1, \"purposeCategoryId\": [ 1 ], \"consentType\": \"EXPLICIT\", \"piiCategory\": [ { \"piiCategoryId\": 1, \"validity\": \"days:30\" }, { \"piiCategoryId\": 2, \"validity\": \"days:30\" } ], \"primaryPurpose\": true, \"termination\": \"days:30\", \"thirdPartyDisclosure\": false, \"thirdPartyName\": \"\" } ] } ], \"collectionMethod\": \"Sign-Up\", \"jurisdiction\": \"CA\", \"language\": \"EN\", \"policyURL\": \"https://foo.com/privacy\", \"properties\": [ { \"key\": \"k1\", \"value\": \"v1\" } ]}" + x-wso2-response: | + {"consentReceiptId":"38279263-f385-4252-8966-40998faa95ae","collectionMethod":"Sign-Up","language":"EN","piiPrincipalId":"admin","tenantDomain":"carbon.super"} + x-codegen-request-body-name: consent + /consents/receipts/{receiptId}: + get: + tags: + - Consent + summary: | + Retrieve a consent receipt + description: | + This API is used to retrieve consent using the conset receipt ID. + parameters: + - name: receiptId + in: path + description: The unique identifier of a receipt + required: true + schema: + type: string + responses: + 200: + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/ConsentReceipt' + 400: + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 401: + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 404: + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 500: + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/identity/consent-mgt/v1.0/consents/receipts/{receipt-id}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + x-wso2-request: | + curl -k -X GET "https://api.asgardeo.io/t/{organization-name}/api/identity/consent-mgt/v1.0/consents/receipts/" -H "Authorization: Basic " -H "accept: application/json" + x-wso2-curl: | + curl -k -X GET "https://api.asgardeo.io/t/{organization-name}/api/identity/consent-mgt/v1.0/consents/receipts/7a6886ab-b02f-424f-9cd4-adf5e92f0798" -H "Authorization: Basic YWRtaW46YWRtaW4=" -H "accept: application/json" + x-wso2-response: | + {"version":"KI-CR-v1.1.0","jurisdiction":"CA","consentTimestamp":1517742624682,"collectionMethod":"Sign-Up","consentReceiptID":"7a6886ab-b02f-424f-9cd4-adf5e92f0798","publicKey":null,"language":"EN","piiPrincipalId":"testuser","tenantDomain":"carbon.super","state":"ACTIVE","piiControllers":[{"piiController":"sample","contact":"sample","address":{"addressCountry":"USA","addressLocality":"Mountain View","addressRegion":"CA","postOfficeBoxNumber":"233","postalCode":"94043","streetAddress":"1600 Amphitheatre Pkwy"},"email":"sample@abc.com","phone":"+01433444333","onBehalf":false,"piiControllerUrl":"https://sample.piicontroller.url"}],"policyUrl":"https://foo.com/privacy","services":[{"service":"foo-service","tenantDomain":"carbon.super","purposes":[{"purpose":"Contact","purposeCategory":["Legal"],"consentType":"EXPLICIT","piiCategory":[{"piiCategory":"email","validity":"days:30"},{"piiCategory":"username","validity":"days:30"}],"primaryPurpose":true,"termination":"days:30","thirdPartyDisclosure":false,"thirdPartyName":""}]}],"sensitive":false,"spiCat":null} + delete: + tags: + - Consent + summary: | + Revoke consent + description: | + This API is used to revoke consent. + parameters: + - name: receiptId + in: path + description: This represents the Revoke Receipt ID. + required: true + schema: + type: string + responses: + 200: + description: OK + content: {} + 400: + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 401: + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 404: + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 500: + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'DELETE' \ + 'https://api.asgardeo.io/t/{organization-name}/api/identity/consent-mgt/v1.0/consents/receipts/{receipt-id}' \ + -H 'accept: */*' \ + -H 'Authorization: Bearer {bearer_token}' + x-wso2-request: | + curl -k -X DELETE "https://api.asgardeo.io/t/{organization-name}/api/identity/consent-mgt/v1.0/consents/receipts/" -H "Authorization: Basic " -H "accept: application/json" + x-wso2-curl: | + curl -k -X DELETE "https://api.asgardeo.io/t/{organization-name}/api/identity/consent-mgt/v1.0/consents/receipts/7a6886ab-b02f-424f-9cd4-adf5e92f0798" -H "Authorization: Basic YWRtaW46YWRtaW4=" -H "accept: application/json" + x-wso2-response: | + "HTTP/1.1 200 Ok" + /consents/purposes: + get: + tags: + - Purpose + summary: | + Retrieve all purposes + description: | + This API is used to retrieve all purposes. + parameters: + - name: group + in: query + description: Purpose group + schema: + type: string + - name: groupType + in: query + description: Type of the purpose group + schema: + type: string + - name: limit + in: query + description: Number of search results + schema: + type: integer + - name: offset + in: query + description: Start index of the search + schema: + type: integer + responses: + 200: + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/purposes' + 400: + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 401: + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 404: + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 500: + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/identity/consent-mgt/v1.0/consents/purposes' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + x-wso2-request: | + curl -k -X GET "https://api.asgardeo.io/t/{organization-name}/api/identity/consent-mgt/v1.0/consents/purposes?group=&groupType=limit=&offset=" -H "Authorization: Basic " -H "accept: application/json" -H "Content-Type: application/json" + x-wso2-curl: | + curl -k -X GET "https://api.asgardeo.io/t/{organization-name}/api/identity/consent-mgt/v1.0/consents/purposes?group=SIGNUP&groupType=SYSTEM&limit=10&offset=0" -H "Authorization: Basic YWRtaW46YWRtaW4=" -H "accept: application/json" -H "Content-Type: application/json" + x-wso2-response: | + [{"purposeId":1,"purpose":"Contact","description":"Contact the user","piiCategories":[]},{"purposeId":2,"purpose":"Marketing","description":"Sending marketing materials"}] +# post: +# tags: +# - Purpose +# summary: | +# Add purpose +# description: | +# This API is used to add a new purpose for consent management. +# requestBody: +# description: This represents the purpose element that needs to be stored. +# content: +# application/json: +# schema: +# $ref: '#/components/schemas/PurposeRequest' +# required: true +# responses: +# 201: +# description: Successful response +# headers: +# Location: +# description: Location of the newly created purpose. +# schema: +# type: string +# content: +# application/json: +# schema: +# $ref: '#/components/schemas/purposeGetResponse' +# 400: +# description: Bad Request +# content: +# application/json: +# schema: +# $ref: '#/components/schemas/Error' +# 401: +# description: Unauthorized +# content: +# application/json: +# schema: +# $ref: '#/components/schemas/Error' +# 409: +# description: Conflict +# content: +# application/json: +# schema: +# $ref: '#/components/schemas/Error' +# 500: +# description: Server Error +# content: +# application/json: +# schema: +# $ref: '#/components/schemas/Error' +# x-wso2-request: | +# curl -k -X POST "https://api.asgardeo.io/t/{organization-name}/api/identity/consent-mgt/v1.0/consents/purposes" -H "Authorization: Basic " -H "accept: application/json" -H "Content-Type: application/json" -d "{ \"purpose\": \"\", \"description\": \"\", \"group\": \"\", \"groupType\": \", \"mandatory\": }]}" +# x-wso2-curl: | +# curl -k -X POST "https://api.asgardeo.io/t/{organization-name}/api/identity/consent-mgt/v1.0/consents/purposes" -H "Authorization: Basic YWRtaW46YWRtaW4=" -H "accept: application/json" -H "Content-Type: application/json" -d "{ \"purpose\": \"Contact\", \"description\": \"Contact the user\", \"group\": \"SIGNIN\", \"groupType\": \"SYSTEM\", "piiCategories\": {\"piiCategoryId\": 1, \"mandatory\": true}}" +# x-wso2-response: | +# {"purposeId":1,"purpose":"Contact","description":"Contact the user","piiCategories":[{"piiCategoryId":1,"piiCategory":"email","description":"user email","sensitive":false, "mandatory":true},{"piiCategoryId":2,"piiCategory":"username","description":"user name","sensitive":false, "mandatory":false}]} +# x-codegen-request-body-name: purpose + /consents/purposes/{purposeId}: + get: + tags: + - Purpose + summary: | + Retrieve a purpose + description: | + This API is used to retrieve a specific purpose using the purpose ID. + parameters: + - name: purposeId + in: path + description: Id of the purpose + required: true + schema: + type: string + responses: + 200: + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/purposeGetResponse' + 400: + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 401: + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 404: + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 500: + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/identity/consent-mgt/v1.0/consents/purposes/{purpose-id}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + x-wso2-request: | + curl -k -X GET "https://api.asgardeo.io/t/{organization-name}/api/identity/consent-mgt/v1.0/consents/purposes/" -H "Authorization: Basic " -H "accept: application/json" -H "Content-Type: application/json" + x-wso2-curl: | + curl -k -X GET "https://api.asgardeo.io/t/{organization-name}/api/identity/consent-mgt/v1.0/consents/purposes/1" -H "Authorization: Basic YWRtaW46YWRtaW4=" -H "accept: application/json" -H "Content-Type: application/json" + x-wso2-response: | + {"purposeId":1,"purpose":"Contact","description":"Contact the user","piiCategories":[{"piiCategoryId":1,"piiCategory":"email","description":"user email","sensitive":false},{"piiCategoryId":2,"piiCategory":"username","description":"user name","sensitive":false, "mandatory":false}]} +# delete: +# tags: +# - Purpose +# summary: | +# Delete a purpose +# description: | +# This API is used to delete a purpose. +# parameters: +# - name: purposeId +# in: path +# description: Unique ID of the purpose +# required: true +# schema: +# type: string +# responses: +# 200: +# description: OK +# content: {} +# 400: +# description: Bad Request +# content: +# application/json: +# schema: +# $ref: '#/components/schemas/Error' +# 401: +# description: Unauthorized +# content: +# application/json: +# schema: +# $ref: '#/components/schemas/Error' +# 404: +# description: Not Found +# content: +# application/json: +# schema: +# $ref: '#/components/schemas/Error' +# 500: +# description: Server Error +# content: +# application/json: +# schema: +# $ref: '#/components/schemas/Error' +# x-wso2-request: | +# curl -k -X DELETE "https://api.asgardeo.io/t/{organization-name}/api/identity/consent-mgt/v1.0/consents/purposes/" -H "Authorization: Basic " -H "accept: application/json" +# x-wso2-curl: | +# curl -k -X DELETE "https://api.asgardeo.io/t/{organization-name}/api/identity/consent-mgt/v1.0/consents/purposes/1" -H "Authorization: Basic YWRtaW46YWRtaW4=" -H "accept: application/json" +# x-wso2-response: | +# "HTTP/1.1 200 Ok" + /consents/purpose-categories: + get: + tags: + - Purpose Category + summary: | + Retrieve all purpose categories + description: | + This API is used to retrieve all purpose categories. + parameters: + - name: limit + in: query + description: Number of search results + schema: + type: integer + - name: offset + in: query + description: Start index of the search + schema: + type: integer + responses: + 200: + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/purpseCategories' + 400: + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 401: + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 404: + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 500: + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/identity/consent-mgt/v1.0/consents/purpose-categories' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + x-wso2-request: | + curl -k -X GET "https://api.asgardeo.io/t/{organization-name}/api/identity/consent-mgt/v1.0/consents/purpose-categories?limit=&offset=" -H "Authorization: Basic " -H "accept: application/json" + x-wso2-curl: | + curl -k -X GET "https://api.asgardeo.io/t/{organization-name}/api/identity/consent-mgt/v1.0/consents/purpose-categories?limit=10&offset=0" -H "Authorization: Basic YWRtaW46YWRtaW4=" -H "accept: application/json" + x-wso2-response: | + [{"purposeCategoryId":1,"purposeCategory":"Marketing","description":"For marketing related activities"},{"purposeCategoryId":2,"purposeCategory":"Legal","description":"For legal requirements"}] +# post: +# tags: +# - Purpose Category +# summary: | +# Add purpose category +# description: | +# This API is used to add a new purpose category for consent management. +# requestBody: +# description: This represents the purpose category name. +# content: +# application/json: +# schema: +# $ref: '#/components/schemas/PurposeCategoryRequest' +# required: true +# responses: +# 201: +# description: Successful response +# headers: +# Location: +# description: Location of the newly created purpose category. +# schema: +# type: string +# content: +# application/json: +# schema: +# $ref: '#/components/schemas/purposeCategoryListResponse' +# 400: +# description: Bad Request +# content: +# application/json: +# schema: +# $ref: '#/components/schemas/Error' +# 401: +# description: Unauthorized +# content: +# application/json: +# schema: +# $ref: '#/components/schemas/Error' +# 409: +# description: Conflict +# content: +# application/json: +# schema: +# $ref: '#/components/schemas/Error' +# 500: +# description: Server Error +# content: +# application/json: +# schema: +# $ref: '#/components/schemas/Error' +# x-wso2-request: | +# curl -k -X POST "https://api.asgardeo.io/t/{organization-name}/api/identity/consent-mgt/v1.0/consents/purpose-categories" -H "Authorization: Basic " -H "accept: application/json" -H "Content-Type: application/json" -d "{ \"purposeCategory\": \"\", \"description\": \"\"}" +# x-wso2-curl: | +# curl -k -X POST "https://api.asgardeo.io/t/{organization-name}/api/identity/consent-mgt/v1.0/consents/purpose-categories" -H "Authorization: Basic YWRtaW46YWRtaW4=" -H "accept: application/json" -H "Content-Type: application/json" -d "{ \"purposeCategory\": \"Marketing\", \"description\": \"For marketing related activities\"}" +# x-wso2-response: | +# {"purposeCategoryId":1,"purposeCategory":"Marketing","description":"For marketing related activities"} +# x-codegen-request-body-name: purposeCategory + /consents/purpose-categories/{purposeCategoryId}: + get: + tags: + - Purpose Category + summary: | + Retrieve a purpose category + description: | + This API is used to retrieve a purpose category using the purpose category ID. + parameters: + - name: purposeCategoryId + in: path + description: Unique ID of the purpose category + required: true + schema: + type: string + responses: + 200: + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/purposeCategoryListResponse' + 400: + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 401: + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 404: + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 500: + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/identity/consent-mgt/v1.0/consents/purpose-categories/{purpose-category-id}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + x-wso2-request: | + curl -k -X GET "https://api.asgardeo.io/t/{organization-name}/api/identity/consent-mgt/v1.0/consents/purpose-categories/" -H "Authorization: Basic " -H "accept: application/json" + x-wso2-curl: | + curl -k -X GET "https://api.asgardeo.io/t/{organization-name}/api/identity/consent-mgt/v1.0/consents/purpose-categories/1" -H "Authorization: Basic YWRtaW46YWRtaW4=" -H "accept: application/json" + x-wso2-response: | + {"purposeCategoryId":1,"purposeCategory":"Marketing","description":"For marketing related activities"} +# delete: +# tags: +# - Purpose Category +# summary: | +# Delete purpose category +# description: | +# This API is used to delete a purpose category. +# parameters: +# - name: purposeCategoryId +# in: path +# description: Unique ID of the purpose category +# required: true +# schema: +# type: string +# responses: +# 200: +# description: OK +# content: {} +# 400: +# description: Bad Request +# content: +# application/json: +# schema: +# $ref: '#/components/schemas/Error' +# 401: +# description: Unauthorized +# content: +# application/json: +# schema: +# $ref: '#/components/schemas/Error' +# 404: +# description: Not Found +# content: +# application/json: +# schema: +# $ref: '#/components/schemas/Error' +# 500: +# description: Server Error +# content: +# application/json: +# schema: +# $ref: '#/components/schemas/Error' +# x-wso2-request: | +# curl -k -X DELETE "https://api.asgardeo.io/t/{organization-name}/api/identity/consent-mgt/v1.0/consents/purpose-categories/" -H "Authorization: Basic " -H "accept: application/json" +# x-wso2-curl: | +# curl -k -X DELETE "https://api.asgardeo.io/t/{organization-name}/api/identity/consent-mgt/v1.0/consents/purpose-categories/1" -H "Authorization: Basic YWRtaW46YWRtaW4=" -H "accept: application/json" +# x-wso2-response: | +# "HTTP/1.1 200 Ok" + /consents/pii-categories: + get: + tags: + - PII Category + summary: | + Retrieve all PII categories + description: | + This API is used to retrieve all PII categories. + parameters: + - name: limit + in: query + description: Number of search results + schema: + type: integer + - name: offset + in: query + description: Start index of the search + schema: + type: integer + responses: + 200: + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/piiCategories' + 400: + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 401: + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 404: + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 500: + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/identity/consent-mgt/v1.0/consents/pii-categories' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + x-wso2-request: | + curl -k -X GET "https://api.asgardeo.io/t/{organization-name}/api/identity/consent-mgt/v1.0/consents/pii-categories?limit=&offset=" -H "Authorization: Basic " -H "accept: application/json" + x-wso2-curl: | + curl -k -X GET "https://api.asgardeo.io/t/{organization-name}/api/identity/consent-mgt/v1.0/consents/pii-categories?limit=10&offset=0" -H "Authorization: Basic YWRtaW46YWRtaW4=" -H "accept: application/json" + x-wso2-response: | + [{"piiCategoryId":1,"piiCategory":"email","description":"user email","sensitive":false},{"piiCategoryId":2, "piiCategory":"username","description":"user name","sensitive":false}] +# post: +# tags: +# - PII Category +# summary: | +# Add PII category +# description: | +# This API is used to add a new PII category for consent management. +# requestBody: +# description: This represents the PII catogory name. +# content: +# application/json: +# schema: +# $ref: '#/components/schemas/PIIcategoryRequest' +# required: true +# responses: +# 201: +# description: Successful response +# headers: +# Location: +# description: Location of the newly created PII category +# schema: +# type: string +# content: +# application/json: +# schema: +# $ref: '#/components/schemas/piiCategoryListResponse' +# 400: +# description: Bad Request +# content: +# application/json: +# schema: +# $ref: '#/components/schemas/Error' +# 401: +# description: Unauthorized +# content: +# application/json: +# schema: +# $ref: '#/components/schemas/Error' +# 409: +# description: Conflict +# content: +# application/json: +# schema: +# $ref: '#/components/schemas/Error' +# 500: +# description: Server Error +# content: +# application/json: +# schema: +# $ref: '#/components/schemas/Error' +# x-wso2-request: | +# curl -k -X POST "https://api.asgardeo.io/t/{organization-name}/api/identity/consent-mgt/v1.0/consents/pii-categories" -H "Authorization: Basic " -H "accept: application/json" -H "Content-Type: application/json" -d "{ \"\": }" +# x-wso2-curl: | +# curl -k -X POST "https://api.asgardeo.io/t/{organization-name}/api/identity/consent-mgt/v1.0/consents/pii-categories" -H "Authorization: Basic YWRtaW46YWRtaW4=" -H "accept: application/json" -H "Content-Type: application/json" -d "{ \"piiCategory\": \"email\", \"description\": \"user email\", \"sensitive\": false}" +# x-wso2-response: | +# {"piiCategoryId":1,"piiCategory":"email","description":"user email","sensitive":false} +# x-codegen-request-body-name: piiCategory + /consents/pii-categories/{piiCategoryId}: + get: + tags: + - PII Category + summary: | + Retrieve a PII category + description: | + This API is used to retrieve a specific PII category using the PII category ID. + parameters: + - name: piiCategoryId + in: path + description: Unique ID of the PII category + required: true + schema: + type: string + responses: + 200: + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/piiCategoryListResponse' + 400: + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 401: + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 404: + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 500: + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/identity/consent-mgt/v1.0/consents/pii-categories/{pii-category-id}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + x-wso2-request: | + curl -k -X GET "https://api.asgardeo.io/t/{organization-name}/api/identity/consent-mgt/v1.0/consents/pii-categories/" -H "Authorization: Basic " -H "accept: application/json" + x-wso2-curl: | + curl -k -X GET "https://api.asgardeo.io/t/{organization-name}/api/identity/consent-mgt/v1.0/consents/pii-categories/1" -H "Authorization: Basic YWRtaW46YWRtaW4=" -H "accept: application/json" + x-wso2-response: | + {"piiCategoryId":1,"piiCategory":"email","description":"user email","sensitive":false} +# delete: +# tags: +# - PII Category +# summary: | +# Delete PII category +# description: | +# This API is used to delete a PII category. +# parameters: +# - name: piiCategoryId +# in: path +# description: Unique ID of the PII category +# required: true +# schema: +# type: string +# responses: +# 200: +# description: OK +# content: {} +# 400: +# description: Bad Request +# content: +# application/json: +# schema: +# $ref: '#/components/schemas/Error' +# 401: +# description: Unauthorized +# content: +# application/json: +# schema: +# $ref: '#/components/schemas/Error' +# 404: +# description: Not Found +# content: +# application/json: +# schema: +# $ref: '#/components/schemas/Error' +# 500: +# description: Server Error +# content: +# application/json: +# schema: +# $ref: '#/components/schemas/Error' +# x-wso2-request: | +# curl -k -X DELETE "https://api.asgardeo.io/t/{organization-name}/api/identity/consent-mgt/v1.0/consents/pii-categories/" -H "Authorization: Basic " -H "accept: application/json" +# x-wso2-curl: | +# curl -k -X DELETE "https://api.asgardeo.io/t/{organization-name}/api/identity/consent-mgt/v1.0/consents/pii-categories/1" -H "Authorization: Basic YWRtaW46YWRtaW4=" -H "accept: application/json" +# x-wso2-response: | +# "HTTP/1.1 200 Ok" +components: + schemas: + Error: + type: object + properties: + code: + type: string + message: + type: string + description: + type: string + ConsentRequest: + type: object + properties: + services: + type: array + items: + $ref: '#/components/schemas/service' + collectionMethod: + type: string + jurisdiction: + type: string + language: + type: string + policyURL: + type: string + properties: + type: array + items: + $ref: '#/components/schemas/Property' + PurposeRequest: + required: + - purpose + type: object + properties: + purpose: + type: string + description: + type: string + group: + type: string + groupType: + type: string + piiCategories: + type: array + items: + $ref: '#/components/schemas/purposePiiCategoryRequest' + purposePiiCategoryRequest: + type: object + properties: + piiCategoryId: + type: integer + mandatory: + type: boolean + PIIcategoryRequest: + required: + - piiCategory + type: object + properties: + piiCategory: + type: string + description: + type: string + displayName: + type: string + sensitive: + type: boolean +# PurposeCategoryRequest: +# required: +# - purposeCategory +# type: object +# properties: +# purposeCategory: +# type: string +# description: +# type: string + purposes: + type: array + items: + $ref: '#/components/schemas/purposeListResponse' + purpseCategories: + type: array + items: + $ref: '#/components/schemas/purposeCategoryListResponse' + piiCategories: + type: array + items: + $ref: '#/components/schemas/piiCategoryListResponse' + Property: + type: object + properties: + key: + type: string + value: + type: string + ConsentAddResponse: + required: + - consentReceiptID + - piiPrincipalId + - tenantDomain + type: object + properties: + consentReceiptID: + type: string + language: + type: string + piiPrincipalId: + type: string + tenantDomain: + type: string + ConsentResponse: + required: + - consentReceiptID + - piiPrincipalId + - tenantDomain + type: object + properties: + consentReceiptID: + type: string + language: + type: string + piiPrincipalId: + type: string + tenantDomain: + type: string + state: + type: string + spDisplayName: + type: string + spDescription: + type: string + ConsentReceipt: + required: + - collectionMethod + - consentReceiptID + - consentTimestamp + - jurisdiction + - piiControllers + - piiPrincipalId + - policyUrl + - sensitive + - services + - spiCat + - version + type: object + properties: + version: + type: string + description: The version of this specification to which a receipt conforms. + The value MUST be “KI-CR-v1.1.0” for this version of the specification. + jurisdiction: + type: string + description: The jurisdiction(s) applicable to this transaction. + consentTimestamp: + type: integer + description: Date and time of the consent transaction. The JSON value is + expressed as the number of seconds since 1970-01-01 00:00:00 GMT + format: int64 + collectionMethod: + type: string + description: A description of the method by which consent was obtained. + consentReceiptID: + type: string + description: A unique number for each Consent Receipt. + publicKey: + type: string + description: The PII Controller’s public key. + language: + type: string + description: Language in which the consent was obtained as for ISO 639-1:2002 + [ISO 639]. + piiPrincipalId: + type: string + description: PII Principal-provided identifier. E.g., email address. + tenantDomain: + type: string + description: Tenant domain of the service (SP). + state: + type: string + description: Current state of the receipt. + piiControllers: + type: array + description: An array that contains one or more items where each item represents + one PII Controller. + items: + $ref: '#/components/schemas/piiController' + policyUrl: + type: string + description: A link to the PII Controller’s privacy statement/policy and + applicable terms of use in effect when the consent was obtained, and the + receipt was issued. + services: + type: array + description: An array that contains one or more items where each item represents + one Service. + items: + $ref: '#/components/schemas/serviceResponse' + sensitive: + type: boolean + description: Indicates whether the consent interaction contains PII that + is designated sensitive or not sensitive. + spiCat: + type: array + description: A listing of categories where PII data collected is sensitive. + items: + type: string + service: + type: object + properties: + service: + type: string + description: The service or group of services being provided for which PII + is collected. The name of the service for which consent for the collection, + use, and disclosure of PII is being provided. + serviceDisplayName: + type: string + description: display name of the service + serviceDescription: + type: string + description: Description about the service + tenantDomain: + type: string + description: Tenant domain of the SP + purposes: + type: array + items: + $ref: '#/components/schemas/purpose' + serviceResponse: + type: object + properties: + service: + type: string + description: The service or group of services being provided for which PII + is collected. The name of the service for which consent for the collection, + use, and disclosure of PII is being provided. + serviceDisplayName: + type: string + description: display name of the service + serviceDescription: + type: string + description: Description about the service + tenantDomain: + type: string + description: Tenant domain of the SP + purposes: + type: array + items: + $ref: '#/components/schemas/purposeResponse' + purpose: + required: + - purposeCategoryId + - termination + - thirdPartyDisclosure + - thirdPartyName + type: object + properties: + purposeId: + type: integer + description: A unique Id of purpose + purposeCategoryId: + type: array + description: The reason the PII Controller is collecting the PII. + items: + type: integer + consentType: + type: string + description: The type of the consent used by the PII Controller as their + authority to collect, use or disclose PII. + piiCategory: + type: array + description: A list of defined PII categories Ids. + items: + $ref: '#/components/schemas/piiCategoryList' + primaryPurpose: + type: boolean + description: Indicates if a purpose is part of the core service of the PII + Controller. Possible values are TRUE or FALSE. + termination: + type: string + description: Conditions for the termination of consent. Link to policy defining + how consent or purpose is terminated. + thirdPartyDisclosure: + type: boolean + description: Indicates if the PII Controller is disclosing PII to a third + party. Possible values are TRUE or FALSE. + thirdPartyName: + type: string + description: The name or names of the third party to which the PII Processor + may disclose the PII. + purposeResponse: + required: + - piiCategory + - purposeCategory + - termination + - thirdPartyDisclosure + - thirdPartyName + type: object + properties: + purpose: + type: string + description: A short, clear explanation of why the PII item is required. + purposeId: + type: integer + description: Id of the purpose. + purposeCategory: + type: array + description: The reason the PII Controller is collecting the PII. + items: + type: string + consentType: + type: string + description: The type of the consent used by the PII Controller as their + authority to collect, use or disclose PII. + piiCategory: + type: array + description: A list of defined PII categories Ids. PII Category should + reflect the category that will be shared as understood by the PII Principal. + items: + $ref: '#/components/schemas/piiCategoryNameList' + primaryPurpose: + type: boolean + description: Indicates if a purpose is part of the core service of the PII + Controller. Possible values are TRUE or FALSE. + termination: + type: string + description: Conditions for the termination of consent. Link to policy defining + how consent or purpose is terminated. + thirdPartyDisclosure: + type: boolean + description: Indicates if the PII Controller is disclosing PII to a third + party. Possible values are TRUE or FALSE. + thirdPartyName: + type: string + description: The name or names of the third party to which the PII Processor + may disclose the PII. + purposeListResponse: + type: object + properties: + purposeId: + type: integer + purpose: + type: string + description: + type: string + group: + type: string + groupType: + type: string + purposeGetResponse: + type: object + properties: + purposeId: + type: integer + purpose: + type: string + description: + type: string + group: + type: string + groupType: + type: string + piiCategories: + type: array + items: + $ref: '#/components/schemas/purposePiiCategoryListResponse' + purposeCategoryListResponse: + type: object + properties: + purposeCategoryId: + type: integer + purposeCategory: + type: string + description: + type: string + piiCategoryList: + type: object + properties: + piiCategoryId: + type: integer + validity: + type: string + piiCategoryNameList: + type: object + properties: + piiCategoryName: + type: string + piiCategoryId: + type: integer + validity: + type: string + piiCategoryDisplayName: + type: string + piiCategoryListResponse: + type: object + properties: + piiCategoryId: + type: integer + piiCategory: + type: string + description: + type: string + displayName: + type: string + sensitive: + type: boolean + purposePiiCategoryListResponse: + type: object + properties: + piiCategoryId: + type: integer + piiCategory: + type: string + description: + type: string + displayName: + type: string + sensitive: + type: boolean + mandatory: + type: boolean + address: + type: object + properties: + addressCountry: + type: string + addressLocality: + type: string + addressRegion: + type: string + postOfficeBoxNumber: + type: string + postalCode: + type: string + streetAddress: + type: string + description: The physical address of PII controller. Postal address for contacting + the PII Controller. This is compliant with the schema https://schema.org/PostalAddress. + piiController: + required: + - address + - contact + - email + - phone + - piiController + type: object + properties: + piiController: + type: string + description: Name of the first PII Controller who collects the data. This + entity is accountable for compliance with the management of PII. The PII + Controller determines the purpose(s) and type(s) of PII processing. + contact: + type: string + description: Contact name of the PII Controller. This field MUST contain + a non-empty string. + address: + $ref: '#/components/schemas/address' + email: + type: string + description: Contact email address of the PII Controller. The direct email + to contact the PII Controller regarding the consent or privacy contract. + phone: + type: string + description: Contact phone number of the PII Controller. The business phone + number to contact the PII Controller regarding the consent. + onBehalf: + type: boolean + description: A PII Processor acting on behalf of a PII Controller or PII + Processor. For example, a third-party analytics service would be a PII + Processor on behalf of the PII Controller, or a site operator acting on + behalf of the PII Controller. + piiControllerUrl: + type: string + description: A URL for contacting the PII Controller. + parameters: + receiptId: + name: receiptId + in: path + description: The unique identifier of a receipt + required: true + schema: + type: string + limit: + name: limit + in: query + description: Number of search results + schema: + type: integer + offset: + name: offset + in: query + description: Start index of the search + schema: + type: integer + service: + name: service + in: query + description: Service name + schema: + type: string + state: + name: state + in: query + description: State (ACTIVE/REVOKED) + schema: + type: string + spTenantDomain: + name: spTenantDomain + in: query + description: Service provider tenant domain + schema: + type: string + piiPrincipalId: + name: piiPrincipalId + in: query + description: Subject identifier + schema: + type: string + consentIdQuery: + name: consent-id + in: query + description: The unique identifier of a consent + schema: + type: string + collectionMethod: + name: collectionMethod + in: query + description: Collection method of the consent + schema: + type: string + piiCategoryId: + name: piiCategoryId + in: query + description: ID of PII Category that will be shared as understood by the PII + Principal + schema: + type: string + next: + name: next + in: query + description: Next result set + schema: + type: string + previous: + name: previous + in: query + description: Previous result set + schema: + type: string + group: + name: group + in: query + description: Purpose group + schema: + type: string + groupType: + name: groupType + in: query + description: Type of the purpose group + schema: + type: string \ No newline at end of file diff --git a/docusaurus-asgardeo/static/apis/restapis/email-template.yaml b/docusaurus-asgardeo/static/apis/restapis/email-template.yaml new file mode 100644 index 0000000000..344fe21b78 --- /dev/null +++ b/docusaurus-asgardeo/static/apis/restapis/email-template.yaml @@ -0,0 +1,692 @@ +openapi: 3.0.0 +info: + version: "v1" + title: Asgardeo - Email Templates API + description: + "This is the RESTful API for managing email templates in WSO2 Asgardeo. This API allows adding, retrieving, replacing, and removing email + templates and template types. + \n To access the email template APIs in Asgardeo, you need to first [get an access token](https://wso2.com/asgardeo/docs/apis/authentication/#get-an-access-token) from your organization." +tags: + - name: Email template types + description: An email template type can have multiple email templates for different languages. + - name: Email templates + description: An email template of a specific type and language. +security: + - OAuth2: [] +paths: + /email/template-types: + get: + tags: + - Email template types + summary: Get email template types + operationId: getAllEmailTemplateTypes + description: | + Retrieves all the email template types in your organization, with limited details of the email templates. + + Scopes required: `internal_email_mgt_view` + parameters: + # - $ref: '#/components/parameters/limitQueryParam' + # - $ref: '#/components/parameters/offsetQueryParam' + # - $ref: '#/components/parameters/sortOrderQueryParam' + # - $ref: '#/components/parameters/sortByQueryParam' + - $ref: '#/components/parameters/requiredAttributesQueryParam' + responses: + '200': + description: Results matching the request criteria + content: + 'application/json': + schema: + type: array + items: + $ref: '#/components/schemas/EmailTemplateTypeWithoutTemplates' + '400': + $ref: '#/components/responses/InvalidInput' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/email/template-types' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + post: + tags: + - Email template types + summary: Add email template type + operationId: addEmailTemplateType + description: | + Adds a new email template type to your organization. An email template type can have any number of email templates.
    + + * Note that the _**displayName**_ attribute of the template type should be unique.
    + + Scopes required: `internal_email_mgt_create` + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/EmailTemplateType' + description: Use the following parameters in your request body to define your new email template type. + responses: + '201': + description: Item Created + headers: + self: + description: Location of the newly created identity provider. + schema: + type: string + content: + 'application/json': + schema: + $ref: '#/components/schemas/EmailTemplateTypeWithoutTemplates' + '400': + $ref: '#/components/responses/InvalidInput' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '409': + $ref: '#/components/responses/Conflict' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/email/template-types' \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "displayName": "Account Confirmation", + "templates": [ + { + "contentType": "text/html", + "subject": "WSO2 - Account Confirmation", + "body": "HTML Body", + "footer": "WSO2 Asgardeo Team", + "id": "en_US" + } + ] + }' + /email/template-types/{template-type-id}: + delete: + tags: + - Email template types + summary: Remove email template type + operationId: deleteEmailTemplateType + description: | + Removes an existing email template type with all its email templates + from your organization.
    + + Scopes required: `internal_email_mgt_delete` + + parameters: + - $ref: '#/components/parameters/templateTypeIdPathParam' + responses: + '204': + $ref: '#/components/responses/Deleted' + '400': + $ref: '#/components/responses/InvalidInput' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X 'DELETE' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/email/template-types/{email-template-type-id}' \ + -H 'accept: */*' \ + -H 'Authorization: Bearer {bearer_token}' + get: + tags: + - Email templates + summary: Get email templates per type + operationId: getEmailTemplateType + description: | + Retrieves an email template type (matching the template type ID) including all of its email templates.
    + +
    Scopes required: `internal_email_mgt_view` + parameters: + - $ref: '#/components/parameters/templateTypeIdPathParam' + #- $ref: '#/components/parameters/templateTypeIdPathParam' + #- $ref: '#/components/parameters/limitQueryParam' + #- $ref: '#/components/parameters/offsetQueryParam' + #- $ref: '#/components/parameters/sortOrderQueryParam' + #- $ref: '#/components/parameters/sortByQueryParam' + responses: + '200': + description: Results matching the request criteria + content: + 'application/json': + schema: + $ref: '#/components/schemas/EmailTemplateTypeWithID' + '400': + $ref: '#/components/responses/InvalidInput' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/email/template-types/{email-template-type-id}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + post: + tags: + - Email templates + summary: Add email template + operationId: addEmailTemplate + description: | + Adds a new email template to a template type. Note that the template ID is the locale and it be unique for the template type. You cannot have two templates with the same locale for a template type. + + Scopes required:
    `internal_email_mgt_create` + parameters: + - $ref: '#/components/parameters/templateTypeIdPathParam' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/EmailTemplateWithID' + description: Use the following parameters in your request body to define your new email template type. + responses: + '201': + description: Item Created + headers: + Location: + description: Location of the newly created identity provider + schema: + type: string + content: + 'application/json': + schema: + $ref: '#/components/schemas/SimpleEmailTemplate' + '400': + $ref: '#/components/responses/InvalidInput' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '409': + $ref: '#/components/responses/Conflict' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/email/template-types/{email-template-type-id}' \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "contentType": "text/html", + "subject": "WSO2 - Account Confirmation", + "body": "HTML Body", + "footer": "WSO2 Asgardeo Team", + "id": "en_US" + }' + put: + tags: + - Email templates + summary: Replace all email templates + operationId: updateEmailTemplateType + description: | + Replaces all the email templates of the respective email template type with + the newly provided email templates.
    + + Scopes required: `internal_email_mgt_update` + parameters: + - $ref: '#/components/parameters/templateTypeIdPathParam' + requestBody: + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/EmailTemplateWithID' + description: Use the following parameters in your request body. These parameter values will replace all the content in all the existing templates for the template type. + responses: + '200': + $ref: '#/components/responses/Updated' + '400': + $ref: '#/components/responses/InvalidInput' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PUT' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/email/template-types/{email-template-type-id}' \ + -H 'accept: */*' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '[ + { + "contentType": "text/html", + "subject": "WSO2 - Account Confirmation", + "body": "HTML Body", + "footer": "WSO2 Asgardeo Team", + "id": "en_US" + } + ]' + '/email/template-types/{template-type-id}/templates': + get: + tags: + - Email templates + summary: List email templates per type + operationId: getTemplatesListOfEmailTemplateType + description: | + Retrieves the list of email templates for the template type ID.
    + + Scopes required: `internal_email_mgt_view` + parameters: + - $ref: '#/components/parameters/templateTypeIdPathParam' + #- $ref: '#/components/parameters/limitQueryParam' + #- $ref: '#/components/parameters/offsetQueryParam' + #- $ref: '#/components/parameters/sortOrderQueryParam' + #- $ref: '#/components/parameters/sortByQueryParam' + responses: + '200': + description: Results matching the request criteria + content: + 'application/json': + schema: + type: array + items: + $ref: '#/components/schemas/SimpleEmailTemplate' + '400': + $ref: '#/components/responses/InvalidInput' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/email/template-types/{email-template-type-id}/templates' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + '/email/template-types/{template-type-id}/templates/{template-id}': + get: + tags: + - Email templates + summary: Get an email template + operationId: getEmailTemplate + description: | + Retrieves the email template that matches the specified template ID and template type.
    + + Scopes required: `internal_email_mgt_view` + + parameters: + - $ref: '#/components/parameters/templateTypeIdPathParam' + - $ref: '#/components/parameters/templateIdPathParam' + #- $ref: '#/components/parameters/limitQueryParam' + #- $ref: '#/components/parameters/offsetQueryParam' + #- $ref: '#/components/parameters/sortOrderQueryParam' + #- $ref: '#/components/parameters/sortByQueryParam' + responses: + '200': + description: Results matching the request criteria + content: + 'application/json': + schema: + $ref: '#/components/schemas/EmailTemplateWithID' + '400': + $ref: '#/components/responses/InvalidInput' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/email/template-types/{email-template-type-id}/templates/{template-id}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + put: + tags: + - Email templates + summary: Replace an email template + operationId: updateEmailTemplate + description: | + Replaces the email template identified by the template ID and template type.
    + + Scopes required: `internal_email_mgt_update` + + parameters: + - $ref: '#/components/parameters/templateTypeIdPathParam' + - $ref: '#/components/parameters/templateIdPathParam' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/EmailTemplateWithID' + description: Email templates for the template type + responses: + '200': + $ref: '#/components/responses/Updated' + '400': + $ref: '#/components/responses/InvalidInput' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PUT' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/email/template-types/{email-template-type-id}/templates/{template-id}' \ + -H 'accept: */*' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "contentType": "text/html", + "subject": "WSO2 - Account Confirmation", + "body": "HTML Body", + "footer": "WSO2 Asgardeo Team", + "id": "en_US" + }' + delete: + tags: + - Email templates + summary: Remove email template + operationId: deleteEmailTemplate + description: | + Removes an email template identified by the template ID and template type.
    + + Scopes required: `internal_email_mgt_delete` + + parameters: + - $ref: '#/components/parameters/templateTypeIdPathParam' + - $ref: '#/components/parameters/templateIdPathParam' + responses: + '204': + $ref: '#/components/responses/Deleted' + '400': + $ref: '#/components/responses/InvalidInput' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X 'DELETE' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/email/template-types/{email-template-type-id}/templates/{template-id}' \ + -H 'accept: */*' \ + -H 'Authorization: Bearer {bearer_token}' +servers: + - url: 'https://api.asgardeo.io/t/{org-name}/api/server/v1' + variables: + tenant-domain: + default: unknown + +components: + parameters: + templateTypeIdPathParam: + in: path + name: template-type-id + required: true + description: The ID of the email template type. + schema: + type: string + templateIdPathParam: + in: path + name: template-id + required: true + description: Email template ID. This should be a valid locale. + schema: + type: string + offsetQueryParam: + in: query + name: offset + description: >- + Number of records to skip for pagination. This option is not yet + supported. + schema: + type: integer + format: int32 + minimum: 0 + limitQueryParam: + in: query + name: limit + description: >- + Maximum number of records to return. This option is not yet + supported. + schema: + type: integer + format: int32 + minimum: 0 + sortOrderQueryParam: + in: query + name: sortOrder + required: false + description: >- + Define the order in which the retrieved records should be sorted. This + option is not yet supported. + schema: + type: string + enum: + - asc + - desc + sortByQueryParam: + in: query + name: sortBy + required: false + description: >- + Attribute by which the retrieved records should be sorted. This + option is not yet supported. + schema: + type: string + requiredAttributesQueryParam: + in: query + name: requiredAttributes + required: false + description: >- + Specifies the required parameters in the response. See the response schema for the complete list of parameters your can get in the response.

    By default, all the required parameters (in the response schema) will be returned. Use this parameter to specify additional attributes that you need in the response. + schema: + type: string + responses: + NotFound: + description: The specified resource is not found + content: + 'application/json': + schema: + $ref: '#/components/schemas/Error' + Unauthorized: + description: Unauthorized + Forbidden: + description: Forbidden + ServerError: + description: Internal Server Error + content: + 'application/json': + schema: + $ref: '#/components/schemas/Error' + InvalidInput: + description: Invalid input request + content: + 'application/json': + schema: + $ref: '#/components/schemas/Error' + Conflict: + description: Item Already Exists + content: + 'application/json': + schema: + $ref: '#/components/schemas/Error' + Deleted: + description: Item Deleted + Updated: + description: Item Updated + securitySchemes: + OAuth2: + type: oauth2 + flows: + clientCredentials: + tokenUrl: 'https://api.asgardeo.io/t/{org-name}/oauth2/token' + scopes: + internal_email_mgt_view: Grants read access + internal_email_mgt_create: Grants write access + internal_email_mgt_delete: Grants permission to delete records + internal_email_mgt_update: Grants permission to update existing records + + schemas: + EmailTemplateTypeWithoutTemplates: + type: object + required: + - id + - displayName + - self + properties: + id: + type: string + example: YWNjb3VudGNvbmZpcm1hdGlvbg + description: Unique ID of the email template type. + displayName: + type: string + example: Account Confirmation + description: Display name of the email template type. + templates: + type: array + description: Email templates for the template type. This is the HTML template of the email body. + items: + $ref: '#/components/schemas/EmailTemplateWithID' + self: + type: string + example: /t/{tenant-domain}/api/server/v1/email/template-types/YWNjb3VudGNvbmZpcm1hdGlvbg + description: Location of the created/updated resource. + EmailTemplateType: + type: object + required: + - displayName + - templates + properties: + displayName: + type: string + example: Account Confirmation + description: The unique display name of the email template type. + templates: + type: array + description: Email templates for the template type. + items: + $ref: '#/components/schemas/EmailTemplateWithID' + EmailTemplateTypeWithID: + allOf: + - $ref: '#/components/schemas/EmailTemplateType' + - required: + - id + properties: + id: + type: string + example: YWNjb3VudGNvbmZpcm1hdGlvbg + description: Unique ID of the email template type. + EmailTemplate: + type: object + required: + - contentType + - subject + - body + - footer + properties: + contentType: + type: string + example: text/html + description: Content type of the email template. + subject: + type: string + example: WSO2 - Account Confirmation + description: The subject of the email. + body: + type: string + example: HTML Body + description: The body (HTML) of the email. + footer: + type: string + example: WSO2 Asgardeo Team + description: The footer of the email. + EmailTemplateWithID: + allOf: + - $ref: '#/components/schemas/EmailTemplate' + - required: + - id + properties: + id: + type: string + example: en_US + description: >- + Unique ID of the email template. This ID represents the locale of the email template. + SimpleEmailTemplate: + type: object + required: + - id + - self + properties: + id: + type: string + example: en_US + description: >- + Unique ID of the email template. This ID represents the locale of the email template. + self: + type: string + example: /t/{tenant-domain}/api/server/v1/email/template-types/YWNjb3VudGNvbmZpcm1hdGlvbg/templates/en_US + description: Location of the created/updated resource. + + Error: + type: object + required: + - code + - message + properties: + code: + type: string + example: ET0001 + message: + type: string + example: Some Error Message + description: + type: string + example: Some Error Description + traceId: + type: string + example: TR0001 \ No newline at end of file diff --git a/docusaurus-asgardeo/static/apis/restapis/end-user-credential-management.yaml b/docusaurus-asgardeo/static/apis/restapis/end-user-credential-management.yaml new file mode 100644 index 0000000000..51626a6f6e --- /dev/null +++ b/docusaurus-asgardeo/static/apis/restapis/end-user-credential-management.yaml @@ -0,0 +1,198 @@ +openapi: 3.0.0 +info: + description: | + The Credential Management REST API provides a comprehensive interface to list and delete + credentials enrolled by end-users within the WSO2 Identity Server. The administrators who are assigned with privileges to list and delete + users (with scopes internal_user_mgt_view and internal_user_mgt_delete) are able to perform these operations. This API currently supports passkey and push + authentication credentials. + + version: '1.0' + title: WSO2 Identity Server - User Credential Management Rest API + +security: + - OAuth2: [] + - BasicAuth: [] + +servers: + - url: https://{server-url}/t/{tenant-domain}/api/server/v1 + variables: + tenant-domain: + default: carbon.super + server-url: + default: localhost:9443 + +paths: + /users/{user-id}/credentials: + get: + summary: List end-user enrolled credentials + description: "Retrieves a list of all user-enrolled credentials. + \n\n Scope (Permission) required: ``internal_user_mgt_view``\n\n" + operationId: getUserCredentialsById + tags: + - List User Credentials + parameters: + - name: user-id + in: path + description: The unique identifier of the user. + required: true + schema: + type: string + responses: + '200': + description: OK + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Credential' + examples: + response: + value: + [ + { + "credentialId": "TJwhlvGKrEk7xSSKLrhoCsaA", + "displayName": "My Security Key", + "type": "PASSKEY" + }, + { + "credentialId": "996a12a0-b9aab-48ab-8016-d0ffd99ebe1b", + "displayName": "My phone", + "type": "PUSH_AUTH" + } + ] + '400': + description: Bad Request. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '403': + description: Forbidden. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '404': + description: User Not Found. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Internal Server Error. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + + /users/{user-id}/credentials/{type}/{credential-id}: + delete: + summary: Delete a user-enrolled credential. + description: "Deletes a specific enrolled credential for a user. + \n\n Scope (Permission) required: ``internal_user_mgt_delete``\n\n" + operationId: deleteUserCredentialById + tags: + - Delete User Credential + parameters: + - name: user-id + in: path + description: The unique identifier of the user. + required: true + schema: + type: string + - name: type + in: path + description: The type of the credential. + required: true + schema: + type: string + enum: [passkey, push-auth] + - name: credential-id + in: path + description: The unique identifier of the device to be deleted. + required: true + schema: + type: string + responses: + '204': + description: User Credential Deleted. + '400': + description: Bad Request. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '403': + description: Forbidden. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Internal Server Error. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' +components: + securitySchemes: + BasicAuth: + type: http + scheme: basic + OAuth2: + type: oauth2 + flows: + authorizationCode: + authorizationUrl: 'https://localhost:9443/oauth2/authorize' + tokenUrl: 'https://localhost:9443/oauth2/token' + scopes: + read: internal_user_mgt_view + delete: internal_user_mgt_delete + schemas: + Credential: + type: object + properties: + credentialId: + type: string + description: The unique identifier for the credential. + example: 'a5a81c76-27a3-42d4-82a8-55285d82a4a1' + displayName: + type: string + description: A user-friendly name for the credential. + example: "YubiKey 5C" + type: + type: string + description: The type of the credential. + enum: [passkey, push-auth] + Error: + type: object + properties: + code: + type: string + description: Some error description. + example: 'CM-00001' + message: + type: string + description: Some error message. + example: 'Some error message.' + description: + type: string + description: A more detailed explanation of the error. + example: 'Some error description.' + traceId: + type: string + description: The unique identifier for the request. + example: '8a5f5d4e-1d2c-4f3b-9c6e-7d8f9a0b1c2d' diff --git a/docusaurus-asgardeo/static/apis/restapis/event-configuration.yaml b/docusaurus-asgardeo/static/apis/restapis/event-configuration.yaml new file mode 100644 index 0000000000..e0d10781ef --- /dev/null +++ b/docusaurus-asgardeo/static/apis/restapis/event-configuration.yaml @@ -0,0 +1,349 @@ +openapi: 3.0.0 +info: + version: "v1" + title: Asgardeo - Event Configuration Management API + description: "This document specifies a RESTful API for managing event publisher configurations in Asgardeo." +servers: + - url: 'https://api.asgardeo.io/t/{organization-name}/api/event-configurations/v1' +security: + - OAuth2: [] +paths: + '/events': + get: + tags: + - Events Configurations + summary: Retrieve all events. + description: | + This API provides capability to retrieve all events of the Asgardeo event publisher.
    + + Permissions required:
    + * /permission/admin/manage/identity/eventconfig/view + + Scopes required:
    + * internal_event_config_view + operationId: getEvents + responses: + '200': + description: OK + content: + 'application/json': + schema: + $ref: '#/components/schemas/EventsList' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/%7Borganization-name%7D/api/event-configurations/v1/events' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + put: + tags: + - Events Configurations + summary: Update multiple events. + description: | + This API provides the capability to enable/ disable multiple events for the Asgardeo event publisher.
    + You need to send the complete list of events in order for it to be accepted as a valid request.
    + + Permissions required:
    + * /permission/admin/manage/identity/eventconfig/update + + Scopes required:
    + * internal_event_config_update + operationId: replaceEvents + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/EventsList' + description: | + Represents the request to configure event publishing for multiple events. You can pass an array of Event objects. + required: true + responses: + '200': + description: OK + content: + 'application/json': + schema: + $ref: '#/components/schemas/EventsList' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PUT' \ + 'https://api.asgardeo.io/t/%7Borganization-name%7D/api/event-configurations/v1/events' \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '[ + { + "eventName": "registrations.addUser", + "eventSchema": "urn:ietf:params:registrations:addUser", + "displayName": "Add user event", + "category": "Registration events", + "publish": true + } + ]' + /events/{eventName}: + get: + tags: + - Event Configurations + summary: Retrieve event publishing configuration by event name. + description: | + This API provides the capability to retrieve Asgardeo event publisher configuration by event name.
    + + Permissions required:
    + * /permission/admin/manage/identity/eventconfig/view + + Scopes required:
    + * internal_event_config_view + operationId: getEventConfig + parameters: + - name: eventName + in: path + description: Name of the event + example: "registrations.addUser" + required: true + schema: + type: string + responses: + '200': + description: OK + content: + 'application/json': + schema: + $ref: '#/components/schemas/EventConfigurationResponse' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/%7Borganization-name%7D/api/event-configurations/v1/events/{event-name}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + put: + tags: + - Event Configurations + summary: Configure event publishing configuration by event name. + description: | + This API provides the capability to configure Asgardeo event publisher configuration by event name.
    + + Permissions required:
    + * /permission/admin/manage/identity/eventconfig/update + + Scopes required:
    + * internal_event_config_update + operationId: replaceEventConfig + parameters: + - name: eventName + in: path + description: Name of the event + example: "registrations.addUser" + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/EventConfigurationObject' + description: | + Represents the request to configure event publishing of the event. You can configure event properties by passing an array of key/ value pair objects. + required: true + responses: + '200': + description: OK + content: + 'application/json': + schema: + $ref: '#/components/schemas/EventConfigurationResponse' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PUT' \ + 'https://api.asgardeo.io/t/%7Borganization-name%7D/api/event-configurations/v1/events/{event-name}' \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "publish": true, + "properties": [ + { + "key": "attribute1", + "value": "value1" + } + ] + }' +components: + schemas: + Event: + type: object + required: + - eventName + - publish + - eventSchema + properties: + eventName: + type: string + example: "registrations.addUser" + eventSchema: + type: string + example: "urn:ietf:params:registrations:addUser" + displayName: + type: string + example: "Add user event" + category: + type: string + example: "Registration events" + publish: + type: boolean + example: true + EventsList: + type: array + items: + $ref: '#/components/schemas/Event' + EventProperty: + type: object + required: + - key + - value + properties: + key: + type: string + example: "attribute1" + value: + type: object + example: "value1" + EventConfigurationObject: + type: object + required: + - publish + - properties + properties: + publish: + type: boolean + example: true + properties: + type: array + items: + $ref: '#/components/schemas/EventProperty' + EventConfigurationResponse: + type: object + required: + - eventSchema + - category + - displayName + - publish + - properties + properties: + eventSchema: + type: string + example: "urn:ietf:params:registrations:addUser" + category: + type: string + example: "Registration events" + displayName: + type: string + example: "Add user event" + publish: + type: boolean + example: true + properties: + type: array + items: + $ref: '#/components/schemas/EventProperty' + Error: + type: object + required: + - code + - message + properties: + code: + type: string + example: ASG-ECM-10001 + message: + type: string + example: Some Error Message + description: + type: string + example: Some Error Description + traceId: + type: string + example: "e0fbcfeb-3617-43c4-8dd0-7b7d38e13047" + responses: + BadRequest: + description: Invalid input request. + content: + 'application/json': + schema: + $ref: '#/components/schemas/Error' + Unauthorized: + description: Unauthorized. + content: + 'application/json': + schema: + $ref: '#/components/schemas/Error' + Forbidden: + description: Resource forbidden. + content: + 'application/json': + schema: + $ref: '#/components/schemas/Error' + NotFound: + description: Resource not found. + content: + 'application/json': + schema: + $ref: '#/components/schemas/Error' + ServerError: + description: Internal server error. + content: + 'application/json': + schema: + $ref: '#/components/schemas/Error' + securitySchemes: + OAuth2: + type: oauth2 + flows: + clientCredentials: + tokenUrl: https://api.asgardeo.io/t/{organization-name}/oauth2/token + scopes: + internal_event_config_view: Grant permissions to view event configurations. + internal_event_config_update: Grant permissions to update event configurations. diff --git a/docusaurus-asgardeo/static/apis/restapis/export-user-info.yaml b/docusaurus-asgardeo/static/apis/restapis/export-user-info.yaml new file mode 100644 index 0000000000..1ae0ce97f7 --- /dev/null +++ b/docusaurus-asgardeo/static/apis/restapis/export-user-info.yaml @@ -0,0 +1,125 @@ +openapi: 3.0.0 + +info: + description: | + This is the RESTful API for users to export their profile information stored in Asgardeo. + version: "v1" + title: "Asgardeo - Export user profile information API" +servers: +- url: https://api.asgardeo.io/t/{organization-name}/api/identity/user/v1.0 + +security: + - OAuth2: [] + +tags: +- name: me + description: Operations for the authenticated user. + +paths: + /me: + get: + tags: + - me + summary: Export user profile + description: + "This API is used to export the user's information as a `.json` file.\n\n Scope required:``internal_login``" + responses: + 200: + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/UserProfile' + 401: + description: Unauthorized + 403: + description: Resource Forbidden + 500: + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/api/identity/user/v1.0/me' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' +components: + schemas: + Error: + type: object + required: + - code + - message + properties: + code: + type: string + example: "some_error_code" + message: + type: string + example: "Some Error Message" + description: + type: string + example: "Some Error Description" + traceId: + type: string + example: "Some Correlation for Error Instance" + + UserProfile: + type: object + properties: + user_profile: + type: object + properties: + emailVerified: + type: boolean + description: Specify if the user's email address is verified. + example: "true" + backupCodeEnabled: + type: boolean + description: Specifies if the user has enabled backup codes for login. + example: "false" + givenname: + type: string + description: User's first name. + example: "John" + created: + type: string + description: The date and time the user profile was created. + example: "2022-08-24T13:14:53.699037Z" + modified: + type: string + description: Last modified date and time of the user profile. + example: "2023-05-03T09:45:46.064920Z" + emailaddress: + type: string + description: User's email address. + example: "johnd@bifrost.com" + userid: + type: string + description: Unique identifier of the user. + example: "ba21bad4-****-****-****-0a993c753721" + totpEnabled: + type: boolean + description: Specifies if the user has enabled TOTP for login. + example: "true" + username: + type: string + description: Username of the user. If a username is not configured, it will be the user's email address. + example: "johnd@bifrost.com" + lastname: + type: string + description: The last name of the user. + example: "Doe" + + securitySchemes: + OAuth2: + type: oauth2 + description: "You can use the following OAuth grant type to securely access the respective API endpoints. + \n\n **Authorization Code OAuth Flow** + \n\n Authorization URL: 'https://api.asgardeo.io/t/{org-name}/oauth2/authorize' + \n\n This flow type is used for the ```me``` endpoint of TOTP APIs. You can use the following scope for this endpoint. + \n\n - ```internal_login```: Grant permission for an authenticated user for self-management." \ No newline at end of file diff --git a/docusaurus-asgardeo/static/apis/restapis/extend-sessions.yaml b/docusaurus-asgardeo/static/apis/restapis/extend-sessions.yaml new file mode 100644 index 0000000000..b7d7ee18f9 --- /dev/null +++ b/docusaurus-asgardeo/static/apis/restapis/extend-sessions.yaml @@ -0,0 +1,110 @@ +openapi: 3.0.0 +info: + version: 1.0.0 + title: Asgardeo - User session extension API + description: + "You can use this API to extend the user's session at Asgardeo. \n + To identify the session that needs to be extended, this API requires one of the following: \n +
      +
    • Session identifier as a request parameter: This method is ideal in cases where third-party cookies have been blocked. This can be obtained from the ID token.
    • +
    • Session identifier as a cookie: The session identifier used in this method is the commonAuthId value of the session cookie.
    • +
    " +servers: + - url: 'https://api.asgardeo.io/t/{organization-name}' +paths: + /identity/extend-session: + get: + summary: Extend user sessions + description: "This API is used to extend the Asgardeo session of a user. To identify the session that needs to be extended, this API requires one of the following: \n +
      +
    • Session identifier as a request parameter: If you are using this method, you need to include the session identifier as a query parameter in the request. You can obtain the session identifier from the ID token.
    • +
    • Session identifier as a cookie: If you are using this method, you need to include the session identifier as a cookie. This is the commonAuthId cookie.
    • +
    " + parameters: + - name: idpSessionKey + in: query + description: Decode the ID token and obtain the `isk` claim value to do this. The `isk` value is the session's identifier. + required: true + schema: + type: string + - name: commonAuthId + in: cookie + description: Use the commonAuthId value as the session identifier in the cookie section of the request. This value can be obtained from the session cookie generated for the session. + schema: + type: string + responses: + '200': + description: Successful response. + headers: + Location: + description: This denotes the session is successfully extended. + schema: + type: string + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorRequest' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorServer' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/%7Borganization-name%7D/identity/extend-session?idpSessionKey={isk}' \ + -H 'accept: */*' \ + -H 'Cookie: commonAuthId={common-auth-id}' \ + -H 'Authorization: Bearer {bearer_token}' +components: + schemas: + ErrorServer: + type: object + properties: + code: + type: string + example: ISE-65001 + message: + type: string + example: Unexpected server error + description: + type: string + example: Some error description. + traceId: + type: string + example: e0fbcfeb-3617-43c4-8dd0-7b7d38e13047 + ErrorRequest: + type: object + properties: + code: + type: string + description: + "The possible error codes are as follows: +
      +
    • ISE-60001
    • +
    • ISE-60002
    • +
    • ISE-60003
    • +
    • ISE-60004
    • +
    " + example: ISE-60002 + message: + type: string + description: + "The error messages respective to each code are as follows: +
      +
    • ISE-60001: Invalid request
    • +
    • ISE-60002: Session Key param value invalid
    • +
    • ISE-60003: Session cookie invalid
    • +
    • ISE-60004: Session not available / already expired
    • +
    " + example: Session Key param value invalid + description: + type: string + example: Some error description. + traceId: + type: string + example: e0fbcfeb-3617-43c4-8dd0-7b7d38e13047 \ No newline at end of file diff --git a/docusaurus-asgardeo/static/apis/restapis/identity-governance.yaml b/docusaurus-asgardeo/static/apis/restapis/identity-governance.yaml new file mode 100644 index 0000000000..3383d5edb4 --- /dev/null +++ b/docusaurus-asgardeo/static/apis/restapis/identity-governance.yaml @@ -0,0 +1,501 @@ +openapi: 3.0.0 +info: + description: >- + This is the RESTful API for identity governance configurations in Asgardeo. + version: "v1" + title: Asgardeo - Governance Connectors Admin API +tags: + - name: Management + description: Secured Admin-only calls +security: + - OAuth2: [] +paths: + /identity-governance/: + get: + tags: + - Management + summary: Get connector categories + operationId: getCategories + description: "Retrieve governance connector categories.\n\n Scope required: ``internal_governance_view``" + parameters: + - $ref: '#/components/parameters/limitQueryParam' + - $ref: '#/components/parameters/offsetQueryParam' + - $ref: '#/components/parameters/filterQueryParam' + - $ref: '#/components/parameters/sortQueryParam' + responses: + '200': + description: Governance connector categories. + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/CategoriesRes' + '401': + $ref: '#/components/responses/Unauthorized' + '500': + $ref: '#/components/responses/ServerError' + '501': + $ref: '#/components/responses/NotImplemented' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/identity-governance/' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + /identity-governance/{category-id}: + get: + tags: + - Management + summary: Get connectors of a category + operationId: getConnectorCategory + description: "Retrieve governance connectors of a category. \n\n Scope required: ``internal_governance_view``" + parameters: + - $ref: '#/components/parameters/categoryIdPathParam' + responses: + '200': + description: Requested governance connector category. + content: + application/json: + schema: + $ref: '#/components/schemas/CategoryRes' + '401': + $ref: '#/components/responses/Unauthorized' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/identity-governance/{category-id}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + /identity-governance/{category-id}/connectors: + get: + tags: + - Management + summary: Get connectors of a category + operationId: getConnectorsOfCategory + description: "Retrieve governance connectors of a category.\n\n Scope required: ``internal_governance_view``" + parameters: + - $ref: '#/components/parameters/categoryIdPathParam' + responses: + '200': + description: Requested governance connector category. + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/ConnectorRes' + '401': + $ref: '#/components/responses/Unauthorized' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/identity-governance/{category-id}/connectors' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + patch: + tags: + - Management + summary: Patch connectors of a category + operationId: patchConnectorsOfCategory + description: "Patch the governance connectors of a category. \n\n Scope required: ``internal_idp_update``" + parameters: + - $ref: '#/components/parameters/categoryIdPathParam' + responses: + '200': + $ref: '#/components/responses/OK' + '400': + $ref: '#/components/responses/InvalidInput' + '401': + $ref: '#/components/responses/Unauthorized' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PATCH' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/identity-governance/{category-id}/connectors' \ + -H 'accept: */*' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "operation": "UPDATE", + "connectors": [ + { + "id": "c3VzcGVuc2lvbi5ub3RpZmljYXRpb24", + "properties": [ + { + "name": "suspension.notification.enable", + "value": "false" + } + ] + } + ] + }' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/MultipleConnectorsPatchReq' + description: Governance connectors and properties to update + required: true + /identity-governance/{category-id}/connectors/{connector-id}: + get: + tags: + - Management + summary: Get a governance connector + operationId: getConnector + description: "Retrieve governance connector. \n\n Scope required: ``internal_governance_view``" + parameters: + - $ref: '#/components/parameters/categoryIdPathParam' + - $ref: '#/components/parameters/connectorIdPathParam' + responses: + '200': + description: Requested governance connector. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectorRes' + '401': + $ref: '#/components/responses/Unauthorized' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/identity-governance/{category-id}/connectors/{connector-id}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + patch: + tags: + - Management + summary: Patch a governance connector + operationId: patchConnector + description: "Patch governance connector. \n\n Scope required: ``internal_governance_update``" + parameters: + - $ref: '#/components/parameters/categoryIdPathParam' + - $ref: '#/components/parameters/connectorIdPathParam' + responses: + '200': + $ref: '#/components/responses/OK' + '400': + $ref: '#/components/responses/InvalidInput' + '401': + $ref: '#/components/responses/Unauthorized' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PATCH' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/identity-governance/{category-id}/connectors/{connector-id}' \ + -H 'accept: */*' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "operation": "UPDATE", + "properties": [ + { + "name": "suspension.notification.enable", + "value": "false" + } + ] + }' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectorsPatchReq' + description: governance-connector to update +servers: + - url: https://api.asgardeo.io/t/{organization-name}/api/server/v1 +components: + parameters: + limitQueryParam: + in: query + name: limit + required: false + description: Maximum number of records to return. + schema: + type: integer + format: int32 + offsetQueryParam: + in: query + name: offset + required: false + description: Number of records to skip for pagination. + schema: + type: integer + format: int32 + filterQueryParam: + in: query + name: filter + required: false + description: Condition to filter the retrieval of records. + schema: + type: string + sortQueryParam: + in: query + name: sort + required: false + description: Define the order in which the retrieved records should be sorted. + schema: + type: string + categoryIdPathParam: + in: path + name: category-id + required: true + description: Id of the connector category. + schema: + type: string + connectorIdPathParam: + in: path + name: connector-id + required: true + description: Id of the connector. + schema: + type: string + responses: + Unauthorized: + description: Unauthorized. + ServerError: + description: Internal Server Error. + content: + '*/*': + schema: + $ref: '#/components/schemas/Error' + NotImplemented: + description: Not Implemented. + content: + '*/*': + schema: + $ref: '#/components/schemas/Error' + NotFound: + description: Not Found. + content: + '*/*': + schema: + $ref: '#/components/schemas/Error' + InvalidInput: + description: Bad Request. + content: + '*/*': + schema: + $ref: '#/components/schemas/Error' + OK: + description: OK. + securitySchemes: + OAuth2: + type: oauth2 + flows: + authorizationCode: + authorizationUrl: 'https://api.asgardeo.io/t/{organization-name}/oauth2/authorize' + tokenUrl: 'https://api.asgardeo.io/t/{organization-name}/oauth2/token' + scopes: {} + schemas: + CategoriesRes: + type: object + description: Governance connector category response. + properties: + id: + type: string + description: Connector category id. + example: QWNjb3VudCBNYW5hZ2VtZW50IFBvbGljaWVz + name: + type: string + description: Connector category name. + example: Account Management Policies + self: + type: string + description: Path to retrieve the full connector information. + example: /t/{organization-name}/api/server/v1/identity-governance/QWNjb3VudCBNYW5hZ2VtZW50IFBvbGljaWVz + connectors: + type: array + description: Connectors of the category with minimal attributes. + items: + $ref: '#/components/schemas/CategoryConnectorsRes' + CategoryConnectorsRes: + type: object + description: Governance connector response with minimal attributes. + properties: + id: + type: string + description: Connector id. + example: c3VzcGVuc2lvbi5ub3RpZmljYXRpb24 + self: + type: string + description: Path to retrieve the full connector information. + example: /t/{organization-name}/api/server/v1/identity-governance/QWNjb3VudCBNYW5hZ2VtZW50IFBvbGljaWVz/connectors/c3VzcGVuc2lvbi5ub3RpZmljYXRpb24 + CategoryRes: + type: object + description: Governance connector category response. + properties: + name: + type: string + description: Connector category name. + example: Account Management Policies + connectors: + type: array + description: Connectors of the category with minimal attributes. + items: + $ref: '#/components/schemas/ConnectorRes' + ConnectorRes: + type: object + description: Governance connector response. + properties: + id: + type: string + description: Connector id. + example: c3VzcGVuc2lvbi5ub3RpZmljYXRpb24 + name: + type: string + description: Connector name. + example: suspension.notification + category: + type: string + description: Connector category. + example: Account Management Policies + friendlyName: + type: string + description: Connector friendly name. + example: Lock Idle Accounts + order: + type: integer + description: Connector order. + example: 0 + subCategory: + type: string + description: Connector subcategory. + example: DEFAULT + properties: + type: array + description: Define any additional properties if required. + items: + $ref: '#/components/schemas/PropertyRes' + PropertyRes: + type: object + description: Governance connector property. + properties: + name: + type: string + description: Property name. + example: suspension.notification.enable + value: + type: string + description: Property value. + example: 'false' + displayName: + type: string + description: Property display name. + example: Enable + description: + type: string + description: Property description. + example: Enable account suspend notifications. + ConnectorsPatchReq: + type: object + description: Governance connector property patch request. + required: + - operation + - properties + properties: + operation: + type: string + description: Governance connector properties patch operation. + enum: + - UPDATE + example: UPDATE + properties: + type: array + description: Governance connector properties to patch. + items: + $ref: '#/components/schemas/PropertyReq' + MultipleConnectorsPatchReq: + type: object + description: Multiple governance connectors properties patch request. + required: + - operation + - connectors + properties: + operation: + type: string + description: Governance connector properties patch operation. + enum: + - UPDATE + example: UPDATE + connectors: + type: array + description: Governance connectors to patch + items: + $ref: '#/components/schemas/ConnectorReq' + ConnectorReq: + type: object + description: Governance connector to patch + required: + - id + - properties + properties: + id: + type: string + description: Connector id. + example: c3VzcGVuc2lvbi5ub3RpZmljYXRpb24 + properties: + type: array + description: Governance connector properties to patch. + items: + $ref: '#/components/schemas/PropertyReq' + PropertyReq: + type: object + description: Governance connector property to patch. + required: + - name + - value + properties: + name: + type: string + description: Property name. + example: suspension.notification.enable + value: + type: string + description: Property value. + example: 'false' + Error: + type: object + required: + - code + - message + properties: + code: + type: string + description: The error code received. + example: AAA-00000 + message: + type: string + description: The displayed error message. + example: Some Error Message + description: + type: string + description: The description of the error that occurred. + example: Some Error Description + traceId: + type: string + description: An identifier to trace the error. + example: e0fbcfeb-3617-43c4-8dd0-7b7d38e13047 diff --git a/docusaurus-asgardeo/static/apis/restapis/identity-verification-providers.yaml b/docusaurus-asgardeo/static/apis/restapis/identity-verification-providers.yaml new file mode 100644 index 0000000000..feb8409858 --- /dev/null +++ b/docusaurus-asgardeo/static/apis/restapis/identity-verification-providers.yaml @@ -0,0 +1,578 @@ +openapi: 3.0.3 +info: + title: Identity Verification Provider Management API + description: |- + This document specifies an **Identity Verification Provider Management RESTful API** for **Asgardeo**. The APIs provide the capability to add/update/delete/update identity verification providers. + version: "v1" +servers: + - url: 'https://api.asgardeo.io/t/{organization-name}/api/server/v1' +security: + - OAuth2: [] + - BasicAuth: [] +paths: + /idv-providers: + get: + tags: + - Identity Verification Providers + summary: | + List identity verification providers + description: > + This API provides the capability to retrieve the list of identity + verification providers.
    + Scope(Permission) required: `internal_idvp_view` + operationId: getIdVProviders + parameters: + - $ref: '#/components/parameters/limitQueryParam' + - $ref: '#/components/parameters/offsetQueryParam' + - $ref: '#/components/parameters/filterQueryParam' + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/IdVProviderListResponse' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '501': + description: Not Implemented + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/idv-providers?limit={limit}&offset={offset}&filter={filter}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + post: + tags: + - Identity Verification Providers + summary: | + Add a new identity verification provider. + description: > + This API provides the capability to add an identity verification provider.
    + Scope(Permission) required: `internal_idvp_add` + operationId: addIdVProvider + responses: + '201': + description: Successful response + headers: + Location: + description: Location of the newly created identity provider. + schema: + type: string + content: + application/json: + schema: + $ref: '#/components/schemas/IdVProviderResponse' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + application/xml: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '409': + description: Conflict + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + application/xml: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + application/xml: + schema: + $ref: '#/components/schemas/Error' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/IdVProviderRequest' + description: This represents the identity provider to be created. + required: true + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/idv-providers' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -H 'Content-Type: application/json' \ + -d '{ + "name": "{provider_name}", + "type": "{provider_type}", + "description": "{provider_description}", + "attributes": [ + { + "key": "{attribute_key}", + "value": "{attribute_value}" + } + ] + }' + /idv-providers/{idv-provider-id}: + get: + tags: + - Identity Verification Providers + summary: | + Retrieve identity verification provider by identity verification provider's ID + description: > + This API provides the capability to retrieve the identity verification provider + details by using its ID. + Permission required:
    + * /permission/admin/manage/identity/idvp/view
    + Scope required:
    + * internal_idvp_view + operationId: getIdVProvider + parameters: + - name: idv-provider-id + in: path + description: ID of the identity verification provider. + required: true + schema: + type: string + responses: + '200': + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/IdVProviderResponse' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + application/xml: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/idv-providers/{idv-provider-id}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + put: + tags: + - Identity Verification Providers + summary: > + Update an identity verification provider. + description: > + This API provides the capability to update an identity verification provider
    + Scope(Permission) required: `internal_idvp_update` + operationId: updateIdVProviders + parameters: + - name: idv-provider-id + in: path + description: ID of the identity verification provider. + required: true + schema: + type: string + responses: + '200': + description: Successful response + headers: + Location: + description: Location of the updated identity provider. + schema: + type: string + content: + application/json: + schema: + $ref: '#/components/schemas/IdVProviderResponse' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/IdVProviderRequest' + required: true + x-codeSamples: + - lang: Curl + source: | + curl -X 'PUT' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/idv-providers/{idv-provider-id}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -H 'Content-Type: application/json' \ + -d '{ + "name": "{provider_name}", + "type": "{provider_type}", + "description": "{provider_description}", + "attributes": [ + { + "key": "{attribute_key}", + "value": "{attribute_value}" + } + ] + }' + delete: + tags: + - Identity Verification Providers + summary: | + Delete an identity verification provider by using the identity provider's ID. + description: > + This API provides the capability to delete an identity verification provider by + giving its ID.
    + Scope(Permission) required: `internal_idvp_delete` + operationId: deleteIdVProvider + parameters: + - name: idv-provider-id + in: path + description: ID of the identity verification provider. + required: true + schema: + type: string + responses: + '204': + description: Successfully Deleted + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'DELETE' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/idv-providers/{idv-provider-id}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + /extensions/identity-verification-providers: + get: + tags: + - Identity Verification Provider Templates + operationId: getAllIdVPTemplates + summary: | + List application templates + description: > + This API provides the capability to retrieve the list of templates available.
    + Scope(Permission) required: `internal_extensions_view` + responses: + '200': + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/IdVPTemplateListResponse' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/extensions/identity-verification-providers' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + +components: + parameters: + limitQueryParam: + in: query + name: limit + required: false + description: | + Maximum number of records to return. + schema: + type: integer + format: int32 + default: 10 + offsetQueryParam: + in: query + name: offset + required: false + description: | + Number of records to skip for pagination. + schema: + type: integer + format: int32 + default: 0 + filterQueryParam: + in: query + name: filter + required: false + description: > + Condition to filter the retrieval of records. Supports 'sw', 'co', 'ew' + and 'eq' operations and also complex queries with 'and' operations. E.g. + /idv-providers?filter=name+sw+"Onfido"+and+isEnabled+eq+"true" + schema: + type: string + idVPQueryParam: + in: query + name: idvProviderid + required: false + description: | + Id of the identity verification provider. + schema: + type: string + schemas: + Error: + type: object + properties: + code: + type: string + example: AAA-00000 + message: + type: string + example: Some Error Message + description: + type: string + example: Some Error Description + traceId: + type: string + example: e0fbcfeb-3617-43c4-8dd0-7b7d38e13047 + IdVProviderListResponse: + type: object + properties: + totalResults: + type: integer + example: 10 + startIndex: + type: integer + example: 1 + count: + type: integer + example: 10 + identityVerificationProviders: + type: array + items: + $ref: '#/components/schemas/IdVProviderResponse' + IdVProviderResponse: + type: object + properties: + id: + type: string + example: 123e4567-e89b-12d3-a456-556642440000 + type: + type: string + example: ONFIDO + name: + type: string + example: ONFIDO + description: + type: string + example: identity verification provider + image: + type: string + example: "onfido-logo-url" + isEnabled: + type: boolean + example: true + claims: + type: array + items: + $ref: '#/components/schemas/VerificationClaim' + configProperties: + type: array + items: + $ref: '#/components/schemas/ConfigProperty' + IdVProviderRequest: + type: object + properties: + type: + type: string + example: ONFIDO + name: + type: string + example: ONFIDO + description: + type: string + example: identity verification provider + image: + type: string + example: "onfido-logo-url" + isEnabled: + type: boolean + example: true + claims: + type: array + items: + $ref: '#/components/schemas/VerificationClaim' + configProperties: + type: array + items: + $ref: '#/components/schemas/ConfigProperty' + required: + - type + - name + - isEnabled + ConfigProperty: + type: object + properties: + key: + type: string + example: token + value: + type: string + example: somePropertyValue + VerificationClaim: + type: object + properties: + localClaim: + type: string + example: 'http://wso2.org/claims/dob' + idvpClaim: + type: string + example: birthday + IdVPTemplateListResponse: + type: array + items: + $ref: '#/components/schemas/IdVPTemplateResponse' + IdVPTemplateResponse: + type: object + properties: + id: + type: string + example: TEMPLATE_ID + version: + type: string + example: v1.0.0 + name: + type: string + example: Template Name + description: + type: string + example: Template Description. + image: + type: string + example: "onfido-logo-url" + displayOrder: + type: integer + example: 1 + tags: + type: array + items: + type: string + example: + - Identity-Verification + category: + type: string + example: DEFAULT + type: + type: string + example: identity-verification-providers + self: + type: string + example: /api/server/v1/extensions/identity-verification-providers/ONFIDO + securitySchemes: + BasicAuth: + type: http + scheme: basic + OAuth2: + type: oauth2 + flows: + authorizationCode: + authorizationUrl: 'https://localhost:9443/oauth2/authorize' + tokenUrl: 'https://localhost:9443/oauth2/token' + scopes: {} diff --git a/docusaurus-asgardeo/static/apis/restapis/idle-account-identification.yaml b/docusaurus-asgardeo/static/apis/restapis/idle-account-identification.yaml new file mode 100644 index 0000000000..c9ef159bbb --- /dev/null +++ b/docusaurus-asgardeo/static/apis/restapis/idle-account-identification.yaml @@ -0,0 +1,135 @@ +openapi: 3.0.0 +info: + description: > + This document specifies a RESTful API for identifying idle business user accounts in Asgardeo. The API provides the capability to retrieve a list of inactive users after a specified date. + version: "v1" + title: Asgardeo - Idle Account Identification Rest API +security: + - OAuth2: [] +servers: + - url: 'https://api.asgardeo.io/t/{organization-name}/api/idle-account-identification/v1' +paths: + /inactive-users: + get: + tags: + - Get inactive users + description: "Get inactive users after a specified date. \n\n Scope required: ``internal_user_mgt_list``" + operationId: getInactiveUsers + parameters: + - in: query + name: inactiveAfter + schema: + type: string + description: Users without login activity after this date are considered inactive. + example: 2023-01-31 + required: true + - in: query + name: excludeBefore + schema: + type: string + description: Users whose last login activity is before the specified date will be excluded from the list of inactive users included in the response. + example: 2023-01-01 + responses: + '200': + $ref: '#/components/responses/Success' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/idle-account-identification/v1/inactive-users?inactiveAfter=2023-01-31&excludeBefore=2023-01-01' \ + -H 'accept: application/json' + -H 'Authorization: Bearer {bearer_token}' +components: + schemas: + Error: + type: object + required: + - code + - message + properties: + code: + type: string + example: 80001 + message: + type: string + example: Some error message + description: + type: string + example: Some error description + Unauthorized: + type: object + required: + - code + - message + properties: + code: + type: string + example: 401 + message: + type: string + example: Unauthorized + description: + type: string + example: You are unauthorized to make this request + InactiveUsersList: + type: array + items: + $ref: '#/components/schemas/InactiveUser' + InactiveUser: + type: object + properties: + userId: + type: string + username: + type: string + userStoreDomain: + type: string + required: + - username + example: + userId: 3c780e73-9ca6-4e49-811e-8e697df22a91 + username: JohnDoe + userStoreDomain: DEFAULT + responses: + Unauthorized: + description: Unauthorized + content: + 'application/json': + schema: + $ref: '#/components/schemas/Unauthorized' + Forbidden: + description: Resource Forbidden + ServerError: + description: Internal Server Error + content: + 'application/json': + schema: + $ref: '#/components/schemas/Error' + BadRequest: + description: Invalid Input Request. + content: + 'application/json': + schema: + $ref: '#/components/schemas/Error' + Success: + description: Inactive users returned successfully. + content: + 'application/json': + schema: + $ref: '#/components/schemas/InactiveUsersList' + securitySchemes: + OAuth2: + type: oauth2 + flows: + clientCredentials: + tokenUrl: 'https://api.asgardeo.io/t/{org-name}/oauth2/token' + scopes: + internal_user_mgt_list: Grant permissions to read user records. \ No newline at end of file diff --git a/docusaurus-asgardeo/static/apis/restapis/idp.yaml b/docusaurus-asgardeo/static/apis/restapis/idp.yaml new file mode 100644 index 0000000000..4149d8a53a --- /dev/null +++ b/docusaurus-asgardeo/static/apis/restapis/idp.yaml @@ -0,0 +1,3661 @@ +openapi: 3.0.0 +info: + description: > + This document specifies a RESTful API for managing identity providers in Asgardeo. The APIs provide the capability to `add`, `update`, `delete`, and `patch` identity providers. + version: "v1" + title: Asgardeo - Identity Provider Management API definition +security: + - OAuth2: [] +servers: + - url: 'https://api.asgardeo.io/t/{organization-name}/api/server/v1' +paths: + /identity-providers: + get: + tags: + - Identity Providers + summary: | + List identity providers + description: "This API provides the capability to retrieve the list of identity providers. \n\n Scope(Permission) required: ``internal_idp_view``" + operationId: getIDPs + parameters: + - $ref: '#/components/parameters/limitQueryParam' + - $ref: '#/components/parameters/offsetQueryParam' + - $ref: '#/components/parameters/filterQueryParam' + - $ref: '#/components/parameters/sortQueryParam' + - $ref: '#/components/parameters/sortByQueryParam' + - $ref: '#/components/parameters/requiredAttributesQueryParam' + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/IdentityProviderListResponse' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '501': + description: Not Implemented + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/identity-providers' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + post: + tags: + - Identity Providers + summary: | + Add a new identity provider + description: "This API provides the capability to create a new identity provider. \n\n Scope(Permission) required: ``internal_idp_create``" + operationId: addIDP + responses: + '201': + description: Successful response + headers: + Location: + description: Location of the newly created identity provider. + schema: + type: string + content: + application/json: + schema: + $ref: '#/components/schemas/IdentityProviderResponse' + examples: + identityProviderWithSystemDefinedAuthenticator: + $ref: '#/components/examples/SystemDefinedIdentityProviderResponseExample' + identityProviderWithUserDefineAuthenticator: + $ref: '#/components/examples/UserDefinedIdentityProviderResponseExample' + application/xml: + schema: + $ref: '#/components/schemas/IdentityProviderResponse' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + application/xml: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '409': + description: Conflict + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + application/xml: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + application/xml: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/identity-providers' \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "name": "google", + "description": "IdP for Google Federation", + "image": "google-logo-url", + "isPrimary": false, + "isFederationHub": false, + "homeRealmIdentifier": "localhost", + "certificate": { + "certificates": [ + "string" + ], + "jwksUri": "https://api.asgardeo.io/t/{org-name}/oauth2/jwks" + }, + "alias": "https://api.asgardeo.io/t/{org-name}/oauth2/token", + "claims": { + "userIdClaim": { + "uri": "http://wso2.org/claims/username" + }, + "roleClaim": { + "uri": "http://wso2.org/claims/username" + }, + "mappings": [ + { + "idpClaim": "country", + "localClaim": { + "uri": "http://wso2.org/claims/username" + } + } + ], + "provisioningClaims": [ + { + "claim": { + "uri": "http://wso2.org/claims/username" + }, + "defaultValue": "sathya" + } + ] + }, + "roles": { + "mappings": [ + { + "idpRole": "google-manager", + "localRole": "manager" + } + ], + "outboundProvisioningRoles": [ + "manager", + "hr-admin" + ] + }, + "federatedAuthenticators": { + "defaultAuthenticatorId": "U0FNTDJBdXRoZW50aWNhdG9y", + "authenticators": [ + { + "authenticatorId": "U0FNTDJBdXRoZW50aWNhdG9y", + "isEnabled": true, + "isDefault": false, + "properties": [ + { + "key": "somePropertyKey", + "value": "somePropertyValue" + } + ] + } + ] + }, + "provisioning": { + "jit": { + "isEnabled": true, + "scheme": "PROVISION_SILENTLY", + "userstore": "DEFAULT", + "associateLocalUser": true, + "attributeSyncMethod": "OVERRIDE_ALL", + "accountLookupAttributeMappings": [ + { + "federatedAttribute": "email", + "localAttribute": "http://wso2.org/claims/username" + }, + { + "federatedAttribute": "mobile", + "localAttribute": "http://wso2.org/claims/mobile" + } + ] + }, + "outboundConnectors": { + "defaultConnectorId": "U0NJTQ", + "connectors": [ + { + "connectorId": "U0NJTQ", + "isEnabled": true, + "isDefault": false, + } + "rulesEnabled": false, + "properties": [ + { + "key": "somePropertyKey", + "value": "somePropertyValue" + } + ] + } + ] + } + } + }' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/IdentityProviderPOSTRequest' + examples: + identityProviderWithSystemDefinedAuthenticator: + $ref: '#/components/examples/IdentityProviderWithSystemDefinedAuthenticatorPOSTRequestExample' + identityProviderWithUserDefineAuthenticator: + $ref: '#/components/examples/IdentityProviderWithUserDefinedAuthenticatorPOSTRequestExample' + application/xml: + schema: + $ref: '#/components/schemas/IdentityProviderPOSTRequest' + description: This represents the identity provider to be created. + required: true + /identity-providers/meta/federated-authenticators: + get: + tags: + - Metadata + summary: | + List supported federated authenticators of IdPs + description: "This API provides the list of supported federated authenticators for an identity provider in Asgardeo. \n\nScope(Permission) required:
    `internal_idp_view`" + operationId: getMetaFederatedAuthenticators + responses: + '200': + description: OK + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/MetaFederatedAuthenticatorListItem' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/identity-providers/meta/federated-authenticators' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + /identity-providers/meta/federated-authenticators/{federated-authenticator-id}: + get: + tags: + - Metadata + summary: | + Get metadata of a supported federated authenticator + description: "This API provides the details of a single supported federated authenticator for an identity provider in Asgardeo. \n\nScope(Permission) required: `internal_idp_view`" + operationId: getMetaFederatedAuthenticator + parameters: + - name: federated-authenticator-id + in: path + description: ID of a federated authenticator + required: true + schema: + type: string + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/MetaFederatedAuthenticator' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/identity-providers/meta/federated-authenticators/{federated-authenticator-id}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + /identity-providers/meta/outbound-provisioning-connectors: + get: + tags: + - Metadata + summary: > + List supported outbound provisioning connectors of IdPs + description: "This API provides the list of supported federated authenticators for an identity provider (IdP) in the Asgardeo. \n\n Scope(Permission) required: `internal_idp_view`" + operationId: getMetaOutboundConnectors + responses: + '200': + description: OK + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/MetaOutboundConnectorListItem' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/identity-providers/meta/outbound-provisioning-connectors' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + /identity-providers/meta/outbound-provisioning-connectors/{outbound-provisioning-connector-id}: + get: + tags: + - Metadata + summary: | + Get metadata of a supported outbound provisioning connector + description: "This API provides the details of a single supported outbound provisioning connector for an identity provider (IdP) in the Asgardeo. \n\n Scope(Permission) required: `internal_idp_view`" + operationId: getMetaOutboundConnector + parameters: + - name: outbound-provisioning-connector-id + in: path + description: ID of an outbound provisioning connector + required: true + schema: + type: string + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/MetaOutboundConnector' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/identity-providers/meta/outbound-provisioning-connectors/{outbound-provisioning-connector-id}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + /identity-providers/{identity-provider-id}: + get: + tags: + - Identity Providers + summary: | + Retrieve IdP by ID + description: "This API provides the capability to retrieve the identity provider details using its ID. \n\n Scope(Permission) required: ``internal_idp_view``" + operationId: getIDP + parameters: + - name: identity-provider-id + in: path + description: ID of the identity provider. + required: true + schema: + type: string + responses: + '200': + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/IdentityProviderResponse' + examples: + identityProviderWithSystemDefinedAuthenticator: + $ref: '#/components/examples/SystemDefinedIdentityProviderResponseExample' + identityProviderWithUserDefineAuthenticator: + $ref: '#/components/examples/UserDefinedIdentityProviderResponseExample' + application/xml: + schema: + $ref: '#/components/schemas/IdentityProviderResponse' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + application/xml: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + application/xml: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + application/xml: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/identity-providers/{identity-provider-id}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + patch: + tags: + - Identity Providers + summary: > + Patch an IdP property by ID + description: "This API provides the capability to update an identity provider property using patch request. identity provider (IdP) patch is supported only for key-value pairs. \n\n Scope(Permission) required: ``internal_idp_update``" + operationId: patchIDP + parameters: + - name: identity-provider-id + in: path + description: ID of the identity provider. + required: true + schema: + type: string + responses: + '200': + description: Successful response + headers: + Location: + description: Location of the updated identity provider. + schema: + type: string + content: + application/json: + schema: + $ref: '#/components/schemas/IdentityProviderResponse' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PATCH' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/identity-providers/{identity-provider-id}' \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '[ + { + "operation": "REPLACE", + "path": "/homeRealmIdentifier", + "value": "google" + } + ]' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchRequest' + required: true + delete: + tags: + - Identity Providers + summary: | + Delete an identity provider by ID + description: "This API provides the capability to delete an identity provider by giving its ID. \n\n Scope(Permission) required: ``internal_idp_delete``" + operationId: deleteIDP + parameters: + - name: identity-provider-id + in: path + description: ID of the identity provider + required: true + schema: + type: string + - $ref: '#/components/parameters/forceQueryParam' + responses: + '204': + description: Successfully Deleted + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'DELETE' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/identity-providers/{identity-provider-id}?force=false' \ + -H 'accept: */*' \ + -H 'Authorization: Bearer {bearer_token}' + /identity-providers/{identity-provider-id}/federated-authenticators: + get: + tags: + - Federated Authenticators + summary: | + List federated authenticators of an IdP + description: "This API provides a list of federated authenticators enabled for a specific identity provider identified by its ID. \n\n Scope(Permission) required: `internal_idp_view`" + operationId: getFederatedAuthenticators + parameters: + - name: identity-provider-id + in: path + description: ID of the identity provider. + required: true + schema: + type: string + responses: + '200': + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/FederatedAuthenticatorListResponse' + examples: + systemDefinedAuthenticatorsExample: + $ref: '#/components/examples/SystemDefinedAuthenticatorListResponseExample' + userDefinedAuthenticators: + $ref: '#/components/examples/UserDefinedAuthenticatorListResponseExample' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/identity-providers/{identity-provider-id}/federated-authenticators' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + put: + tags: + - Federated Authenticators + summary: | + Update federated authenticators of an IdP + description: "This API updates federated authenticators enabled for a specific identity provider identified by its ID. \n\n Scope(Permission) required: `internal_idp_update`" + operationId: updateFederatedAuthenticators + parameters: + - name: identity-provider-id + in: path + description: ID of the identity provider. + required: true + schema: + type: string + responses: + '200': + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/FederatedAuthenticatorListResponse' + examples: + systemDefinedAuthenticatorsExample: + $ref: '#/components/examples/SystemDefinedAuthenticatorListResponseExample' + userDefinedAuthenticators: + $ref: '#/components/examples/UserDefinedAuthenticatorListResponseExample' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PUT' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/identity-providers/{identity-provider-id}/federated-authenticators' \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "defaultAuthenticatorId": "U0FNTDJBdXRoZW50aWNhdG9y", + "authenticators": [ + { + "authenticatorId": "U0FNTDJBdXRoZW50aWNhdG9y", + "isEnabled": true, + "isDefault": false, + "properties": [ + { + "key": "somePropertyKey", + "value": "somePropertyValue" + } + ] + } + ] + }' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/FederatedAuthenticatorRequest' + examples: + systemDefinedAuthenticatorsExample: + $ref: '#/components/examples/SystemDefinedAuthenticatorsListPUTRequestExample' + userDefinedAuthenticators: + $ref: '#/components/examples/UserDefinedAuthenticatorsListPUTRequestExample' + description: This represents the federated authenticators to be updated + required: true + '/identity-providers/{identity-provider-id}/federated-authenticators/{federated-authenticator-id}': + get: + tags: + - Federated Authenticators + summary: | + Retrieve federated authenticator config of an IdP + description: "This API provides the capability to retrieve the federated authenticator information of an identity provider by giving the federated authenticator's ID. \n\nScope(Permission) required:`internal_idp_view`" + operationId: getFederatedAuthenticator + parameters: + - name: identity-provider-id + in: path + description: ID of the identity provider. + required: true + schema: + type: string + - name: federated-authenticator-id + in: path + description: ID of the federated authenticator. + required: true + schema: + type: string + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/FederatedAuthenticator' + examples: + systemDefinedAuthenticatorsExample: + $ref: '#/components/examples/SystemDefinedAuthenticatorResponseExample' + userDefinedAuthenticators: + $ref: '#/components/examples/UserDefinedAuthenticatorResponseExample' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/identity-providers/{identity-provider-id}/federated-authenticators/{federated-authenticator-id}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + put: + tags: + - Federated Authenticators + summary: > + Update a federated authenticator of an IdP + description: "This API provides the capability to update an identity provider's federated authenticator config by specifying the authenticator ID. \n\n Scope(Permission) required: `internal_idp_update`" + operationId: updateFederatedAuthenticator + parameters: + - name: identity-provider-id + in: path + description: ID of the identity provider. + required: true + schema: + type: string + - name: federated-authenticator-id + in: path + description: ID of the federated authenticator. + required: true + schema: + type: string + responses: + '200': + description: Successful response + headers: + Location: + description: Location of the updated federated authenticator. + schema: + type: string + content: + application/json: + schema: + $ref: '#/components/schemas/FederatedAuthenticator' + examples: + systemDefinedAuthenticatorsExample: + $ref: '#/components/examples/SystemDefinedAuthenticatorResponseExample' + userDefinedAuthenticators: + $ref: '#/components/examples/UserDefinedAuthenticatorResponseExample' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PUT' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/identity-providers/{identity-provider-id}/federated-authenticators/{federated-authenticator-id}' \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "isEnabled": true, + "isDefault": false, + "properties": [ + { + "key": "somePropertyKey", + "value": "somePropertyValue" + } + ] + }' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/FederatedAuthenticatorPUTRequest' + examples: + systemDefinedAuthenticatorsExample: + $ref: '#/components/examples/SystemDefinedAuthenticatorPUTRequestExample' + userDefinedAuthenticators: + $ref: '#/components/examples/UserDefinedAuthenticatorPUTRequestExample' + description: This represents the federated authenticator to be updated + required: true + '/identity-providers/{identity-provider-id}/provisioning': + get: + tags: + - Provisioning + summary: | + List provisioning entities of an IdP + description: "This API provides a list of available provisioning entities for an identity provider. This includes just-in-time provisioning config and outbound provisioning connectors \n\n Scope(Permission) required: `internal_idp_view`" + operationId: getProvisioningConfig + parameters: + - name: identity-provider-id + in: path + description: ID of the identity provider. + required: true + schema: + type: string + responses: + '200': + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/ProvisioningResponse' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/identity-providers/{identity-provider-id}/provisioning' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + /identity-providers/{identity-provider-id}/provisioning/outbound-connectors: + get: + tags: + - Provisioning + summary: | + List outbound provisioning connectors of an IdP + description: "This API provides a list of outbound provisioning connectors enabled for an identity provider. \n\n Scope(Permission) required: `internal_idp_view`" + operationId: getOutboundConnectors + parameters: + - name: identity-provider-id + in: path + description: ID of the identity provider. + required: true + schema: + type: string + responses: + '200': + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/OutboundConnectorListResponse' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/identity-providers/{identity-provider-id}/provisioning/outbound-connectors' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + put: + tags: + - Provisioning + summary: | + Update outbound provisioning connectors of an IdP + description: "This API updates the list of outbound provisioning connectors enabled for an identity provider. \n\n Scope(Permission) required: `internal_idp_update`" + operationId: updateOutboundConnectors + parameters: + - name: identity-provider-id + in: path + description: ID of the identity provider. + required: true + schema: + type: string + responses: + '200': + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/OutboundConnectorListResponse' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PUT' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/identity-providers/{identity-provider-id}/provisioning/outbound-connectors' \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "defaultConnectorId": "U0NJTQ", + "connectors": [ + { + "connectorId": "U0NJTQ", + "isEnabled": true, + "isDefault": false, + "blockingEnabled": false, + "rulesEnabled": false, + "properties": [ + { + "key": "somePropertyKey", + "value": "somePropertyValue" + } + ] + } + ] + }' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OutboundProvisioningRequest' + description: This represents the outbound provisioning connectors to be updated + required: true + '/identity-providers/{identity-provider-id}/provisioning/outbound-connectors/{outbound-provisioning-connector-id}': + get: + tags: + - Provisioning + summary: | + Retrieve outbound provisioning connector of an IdP + description: "This API provides the capability to retrieve an identity provider's outbound provisioning connector information by specifying the provisioning connector's ID. \n\n Scope(Permission) required: `internal_idp_view`" + operationId: getOutboundConnector + parameters: + - name: identity-provider-id + in: path + description: ID of the identity provider. + required: true + schema: + type: string + - name: outbound-provisioning-connector-id + in: path + description: ID of the outbound provisioning connector. + required: true + schema: + type: string + responses: + '200': + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/OutboundConnector' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/identity-providers/{identity-provider-id}/provisioning/outbound-connectors/{outbound-provisioning-connector-id}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + put: + tags: + - Provisioning + summary: | + Update outbound provisioning connector of an IdP + description: "This API provides the capability to update an outbound provisioning connector config of an identity provider by specifying the provisioning connector's ID. \n\n Scope(Permission) required: `internal_idp_update`" + operationId: updateOutboundConnector + parameters: + - name: identity-provider-id + in: path + description: ID of the identity provider. + required: true + schema: + type: string + - name: outbound-provisioning-connector-id + in: path + description: ID of the outbound provisioning connector. + required: true + schema: + type: string + responses: + '200': + description: Successful response + headers: + Location: + description: Location of the updated outbound provisioning connector. + schema: + type: string + content: + application/json: + schema: + $ref: '#/components/schemas/OutboundConnector' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PUT' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/identity-providers/identity-provider-id/provisioning/outbound-connectors/outbound-provisioning-connector-id' \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "isEnabled": true, + "isDefault": false, + "blockingEnabled": false, + "rulesEnabled": false, + "properties": [ + { + "key": "somePropertyKey", + "value": "somePropertyValue" + } + ] + }' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OutboundConnectorPUTRequest' + description: This represents the outbound provisioning connector to be updated + required: true + '/identity-providers/{identity-provider-id}/claims': + get: + tags: + - Claims + summary: | + Get claim config of an IdP + description: "This API provides the claim config for an identity provider. This includes idp-to-local claim mappings, claims to be outbound provisioned, userID claim URI, and role claim URI. \n\n Scope(Permission) required: `internal_idp_view`" + operationId: getClaimConfig + parameters: + - name: identity-provider-id + in: path + description: ID of the identity provider. + required: true + schema: + type: string + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Claims' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/identity-providers/{identity-provider-id}/claims' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + put: + tags: + - Claims + summary: | + Update claims of an IdP + description: "This API provides the capability to update the claim config of an existing identity provider.\n\n Scope(Permission) required: `internal_idp_update`" + operationId: updateClaimConfig + parameters: + - name: identity-provider-id + in: path + description: ID of the identity provider. + required: true + schema: + type: string + responses: + '200': + description: Successful response + headers: + Location: + description: Location of the updated claim config. + schema: + type: string + content: + application/json: + schema: + $ref: '#/components/schemas/Claims' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PUT' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/identity-providers/{identity-provider-id}/claims' \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "userIdClaim": { + "uri": "http://wso2.org/claims/username" + }, + "roleClaim": { + "uri": "http://wso2.org/claims/username" + }, + "mappings": [ + { + "idpClaim": "country", + "localClaim": { + "uri": "http://wso2.org/claims/username" + } + } + ], + "provisioningClaims": [ + { + "claim": { + "uri": "http://wso2.org/claims/username" + }, + "defaultValue": "sathya" + } + ] + }' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/Claims' + description: This represents the claim config to be updated + required: true + '/identity-providers/{identity-provider-id}/roles': + get: + tags: + - Roles + summary: | + Get role config of an IdP + description: "This API provides the role config of an identity provider. This includes idp-to-local role mappings and/or a list of roles to be outbound-provisioned \n\n Scope(Permission) required: `internal_idp_view`" + operationId: getRoleConfig + parameters: + - name: identity-provider-id + in: path + description: ID of the identity provider. + required: true + schema: + type: string + responses: + '200': + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/Roles' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/identity-providers/identity-provider-id/roles' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + put: + tags: + - Roles + summary: | + Update role config of an IdP + description: "This API provides the capability to update the role config of an identity provider by specifying the identity provider ID. \n\n Scope(Permission) required: `internal_idp_update`" + operationId: updateRoleConfig + parameters: + - name: identity-provider-id + in: path + description: ID of the identity provider. + required: true + schema: + type: string + responses: + '200': + description: Successful response + headers: + Location: + description: Location of the updated role config. + schema: + type: string + content: + application/json: + schema: + $ref: '#/components/schemas/Roles' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PUT' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/identity-providers/{identity-provider-id}/roles' \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "mappings": [ + { + "idpRole": "google-manager", + "localRole": "manager" + } + ], + "outboundProvisioningRoles": [ + "manager", + "hr-admin" + ] + }' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/Roles' + description: This represents the role config to be updated. + required: true + /identity-providers/{identity-provider-id}/provisioning/jit: + get: + tags: + - Provisioning + summary: | + Just-In-Time provisioning config of an IdP + description: "This API retrieves the Just-In-Time provisioning config of an identity provider by specifying the identity provider ID. \n\n Scope(Permission) required: `internal_idp_view`" + operationId: getJITConfig + parameters: + - name: identity-provider-id + in: path + description: ID of the identity provider. + required: true + schema: + type: string + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/JustInTimeProvisioning' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/identity-providers/{identity-provider-id}/provisioning/jit' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + put: + tags: + - Provisioning + summary: | + Update the just-in-time provisioning config of an IdP + description: "This API provides the capability to update the just-in-time provisioning config of an identity provider by specifying the identity provider's ID. This includes the ability to enable/disable JIT provisioning, change the provisioning user store and enable/disable user prompts for username, password, and consent. \n\n Scope(Permission) required: `internal_idp_update`" + operationId: updateJITConfig + parameters: + - name: identity-provider-id + in: path + description: ID of the identity provider. + required: true + schema: + type: string + responses: + '200': + description: Successful response + headers: + Location: + description: Location of the updated just-in-time provisioning config. + schema: + type: string + content: + application/json: + schema: + $ref: '#/components/schemas/JustInTimeProvisioning' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PUT' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/identity-providers/{identity-provider-id}/provisioning/jit' \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "isEnabled": true, + "scheme": "PROVISION_SILENTLY", + "userstore": "DEFAULT", + "associateLocalUser": true, + "attributeSyncMethod": "OVERRIDE_ALL", + "accountLookupAttributeMappings": [ + { + "federatedAttribute": "email", + "localAttribute": "http://wso2.org/claims/email" + }, + { + "federatedAttribute": "mobile", + "localAttribute": "http://wso2.org/claims/mobile" + } + ] + }' + + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/JustInTimeProvisioning' + description: This represents the just-in-time provisioning config to be updated. + required: true + '/identity-providers/{identity-provider-id}/connected-apps': + get: + tags: + - Connected Apps + summary: | + List connected apps of the IdP + description: "This API provides the list of applications that use this identity provider for federated authentication/provisioning.\n\nScope(Permission) required: `internal_idp_view`" + operationId: getConnectedApps + parameters: + - $ref: '#/components/parameters/limitQueryParam' + - $ref: '#/components/parameters/offsetQueryParam' + - name: identity-provider-id + in: path + description: ID of the identity provider. + required: true + schema: + type: string + responses: + '200': + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectedApps' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/identity-providers/{identity-provider-id}/connected-apps' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + '/trusted-token-issuers': + get: + tags: + - Trusted Token Issuers + summary: | + List trusted token issuers + description: "This API provides the capability to retrieve the list of token issuers.\n\nScope(Permission) required: `internal_idp_view`" + operationId: getTrustedTokenIssuers + parameters: + - $ref: '#/components/parameters/limitQueryParam' + - $ref: '#/components/parameters/offsetQueryParam' + - $ref: '#/components/parameters/filterQueryParam' + - $ref: '#/components/parameters/sortByQueryParam' + - $ref: '#/components/parameters/sortOrderQueryParam' + - $ref: '#/components/parameters/requiredAttributesQueryParam' + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/IdentityProviderListResponse' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/trusted-token-issuers' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + post: + tags: + - Trusted Token Issuers + summary: | + Add a new trusted token issuer + description: "This API provides the capability to create a token issuer. \n\nScope(Permission) required: `internal_idp_create`" + operationId: addTrustedTokenIssuer + responses: + '201': + description: Successful response + headers: + Location: + description: Location of the newly created Token issuer. + schema: + type: string + content: + application/json: + schema: + $ref: '#/components/schemas/TrustedTokenIssuerResponse' + application/xml: + schema: + $ref: '#/components/schemas/TrustedTokenIssuerResponse' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + application/xml: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '409': + description: Conflict + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + application/xml: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + application/xml: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/trusted-token-issuers' \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "name": "google", + "description": "Trusted Token Issuer", + "image": "issuer-logo-url", + "templateId": "8ea23303-49c0-4253-b81f-82c0fe6fb4a0", + "certificate": { + "certificates": [ + "string" + ], + "jwksUri": "https://api.asgardeo.io/t/{org-name}/oauth2/jwks" + }, + "alias": "https://api.asgardeo.io/t/{org-name}/oauth2/token", + "issuer": "https://www.issuer.com", + "claims": { + "userIdClaim": { + "uri": "http://wso2.org/claims/username" + }, + "roleClaim": { + "uri": "http://wso2.org/claims/username" + }, + "mappings": [ + { + "idpClaim": "country", + "localClaim": { + "uri": "http://wso2.org/claims/username" + } + } + ], + "provisioningClaims": [ + { + "claim": { + "uri": "http://wso2.org/claims/username" + }, + "defaultValue": "sathya" + } + ] + } + }' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TrustedTokenIssuerPOSTRequest' + description: This represents the trusted token issuer to be created. + required: true + + '/trusted-token-issuers/{trusted-token-issuer-id}': + get: + tags: + - Trusted Token Issuers + summary: | + Retrieve IdP by trusted token issuer's ID + description: "This API provides the capability to retrieve the trusted token issuer details by using its ID.\n\nScope(Permission) required: `internal_idp_view`" + operationId: getTrustedTokenIssuer + parameters: + - name: trusted-token-issuer-id + in: path + description: ID of the trusted token issuer. + required: true + schema: + type: string + responses: + '200': + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/TrustedTokenIssuerResponse' + application/xml: + schema: + $ref: '#/components/schemas/TrustedTokenIssuerResponse' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + application/xml: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + application/xml: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + application/xml: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/trusted-token-issuers/{trusted-token-issuer-id}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + patch: + tags: + - Trusted Token Issuers + summary: > + Patch a trusted token issuer property by ID + description: "This API provides the capability to update a trusted token issuer property using patch request. Trusted token issuer patch is supported only for key-value pairs.\n\nScope(Permission) required: `internal_idp_update`" + operationId: patchTrustedTokenIssuer + parameters: + - name: trusted-token-issuer-id + in: path + description: ID of the trusted token issuer. + required: true + schema: + type: string + responses: + '200': + description: Successful response + headers: + Location: + description: Location of the updated trusted token issuer. + schema: + type: string + content: + application/json: + schema: + $ref: '#/components/schemas/TrustedTokenIssuerResponse' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PATCH' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/trusted-token-issuers/{trusted-token-issuer-id}' \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '[ + { + "operation": "REPLACE", + "path": "/homeRealmIdentifier", + "value": "google" + } + ]' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchRequest' + required: true + delete: + tags: + - Trusted Token Issuers + summary: | + Delete a trusted token issuer by ID + description: "This API provides the capability to delete a trusted token issuer by giving its ID. \n\nScope(Permission) required: ` internal_idp_delete`" + operationId: deleteTrustedTokenIssuer + parameters: + - name: trusted-token-issuer-id + in: path + description: ID of the trusted token issuer + required: true + schema: + type: string + - $ref: '#/components/parameters/forceQueryParam' + responses: + '204': + description: Successfully Deleted + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'DELETE' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/trusted-token-issuers/t{rusted-token-issuer-id}?force=false' \ + -H 'accept: */*' \ + -H 'Authorization: Bearer {bearer_token}' + '/identity-providers/{identity-provider-id}/implicit-association': + get: + tags: + - Implicit Association + summary: | + Get implicit association config of an IdP + description: "This API provides the implicit association config of an IdP including the status and the specified attributes for lookup.\n\nScope required: `internal_idp_view`" + operationId: getImplicitAssociation + parameters: + - name: identity-provider-id + in: path + description: ID of the identity provider. + required: true + schema: + type: string + responses: + '200': + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/ImplicitAssociationResponse' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + application/xml: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + application/xml: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + application/xml: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --request GET \ + --url https://api.asgardeo.io/t/{organization-name}/api/server/v1/identity-providers/{identity-provider-id}/implicit-association \ + --header 'Accept: application/json, application/xml' \ + --header 'Authorization: Bearer {bearer-token}' + put: + tags: + - Implicit Association + summary: | + Update implicit association config of an IdP + description: "This API provides the capability to update the implicit association config of an identity provider by specifying the identity provider ID.\n\nScope required: `internal_idp_update`" + operationId: updateImplicitAssociation + parameters: + - name: identity-provider-id + in: path + description: ID of the identity provider. + required: true + schema: + type: string + responses: + '200': + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/ImplicitAssociationResponse' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --request PUT \ + --url https://api.asgardeo.io/t/{organization-name}/api/server/v1/identity-providers/{identity-provider-id}/implicit-association \ + --header 'Accept: application/json' \ + --header 'Authorization: Bearer {bearer-token}' \ + --header 'Content-Type: application/json' \ + --data '{ + "isEnabled": true, + "lookupAttribute": [ + "http://wso2.org/claims/emailaddress" + ] + }' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ImplicitAssociationPutRequest' + description: This represents the implicit association configs to be updated. + required: true +components: + parameters: + limitQueryParam: + in: query + name: limit + required: false + description: | + Maximum number of records to return. + schema: + type: integer + format: int32 + offsetQueryParam: + in: query + name: offset + required: false + description: | + Number of records to skip for pagination. + schema: + type: integer + format: int32 + filterQueryParam: + in: query + name: filter + required: false + description: > + Condition to filter the retrieval of records. Supports 'sw', 'co', 'ew' + and 'eq' operations and also complex queries with 'and' operations. E.g. + /identity-providers?filter=name+sw+"google"+and+isEnabled+eq+"true" + schema: + type: string + sortQueryParam: + in: query + name: sortOrder + required: false + description: | + Defines the order in which the retrieved records should be sorted. + _This parameter is not supported yet_ + schema: + type: string + enum: + - ASC + - DESC + sortByQueryParam: + in: query + name: sortBy + required: false + description: | + Attribute by which the retrieved records should be sorted. + _This parameter is not supported yet_ + schema: + type: string + requiredAttributesQueryParam: + in: query + name: requiredAttributes + required: false + description: | + Specifies the required parameters in the response. + _This parameter is not supported yet_ + schema: + type: string + forceQueryParam: + in: query + name: force + required: false + description: > + Enforces the forceful deletion of an identity provider, federated authenticator, or an outbound provisioning connector even though a service provider refers to it. + schema: + type: boolean + default: false + sortOrderQueryParam: + in: query + name: sortOrder + required: false + description: >- + Define the order in which the retrieved tenants should be sorted. + schema: + type: string + enum: + - asc + - desc + securitySchemes: + OAuth2: + type: oauth2 + flows: + authorizationCode: + authorizationUrl: 'https://api.asgardeo.io/t/{org-name}/oauth2/authorize' + tokenUrl: 'https://api.asgardeo.io/t/{org-name}/oauth2/token' + scopes: {} + schemas: + Error: + type: object + properties: + code: + type: string + example: AAA-00000 + message: + type: string + example: Some Error Message + description: + type: string + example: Some Error Description + traceId: + type: string + example: e0fbcfeb-3617-43c4-8dd0-7b7d38e13047 + MetaProperty: + type: object + required: + - key + properties: + key: + type: string + example: 'httpBinding' + displayName: + type: string + example: 'HTTP Binding' + description: + type: string + example: 'Choose the HTTP Binding or decide from incoming request' + type: + type: string + enum: + - STRING + - BOOLEAN + - INTEGER + example: STRING + displayOrder: + type: integer + example: 10 + regex: + type: string + example: '[a-zA-Z]{3,30}' + isMandatory: + type: boolean + default: false + example: false + isConfidential: + type: boolean + default: false + options: + type: array + items: + type: string + example: ['HTTP-Redirect', 'HTTP-POST', 'As Per Request'] + defaultValue: + type: string + example: HTTP-Redirect + subProperties: + type: array + items: + $ref: '#/components/schemas/MetaProperty' + Property: + required: + - key + type: object + properties: + key: + type: string + example: somePropertyKey + value: + type: string + example: somePropertyValue + PatchRequest: + type: array + items: + $ref: '#/components/schemas/Patch' + Patch: + description: A JSONPatch as defined by RFC 6902. Patch operation is supported only for root level attributes of + an identity provider. + required: + - operation + - path + properties: + operation: + type: string + description: The operation to be performed. + enum: + - ADD + - REMOVE + - REPLACE + example: REPLACE + path: + type: string + description: A JSON-Pointer + example: '/homeRealmIdentifier' + value: + type: string + description: The value to be used within the operations. + example: 'google' + Link: + type: object + properties: + href: + type: string + description: Path to the target resource. + example: >- + '/t/{org_name}/api/server/v1/identity-providers/394b8adcce24c64a8a09a8d80abf8c337bd253de' + rel: + type: string + description: Describes how the current context is related to the target resource. + example: identity-providers + readOnly: true + Certificate: + type: object + properties: + certificates: + type: array + items: + type: string + jwksUri: + type: string + example: "https://api.asgardeo.io/t/{org-name}/oauth2/jwks" + samlMetadataUri: + type: string + description: The SAML metadata endpoint URL of the external identity provider. When configured, Asgardeo fetches and caches the signing certificate from this URL to validate SAML response signatures and IdP-initiated logout request signatures. + example: "https://idp.example.com/saml/metadata" + IdentityProviderPOSTRequest: + type: object + required: + - name + properties: + name: + type: string + example: google + description: The name of the identity provider (IdP). + description: + type: string + example: "IdP for Google Federation" + description: The name of the identity provider (IdP). + image: + type: string + example: "google-logo-url" + description: The URL to the logo image of the identity provider (IdP). + isPrimary: + type: boolean + default: false + isFederationHub: + type: boolean + default: false + homeRealmIdentifier: + type: string + example: localhost + certificate: + $ref: '#/components/schemas/Certificate' + alias: + type: string + example: 'https://api.asgardeo.io/t/{org-name}/oauth2/token' + claims: + $ref: '#/components/schemas/Claims' + roles: + $ref: '#/components/schemas/Roles' + federatedAuthenticators: + $ref: '#/components/schemas/FederatedAuthenticatorRequest' + provisioning: + $ref: '#/components/schemas/ProvisioningRequest' + IdentityProviderResponse: + type: object + properties: + id: + type: string + example: '123e4567-e89b-12d3-a456-556642440000' + name: + type: string + example: google + description: The name of the identity provider (IdP). + description: + type: string + description: The name of the identity provider (IdP). + isEnabled: + type: boolean + default: true + example: true + isPrimary: + type: boolean + default: false + image: + type: string + example: "google-logo-url" + isFederationHub: + type: boolean + example: false + homeRealmIdentifier: + type: string + example: localhost + certificate: + $ref: '#/components/schemas/Certificate' + alias: + type: string + example: 'https://api.asgardeo.io/t/{org-name}/oauth2/token' + claims: + $ref: '#/components/schemas/Claims' + roles: + $ref: '#/components/schemas/Roles' + federatedAuthenticators: + $ref: '#/components/schemas/FederatedAuthenticatorListResponse' + provisioning: + $ref: '#/components/schemas/ProvisioningResponse' + implicitAssociation: + $ref: '#/components/schemas/ImplicitAssociationResponse' + IdentityProviderListResponse: + type: object + properties: + totalResults: + type: integer + example: 10 + description: The total number of identity provider's (IdP) listed in the Response. + startIndex: + type: integer + example: 1 + count: + type: integer + example: 10 + links: + type: array + items: + $ref: '#/components/schemas/Link' + example: + [ + { + "href": "identity-provider?offset=50&limit=10", + "rel": "next", + }, { + "href": "identity-provider?offset=30&limit=10", + "rel": "previous", + } + ] + identityProviders: + type: array + items: + $ref: '#/components/schemas/IdentityProviderListItem' + IdentityProviderListItem: + type: object + properties: + id: + type: string + example: 123e4567-e89b-12d3-a456-556642440000 + description: The ID of the identity provider. + name: + type: string + example: google + description: The name of the identity provider. + description: + type: string + example: identity provider for google federation + description: The description of the identity provider. + isEnabled: + type: boolean + default: true + example: true + image: + type: string + example: "google-logo-url" + description: The logo image of the identity provider. + isPrimary: + type: boolean + example: false + isFederationHub: + type: boolean + example: false + homeRealmIdentifier: + type: string + example: localhost + certificate: + $ref: '#/components/schemas/Certificate' + alias: + type: string + example: 'https://api.asgardeo.io/t/{org-name}/oauth2/token' + claims: + $ref: '#/components/schemas/Claims' + roles: + $ref: '#/components/schemas/Roles' + federatedAuthenticators: + $ref: '#/components/schemas/FederatedAuthenticatorListResponse' + provisioning: + $ref: '#/components/schemas/ProvisioningResponse' + self: + type: string + example: /t/{org_name}/api/server/v1/identity-providers/123e4567-e89b-12d3-a456-556642440000 + description: The URL of the identity provider. + MetaFederatedAuthenticatorListItem: + type: object + properties: + authenticatorId: + type: string + example: U0FNTDJBdXRoZW50aWNhdG9y + description: The authenticator ID. + name: + type: string + example: SAML2Authenticator + description: The name of the authenticator + definedBy: + type: string + enum: + - SYSTEM + - USER + self: + type: string + example: /t/{org_name}/api/server/v1/identity-providers/meta/federated-authenticators/U0FNTFNTT0F1dGhlbnRpY2F0b3I + description: The URL of the identity provider. + MetaFederatedAuthenticator: + type: object + properties: + authenticatorId: + type: string + example: U0FNTFNTT0F1dGhlbnRpY2F0b3I + name: + type: string + example: SAML2Authenticator + displayName: + type: string + example: 'SAML2 Web SSO Configuration' + definedBy: + type: string + enum: + - SYSTEM + - USER + properties: + type: array + items: + $ref: '#/components/schemas/MetaProperty' + FederatedAuthenticatorRequest: + type: object + required: + - defaultAuthenticatorId + properties: + defaultAuthenticatorId: + type: string + description: >- + ID of the federated authenticator to be used as the default + authenticator for the respective identity provider. + example: U0FNTDJBdXRoZW50aWNhdG9y + authenticators: + type: array + items: + $ref: '#/components/schemas/FederatedAuthenticator' + description: >- + Includes the list of federated authenticators supported by the + respective identity provider. This should include the authenticator + specified as the `defaultAuthenticator`. + FederatedAuthenticator: + type: object + required: + - authenticatorId + properties: + authenticatorId: + type: string + example: U0FNTDJBdXRoZW50aWNhdG9y + name: + type: string + example: "SAML2Authenticator" + readOnly: true + isEnabled: + type: boolean + default: false + example: true + definedBy: + type: string + enum: + - SYSTEM + - USER + isDefault: + type: boolean + default: false + properties: + type: array + items: + $ref: '#/components/schemas/Property' + endpoint: + $ref: '#/components/schemas/Endpoint' + Endpoint: + type: object + required: + - uri + - authentication + properties: + uri: + type: string + example: https://abc.com/token + pattern: '^https?://.+' + authentication: + $ref: '#/components/schemas/AuthenticationType' + allowedHeaders: + type: array + description: List of HTTP headers to forward to the extension. + items: + type: string + example: [ "x-geo-location", "host"] + allowedParameters: + type: array + description: List of parameters to forward to the extension. + items: + type: string + example: [ "device-id"] + AuthenticationType: + type: object + description: > + The type of authentication required by the action's endpoint. The following options are supported: + + - NONE: No authentication is required.
    + ``{ + "type": "NONE" + }`` + + - BASIC: Basic authentication with a username and password.
    + ``{ + "type": "BASIC", + "properties": { + "username": "auth_username", + "password": "auth_password" + } + }`` + + - API_KEY: API key-based authentication, where the key is provided in an HTTP header.
    + ``{ + "type": "API_KEY", + "properties": { + "header": "X-API-Key", + "value": "12345-abcde-67890" + } + }`` + + - BEARER: Bearer token-based authentication.
    + ``{ + "type": "BEARER", + "properties": { + "accessToken": "0d6fed02-eac0-332b-8998-213a543139a0" + } + }`` + required: + - type + properties: + type: + type: string + enum: + - NONE + - BEARER + - API_KEY + - BASIC + example: BASIC + properties: + type: object + additionalProperties: true + example: + username: "auth_username" + password: "auth_password" + FederatedAuthenticatorPUTRequest: + type: object + properties: + authenticatorId: + type: string + example: + readOnly: true + name: + type: string + example: "SAML2Authenticator" + readOnly: true + isEnabled: + type: boolean + default: false + example: true + isDefault: + type: boolean + default: false + example: false + definedBy: + type: string + enum: + - SYSTEM + - USER + properties: + type: array + items: + $ref: '#/components/schemas/Property' + endpoint: + $ref: '#/components/schemas/Endpoint' + FederatedAuthenticatorListResponse: + type: object + properties: + defaultAuthenticatorId: + type: string + example: U0FNTFNTT0F1dGhlbnRpY2F0b3I + authenticators: + type: array + items: + $ref: '#/components/schemas/FederatedAuthenticatorListItem' + FederatedAuthenticatorListItem: + type: object + properties: + authenticatorId: + type: string + example: U0FNTFNTT0F1dGhlbnRpY2F0b3I + description: The ID of the authenticator. + name: + type: string + example: SAML2Authenticator + description: The name of the authenticator. + isEnabled: + type: boolean + default: false + example: true + definedBy: + type: string + enum: + - SYSTEM + - USER + self: + type: string + example: /t/{org_name}/api/server/v1/identity-providers/123e4567-e89b-12d3-a456-556642440000/federated-authenticators/U0FNTDJBdXRoZW50aWNhdG9y + description: The URL of the identity provider. + MetaOutboundConnectorListItem: + type: object + properties: + connectorId: + type: string + example: U0NJTQ + description: The identifier of the connector. + name: + type: string + example: SCIM + description: The name of the connector. + self: + type: string + example: /t/{org_name}/api/server/v1/identity-providers/meta/outbound-provisioning-connectos/U0NJTQ + description: The URL of the identity provider. + MetaOutboundConnector: + type: object + properties: + connectorId: + type: string + example: U0NJTQ + description: The identifier of the connector. + name: + type: string + example: SCIM + description: The name of the connector. + displayName: + type: string + example: SCIM Outbound Provisioning Connector + description: The display name of the connector. + blockingEnabled: + type: boolean + default: false + rulesEnabled: + type: boolean + default: false + properties: + type: array + items: + $ref: '#/components/schemas/MetaProperty' + ProvisioningRequest: + type: object + properties: + jit: + $ref: '#/components/schemas/JustInTimeProvisioning' + outboundConnectors: + $ref: '#/components/schemas/OutboundProvisioningRequest' + ProvisioningResponse: + type: object + properties: + jit: + $ref: '#/components/schemas/JustInTimeProvisioning' + outboundConnectors: + $ref: '#/components/schemas/OutboundConnectorListResponse' + OutboundProvisioningRequest: + type: object + required: + - defaultConnectorId + properties: + defaultConnectorId: + type: string + example: U0NJTQ + description: The identifier of the connector. + connectors: + type: array + items: + $ref: '#/components/schemas/OutboundConnector' + OutboundConnector: + type: object + required: + - connectorId + properties: + connectorId: + type: string + example: U0NJTQ + description: The identifier of the connector. + name: + type: string + example: SCIM + readOnly: true + description: The name of the connector. + isEnabled: + type: boolean + default: false + example: true + isDefault: + type: boolean + default: false + blockingEnabled: + type: boolean + default: false + rulesEnabled: + type: boolean + default: false + properties: + type: array + items: + $ref: '#/components/schemas/Property' + OutboundConnectorPUTRequest: + type: object + properties: + connectorId: + type: string + example: U0NJTQ + readOnly: true + description: The identifier of the connector. + name: + type: string + example: SCIM + readOnly: true + description: The name of the connector. + isEnabled: + type: boolean + default: false + example: true + isDefault: + type: boolean + default: false + blockingEnabled: + type: boolean + default: false + rulesEnabled: + type: boolean + default: false + properties: + type: array + items: + $ref: '#/components/schemas/Property' + OutboundConnectorListResponse: + type: object + properties: + defaultConnectorId: + type: string + example: U0NJTQ + description: The identifier of the connector. + connectors: + type: array + items: + $ref: '#/components/schemas/OutboundConnectorListItem' + OutboundConnectorListItem: + type: object + properties: + connectorId: + type: string + example: U0NJTQ + description: The identifier of the connector. + name: + type: string + example: SCIM + readOnly: true + description: The name of the connector. + isEnabled: + type: boolean + default: false + example: true + self: + type: string + example: /t/{org_name}/api/server/v1/identity-providers/123e4567-e89b-12d3-a456-556642440000/provisioning/outbound-connectors/U0NJTQ + description: The URL of the identity provider. + Roles: + type: object + properties: + mappings: + type: array + items: + $ref: '#/components/schemas/RoleMapping' + outboundProvisioningRoles: + type: array + items: + type: string + example: + - manager + - hr-admin + RoleMapping: + type: object + properties: + idpRole: + type: string + example: google-manager + localRole: + type: string + example: manager + IdPGroupsConfig: + type: array + description: IdP groups supported by the IdP. + items: + $ref: '#/components/schemas/IdPGroup' + minItems: 0 + IdPGroup: + type: object + required: + - name + description: Represents an IdP group supported by an Identity Provider. + properties: + name: + type: string + description: Name of the IdP group + example: google-admin + id: + type: string + description: UUID of the IdP group + example: 6b1f8513-3de0-4f28-9cad-b7400dbc94ae + Claims: + type: object + properties: + userIdClaim: + $ref: '#/components/schemas/Claim' + roleClaim: + $ref: '#/components/schemas/Claim' + mappings: + type: array + items: + $ref: '#/components/schemas/ClaimMapping' + provisioningClaims: + type: array + items: + $ref: '#/components/schemas/ProvisioningClaim' + ProvisioningClaim: + type: object + properties: + claim: + $ref: '#/components/schemas/Claim' + defaultValue: + type: string + example: sathya + ClaimMapping: + type: object + properties: + idpClaim: + type: string + example: country + localClaim: + $ref: '#/components/schemas/Claim' + Claim: + type: object + required: + - uri + properties: + id: + type: string + example: aHR0cDovL3dzbzIub3JnL2NsYWltcy91c2VybmFtZQ + readOnly: true + uri: + type: string + example: 'http://wso2.org/claims/username' + displayName: + type: string + example: Username + readOnly: true + JustInTimeProvisioning: + type: object + required: + - isEnabled + properties: + isEnabled: + type: boolean + default: false + example: true + scheme: + type: string + enum: + - PROMPT_USERNAME_PASSWORD_CONSENT + - PROMPT_PASSWORD_CONSENT + - PROMPT_CONSENT + - PROVISION_SILENTLY + default: PROVISION_SILENTLY + userstore: + type: string + default: PRIMARY + example: PRIMARY + associateLocalUser: + description: Specifies if the JIT-provisioned account should be associated with the local user account. + type: boolean + default: false + example: true + accountLookupAttributeMappings: + description: "This variable specifies the mapping between the federated attributes and the local user attributes for account lookup." + type: array + items: + type: object + properties: + federatedAttribute: + type: string + example: email + localAttribute: + type: string + example: http://wso2.org/claims/email + attributeSyncMethod: + description: "This variable specifies the method used for syncing attributes between the JIT-provisioned user account and the local user account. \n\n + Asgardeo allows the following syncing methods: \n\n +
      +
    • OVERRIDE_ALL: All attributes of the local user account will be overridden by the attributes received from the external identity provider.
    • +
    • NONE: None of the attributes received from the identity provider will be synced with the local user account.
    • +
    • PRESERVE_LOCAL: Only the attributes received from the identity provider will be updated while preserving the other attributes of the local user account.
    • + + + Scope(Permission) required: `internal_notification_senders_view` + operationId: getEmailSenders + responses: + "200": + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/EmailProviderList' + examples: + basicAuthWithAuthTypeResponseExample: + $ref: '#/components/examples/SMTPBasedEmailSenderWithBasicAuthTypeListResponseExample' + clientCredentialResponseEXample: + $ref: '#/components/examples/SMTPBasedEmailSenderWithClientCredentialAuthTypeListResponseExample' + httpBasicAuthResponseExample: + $ref: '#/components/examples/HTTPBasedEmailSenderWithBasicAuthTypeListResponseExample' + httpClientCredentialResponseExample: + $ref: '#/components/examples/HTTPBasedEmailSenderWithClientCredentialAuthTypeListResponseExample' + httpBearerTokenResponseExample: + $ref: '#/components/examples/HTTPBasedEmailSenderWithBearerTokenAuthTypeListResponseExample' + httpApiKeyResponseExample: + $ref: '#/components/examples/HTTPBasedEmailSenderWithAPIKeyAuthTypeListResponseExample' + httpNoneAuthResponseExample: + $ref: '#/components/examples/HTTPBasedEmailSenderWithNoneAuthTypeListResponseExample' + "400": + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Unauthorized + "403": + description: Forbidden + "404": + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "405": + description: Method Not Allowed. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{tenant-domain}/api/server/v2/notification-senders/email' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + post: + tags: + - Email Senders + summary: Create an email sender + description: | + This API provides the capability to create an email sender.\nIf the 'name' is not defined, 'EmailPublisher' is taken as the default name. For SMTP-based providers, Basic and Client Credential authentication types are supported. For HTTP-based providers, Basic, Client Credential, Bearer Token, API Key, and None authentication types are supported.
      + + Scope(Permission) required: `internal_notification_senders_create` + operationId: createEmailSender + requestBody: + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/HTTPBasedEmailSenderAdd' + - $ref: '#/components/schemas/SMTPBasedEmailSenderAdd' + examples: + basicAuthWithAuthTypePOSTEXample: + $ref: '#/components/examples/SMTPBasedEmailSenderBasicAuthWithAuthTypePOSTRequestExample' + clientCredentialPOSTEXample: + $ref: '#/components/examples/SMTPBasedEmailSenderClientCredentialPOSTRequestExample' + httpBasicAuthPOSTExample: + $ref: '#/components/examples/HTTPBasedEmailSenderWithBasicAuthTypePOSTRequestExample' + httpClientCredentialPOSTExample: + $ref: '#/components/examples/HTTPBasedEmailSenderWithClientCredentialAuthTypePOSTRequestExample' + httpBearerTokenPOSTExample: + $ref: '#/components/examples/HTTPBasedEmailSenderWithBearerTokenAuthTypePOSTRequestExample' + httpApiKeyPOSTExample: + $ref: '#/components/examples/HTTPBasedEmailSenderWithAPIKeyAuthTypePOSTRequestExample' + httpNoneAuthPOSTExample: + $ref: '#/components/examples/HTTPBasedEmailSenderWithNoneAuthTypePOSTRequestExample' + responses: + "201": + description: Successful Response + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/HTTPBasedEmailSenderAdd' + - $ref: '#/components/schemas/SMTPBasedEmailSenderAdd' + examples: + basicAuthWithAuthTypeResponseExample: + $ref: '#/components/examples/SMTPBasedEmailSenderWithBasicAuthTypeResponseExample' + clientCredentialResponseExample: + $ref: '#/components/examples/SMTPBasedEmailSenderWithClientCredentialAuthTypeResponseExample' + httpBasicAuthResponseExample: + $ref: '#/components/examples/HTTPBasedEmailSenderWithBasicAuthTypeResponseExample' + httpClientCredentialResponseExample: + $ref: '#/components/examples/HTTPBasedEmailSenderWithClientCredentialAuthTypeResponseExample' + httpBearerTokenResponseExample: + $ref: '#/components/examples/HTTPBasedEmailSenderWithBearerTokenAuthTypeResponseExample' + httpApiKeyResponseExample: + $ref: '#/components/examples/HTTPBasedEmailSenderWithAPIKeyAuthTypeResponseExample' + httpNoneAuthResponseExample: + $ref: '#/components/examples/HTTPBasedEmailSenderWithNoneAuthTypeResponseExample' + "400": + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Unauthorized + "403": + description: Forbidden + "404": + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "405": + description: Method Not Allowed. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "409": + description: Conflict + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{tenant-domain}/api/server/v2/notification-senders/email' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -H 'Content-Type: application/json' \ + -d '{ + "fromAddress": "iam@gmail.com", + "authType": "BASIC", + "properties": [ + { + "key": "mail.smtp.starttls.enable", + "value": true + }, + { + "key": "userName", + "value": "iam" + }, + { + "key": "password", + "value": "iam123" + } + ] + }' + /notification-senders/email/{sender-name}: + get: + tags: + - Email Senders + summary: Retrieve an email sender by name + description: | + This API provides the capability to retrieve an email sender by name. + The URL encoded email sender name is used as sender-name.
      + + Scope(Permission) required: `internal_notification_senders_view` + operationId: getEmailSender + parameters: + - name: sender-name + in: path + description: name of the email sender + required: true + style: simple + explode: false + schema: + type: string + responses: + "200": + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/EmailSender' + examples: + basicAuthWithAuthTypeResponseExample: + $ref: '#/components/examples/SMTPBasedEmailSenderWithBasicAuthTypeResponseExample' + clientCredentialResponseExample: + $ref: '#/components/examples/SMTPBasedEmailSenderWithClientCredentialAuthTypeResponseExample' + httpBasicAuthResponseExample: + $ref: '#/components/examples/HTTPBasedEmailSenderWithBasicAuthTypeResponseExample' + httpClientCredentialResponseExample: + $ref: '#/components/examples/HTTPBasedEmailSenderWithClientCredentialAuthTypeResponseExample' + httpBearerTokenResponseExample: + $ref: '#/components/examples/HTTPBasedEmailSenderWithBearerTokenAuthTypeResponseExample' + httpApiKeyResponseExample: + $ref: '#/components/examples/HTTPBasedEmailSenderWithAPIKeyAuthTypeResponseExample' + httpNoneAuthResponseExample: + $ref: '#/components/examples/HTTPBasedEmailSenderWithNoneAuthTypeResponseExample' + "400": + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Unauthorized + "403": + description: Forbidden + "404": + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "405": + description: Method Not Allowed. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{tenant-domain}/api/server/v2/notification-senders/email/{email-sender-name}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + put: + tags: + - Email Senders + summary: Update an email sender + description: | + This API provides the capability to update an email sender by name. + The URL encoded email sender name is used as sender-name.
      + + Scope(Permission) required: `internal_notification_senders_update` + operationId: updateEmailSender + parameters: + - name: sender-name + in: path + description: name of the email sender + required: true + style: simple + explode: false + schema: + type: string + requestBody: + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/HTTPBasedEmailSenderUpdate' + - $ref: '#/components/schemas/SMTPBasedEmailSenderUpdate' + examples: + basicAuthWithAuthTypePUTEXample: + $ref: '#/components/examples/SMTPBasedEmailSenderBasicAuthWithAuthTypePUTRequestExample' + clientCredentialPUTEXample: + $ref: '#/components/examples/SMTPBasedEmailSenderClientCredentialPUTRequestExample' + httpBasicAuthPUTExample: + $ref: '#/components/examples/HTTPBasedEmailSenderWithBasicAuthTypePUTRequestExample' + httpClientCredentialPUTExample: + $ref: '#/components/examples/HTTPBasedEmailSenderWithClientCredentialAuthTypePUTRequestExample' + httpBearerTokenPUTExample: + $ref: '#/components/examples/HTTPBasedEmailSenderWithBearerTokenAuthTypePUTRequestExample' + httpApiKeyPUTExample: + $ref: '#/components/examples/HTTPBasedEmailSenderWithAPIKeyAuthTypePUTRequestExample' + httpNoneAuthPUTExample: + $ref: '#/components/examples/HTTPBasedEmailSenderWithNoneAuthTypePUTRequestExample' + + required: true + responses: + "200": + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/EmailSender' + examples: + basicAuthWithAuthTypePUTEXample: + $ref: '#/components/examples/SMTPBasedEmailSenderWithBasicAuthTypeResponseExample' + clientCredentialPUTEXample: + $ref: '#/components/examples/SMTPBasedEmailSenderWithClientCredentialAuthTypeResponseExample' + httpBasicAuthResponseExample: + $ref: '#/components/examples/HTTPBasedEmailSenderWithBasicAuthTypeResponseExample' + httpClientCredentialResponseExample: + $ref: '#/components/examples/HTTPBasedEmailSenderWithClientCredentialAuthTypeResponseExample' + httpBearerTokenResponseExample: + $ref: '#/components/examples/HTTPBasedEmailSenderWithBearerTokenAuthTypeResponseExample' + httpApiKeyResponseExample: + $ref: '#/components/examples/HTTPBasedEmailSenderWithAPIKeyAuthTypeResponseExample' + httpNoneAuthResponseExample: + $ref: '#/components/examples/HTTPBasedEmailSenderWithNoneAuthTypeResponseExample' + "400": + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Unauthorized + "403": + description: Forbidden + "404": + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "405": + description: Method Not Allowed. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PUT' \ + 'https://api.asgardeo.io/t/{tenant-domain}/api/server/v2/notification-senders/email/{email-sender-name}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -H 'Content-Type: application/json' \ + -d '{ + "fromAddress": "iam@gmail.com", + "authType": "BASIC", + "properties": [ + { + "key": "mail.smtp.starttls.enable", + "value": true + }, + { + "key": "userName", + "value": "iam" + }, + { + "key": "password", + "value": "iam123" + } + ] + }' + delete: + tags: + - Email Senders + summary: Delete an email sender by name + description: | + This API provides the capability to delete an email sender by name. + The URL encoded email sender name is used as sender-name.
      + + Scope(Permission) required: `internal_notification_senders_delete` + operationId: deleteEmailSender + parameters: + - name: sender-name + in: path + description: name of the email sender + required: true + style: simple + explode: false + schema: + type: string + responses: + "204": + description: No Content + "400": + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Unauthorized + "403": + description: Forbidden + "404": + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "405": + description: Method Not Allowed. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'DELETE' \ + 'https://api.asgardeo.io/t/{tenant-domain}/api/server/v2/notification-senders/email/{email-sender-name}' \ + -H 'accept: */*' \ + -H 'Authorization: Bearer {bearer_token}' + /notification-senders/sms: + get: + tags: + - SMS Senders + summary: Get a list of SMS senders + description: | + This API provides the capability to retrieve a list of SMS notification senders.
      + + Scope(Permission) required: `internal_notification_senders_view` + operationId: getSMSSenders + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/SMSProviderList' + examples: + ListOfSMSProviderResponseExample: + $ref: '#/components/examples/SMSProvidersListResponseExample' + "400": + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Unauthorized + "403": + description: Forbidden + "404": + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "405": + description: Method Not Allowed. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{tenant-domain}/api/server/v2/notification-senders/sms' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + post: + tags: + - SMS Senders + summary: Create a SMS sender + description: | + This API provides the capability to create a SMS sender. + If the 'name' is not not defined, 'SMSPublisher' is taken as the default name.
      + + Scope(Permission) required: `internal_notification_senders_create` + operationId: createSMSSender + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/SMSSenderAdd' + examples: + TwilioSMSProviderRequestExample: + $ref: '#/components/examples/TwilioSMSProviderRequestExample' + VonageSMSProviderRequestExample: + $ref: '#/components/examples/VonageSMSProviderRequestExample' + CustomSMSProviderRequestExample: + $ref: '#/components/examples/CustomSMSProviderRequestExample' + responses: + "201": + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/SMSSender' + examples: + TwilioSMSProviderResponseExample: + $ref: '#/components/examples/TwilioSMSProviderResponseExample' + VonageSMSProviderResponseExample: + $ref: '#/components/examples/VonageSMSProviderResponseExample' + CustomSMSProviderResponseExample: + $ref: '#/components/examples/CustomSMSProviderResponseExample' + "400": + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Unauthorized + "403": + description: Forbidden + "404": + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "405": + description: Method Not Allowed. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "409": + description: Conflict + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{tenant-domain}/api/server/v2/notification-senders/sms' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -H 'Content-Type: application/json' \ + -d '{ + "provider": "NEXMO", + "providerURL": "https://rest.nexmo.com/sms/json", + "key": "123**45", + "secret": "5tg**ssd", + "sender": "+94 775563324", + "type": "json", + "properties": [ + { + "key": "body.scope", + "value": "internal" + }, + { + "key": "http.headers", + "value": "X-Version: 1, Authorization: bearer ,Accept: application/json ,Content-Type: application/json" + } + ] + }' + /notification-senders/sms/{sender-name}: + get: + tags: + - SMS Senders + summary: Get a SMS sender by name + description: | + This API provides the capability to retrieve a SMS notification sender by name. + The URL encoded SMS sender name is used as sender-name.
      + + Scope(Permission) required: `internal_notification_senders_view` + operationId: getSMSSender + parameters: + - name: sender-name + in: path + description: name of the SMS sender + required: true + style: simple + explode: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/SMSSender' + examples: + TwilioSMSProviderResponseExample: + $ref: '#/components/examples/TwilioSMSProviderResponseExample' + VonageSMSProviderResponseExample: + $ref: '#/components/examples/VonageSMSProviderResponseExample' + CustomSMSProviderResponseExample: + $ref: '#/components/examples/CustomSMSProviderResponseExample' + "400": + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Unauthorized + "403": + description: Forbidden + "404": + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "405": + description: Method Not Allowed. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{tenant-domain}/api/server/v2/notification-senders/sms/{sms-sender-name}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + put: + tags: + - SMS Senders + summary: Update a SMS sender + description: | + This API provides the capability to update a SMS Sender. + The URL encoded SMS sender name is used as sender-name.
      + + + Scope(Permission) required: `internal_notification_senders_update` + operationId: updateSMSSender + parameters: + - name: sender-name + in: path + description: name of the SMS sender + required: true + style: simple + explode: false + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/SMSSenderUpdateRequest' + examples: + TwilioSMSProviderRequestExample: + $ref: '#/components/examples/TwilioSMSProviderRequestExample' + VonageSMSProviderRequestExample: + $ref: '#/components/examples/VonageSMSProviderRequestExample' + CustomSMSProviderRequestExample: + $ref: '#/components/examples/CustomSMSProviderRequestExample' + required: true + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/SMSSender' + examples: + TwilioSMSProviderResponseExample: + $ref: '#/components/examples/TwilioSMSProviderResponseExample' + VonageSMSProviderResponseExample: + $ref: '#/components/examples/VonageSMSProviderResponseExample' + CustomSMSProviderResponseExample: + $ref: '#/components/examples/CustomSMSProviderResponseExample' + "400": + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Unauthorized + "403": + description: Forbidden + "404": + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "405": + description: Method Not Allowed. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PUT' \ + 'https://api.asgardeo.io/t/{tenant-domain}/api/server/v2/notification-senders/sms/{sms-sender-name}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -H 'Content-Type: application/json' \ + -d '{ + "provider": "NEXMO", + "providerURL": "https://rest.nexmo.com/sms/json", + "key": "123**45", + "secret": "5tg**ssd", + "sender": "+94 775563324", + "type": "json", + "properties": [ + { + "key": "body.scope", + "value": "internal" + }, + { + "key": "http.headers", + "value": "X-Version: 1, Authorization: bearer ,Accept: application/json ,Content-Type: application/json" + } + ] + }' + delete: + tags: + - SMS Senders + summary: Delete a SMS sender by name + description: | + This API provides the capability to delete a SMS sender by name. + The URL encoded SMS sender name is used as sender-name.
      + + Scope(Permission) required: `internal_notification_senders_delete` + operationId: deleteSMSSender + parameters: + - name: sender-name + in: path + description: name of the SMS sender + required: true + style: simple + explode: false + schema: + type: string + responses: + "204": + description: No Content + "400": + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Unauthorized + "403": + description: Forbidden + "404": + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "405": + description: Method Not Allowed. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'DELETE' \ + 'https://api.asgardeo.io/t/{tenant-domain}/api/server/v2/notification-senders/sms/{sms-sender-name}' \ + -H 'accept: */*' \ + -H 'Authorization: Bearer {bearer_token}' + /notification-senders/push: + get: + tags: + - Push Senders + summary: Get a list of push notification senders + description: | + This API provides the capability to retrieve the list of push notification senders.
      + + Scope(Permission) required: `internal_notification_senders_view` + operationId: getPushSenders + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/PushProviderList' + "400": + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Unauthorized + "403": + description: Forbidden + "404": + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "405": + description: Method Not Allowed. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{tenant-domain}/api/server/v2/notification-senders/push' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + post: + tags: + - Push Senders + summary: Create a push notification sender + description: | + This API provides the capability to create a push notification sender. + If the 'name' is not not defined, 'PushPublisher' is taken as the default name.
      + + Scope(Permission) required: `internal_notification_senders_create` + operationId: createSMSSender + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PushSenderAdd' + example: + provider: FCM + properties: + - key: serviceAccountContent + value: "base64EncodedServiceAccountJsonString" + responses: + "201": + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/PushSender' + "400": + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Unauthorized + "403": + description: Forbidden + "404": + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "405": + description: Method Not Allowed. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "409": + description: Conflict + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{tenant-domain}/api/server/v2/notification-senders/push' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -H 'Content-Type: application/json' \ + -d '{ + "provider": "FCM", + "properties": [ + { + "key": "serviceAccountContent", + "value": "base64EncodedServiceAccountJsonString" + } + ] + }' + /notification-senders/push/{sender-name}: + get: + tags: + - Push Senders + summary: Get a push sender by name + description: | + This API provides the capability to retrieve a push notification sender by name. + The URL encoded push sender name is used as sender-name.
      + + Scope(Permission) required: `internal_notification_senders_view` + operationId: getPushSender + parameters: + - name: sender-name + in: path + description: name of the push sender + required: true + style: simple + explode: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/PushSender' + "400": + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Unauthorized + "403": + description: Forbidden + "404": + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "405": + description: Method Not Allowed. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{tenant-domain}/api/server/v2/notification-senders/push/{push-sender-name}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + put: + tags: + - Push Senders + summary: Update a push notification sender + description: | + This API provides the capability to update a push notification sender. + The URL encoded push notification sender name is used as sender-name.
      + + + Scope(Permission) required: `internal_notification_senders_update` + operationId: updatePushSender + parameters: + - name: sender-name + in: path + description: name of the push notification sender + required: true + style: simple + explode: false + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PushSenderUpdateRequest' + example: + provider: FCM + properties: + - key: serviceAccountContent + value: "base64EncodedServiceAccountJsonString" + required: true + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/PushSender' + "400": + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Unauthorized + "403": + description: Forbidden + "404": + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "405": + description: Method Not Allowed. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PUT' \ + 'https://api.asgardeo.io/t/{tenant-domain}/api/server/v2/notification-senders/push/{push-sender-name}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -H 'Content-Type: application/json' \ + -d '{ + "provider": "FCM", + "properties": [ + { + "key": "serviceAccountContent", + "value": "base64EncodedServiceAccountJsonString" + } + ] + }' + delete: + tags: + - Push Senders + summary: Delete a push notification sender by name + description: | + This API provides the capability to delete a push notification sender by name. + The URL encoded push notification sender name is used as sender-name.
      + + Scope(Permission) required: `internal_notification_senders_delete` + operationId: deletePushSender + parameters: + - name: sender-name + in: path + description: name of the push notification sender + required: true + style: simple + explode: false + schema: + type: string + responses: + "204": + description: No Content + "400": + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Unauthorized + "403": + description: Forbidden + "404": + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "405": + description: Method Not Allowed. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'DELETE' \ + 'https://api.asgardeo.io/t/{tenant-domain}/api/server/v2/notification-senders/push/{push-sender-name}' \ + -H 'accept: */*' \ + -H 'Authorization: Bearer {bearer_token}' +components: + schemas: + Error: + type: object + properties: + code: + type: string + example: NSM-00000 + message: + type: string + example: Some Error Message + description: + type: string + example: Some Error Description + traceId: + type: string + example: e0fbcfeb-3617-43c4-8dd0-7b7d38e13047 + SMTPBasedEmailSenderAdd: + type: object + properties: + name: + type: string + provider: + type: string + example: SMTP + smtpServerHost: + type: string + smtpPort: + type: integer + fromAddress: + type: string + example: iam@gmail.com + authType: + type: string + example: CLIENT_CREDENTIAL + properties: + type: array + example: + - key: body.scope + value: "true" + - key: mail.smtp.starttls.enable + value: true + - key: clientId + value: "3e172dd2-901b-43a9-a26a-728466795f01" + - key: clientSecret + value: "83cdc120-ccf6-4163-a4a8-c1ba3e872daa" + - key: tokenEndpoint + value: "https://login.microsoftonline.com/da76d684-740f-4d94-8717-9d5fb21dd1f9/oauth2/v2.0/token" + - key: scopes + value: "https://graph.microsoft.com/.default" + items: + $ref: '#/components/schemas/Properties' + HTTPBasedEmailSenderAdd: + type: object + properties: + name: + type: string + provider: + type: string + example: HTTP + providerURL: + type: string + example: https://custom.email.provider/send + authType: + type: string + example: BASIC + properties: + type: array + example: + - key: http.client.method + value: POST + - key: contentType + value: JSON + - key: http.headers + value: "X-Version: 1, Header1: value1" + - key: body + value: "{\"subject\": \"{{subject}}\", \"body\": \"{{body}}\", \"footer\": \"{{footer}}\", \"to\": \"{{send-to}}\"}" + - key: clientId + value: "3e172dd2-901b-43a9-a26a-728466795f01" + - key: clientSecret + value: "83cdc120-ccf6-4163-a4a8-c1ba3e872daa" + - key: tokenEndpoint + value: "https://login.microsoftonline.com/da76d684-740f-4d94-8717-9d5fb21dd1f9/oauth2/v2.0/token" + - key: scopes + value: "https://graph.microsoft.com/.default" + items: + $ref: '#/components/schemas/Properties' + SMSSenderAdd: + required: + - provider + - contentType + type: object + properties: + name: + type: string + example: SMSPublisher + provider: + type: string + example: NEXMO + providerURL: + type: string + example: https://rest.nexmo.com/sms/json + key: + type: string + example: 123**45 + secret: + type: string + example: 5tg**ssd + authentication: + $ref: '#/components/schemas/Authentication' + sender: + type: string + example: +94 775563324 + contentType: + type: string + enum: + - JSON + - FORM + properties: + type: array + example: + - key: http.headers + value: "X-Version: 1, Authorization: bearer ,Accept: application/json ,Content-Type: application/json" + items: + $ref: '#/components/schemas/Properties' + PushSenderAdd: + required: + - provider + - properties + type: object + properties: + name: + type: string + example: PushPublisher + provider: + type: string + example: fcm + properties: + type: array + example: + - key: fcm.serviceAccount + value: jsonString + - key: aws.keyId + value: sampleKeyId + items: + $ref: '#/components/schemas/Properties' + EmailSender: + required: + - name + type: object + properties: + name: + type: string + example: EmailPublisher + provider: + type: string + example: SMTP + providerURL: + type: string + example: https://custom.email.provider/send + smtpServerHost: + type: string + example: smtp.gmail.com + smtpPort: + type: integer + example: 587 + fromAddress: + type: string + example: iam@gmail.com + authType: + type: string + example: BASIC + properties: + type: array + example: + - key: mail.smtp.starttls.enable + value: true + items: + $ref: '#/components/schemas/Properties' + SMSSender: + required: + - providerURL + - name + - provider + - contentType + type: object + properties: + name: + type: string + example: SMSPublisher + provider: + type: string + example: NEXMO + providerURL: + type: string + example: https://rest.nexmo.com/sms/json + key: + type: string + example: 123**45 + secret: + type: string + example: 5tg**ssd + sender: + type: string + example: +94 775563324 + authentication: + $ref: '#/components/schemas/Authentication' + contentType: + type: string + enum: + - JSON + - FORM + properties: + type: array + example: + - key: body.scope + value: "internal" + - key: http.headers + value: "X-Version: 1, Authorization: bearer ,Accept: application/json ,Content-Type: application/json" + items: + $ref: '#/components/schemas/Properties' + PushSender: + required: + - provider + - name + properties: + name: + type: string + example: PushPublisher + provider: + type: string + example: fcm + properties: + type: array + example: + - key: fcm.serviceAccount + value: "jsonString" + - key: aws.keyId + value: "sampleKeyId" + items: + $ref: '#/components/schemas/Properties' + SMTPBasedEmailSenderUpdate: + type: object + properties: + provider: + type: string + example: SMTP + smtpServerHost: + type: string + smtpPort: + type: integer + fromAddress: + type: string + example: iam@gmail.com + authType: + type: string + example: CLIENT_CREDENTIAL + properties: + type: array + example: + - key: body.scope + value: "true" + - key: mail.smtp.starttls.enable + value: true + - key: clientId + value: "3e172dd2-901b-43a9-a26a-728466795f01" + - key: clientSecret + value: "83cdc120-ccf6-4163-a4a8-c1ba3e872daa" + - key: tokenEndpoint + value: "https://login.microsoftonline.com/da76d684-740f-4d94-8717-9d5fb21dd1f9/oauth2/v2.0/token" + - key: scopes + value: "https://graph.microsoft.com/.default" + items: + $ref: '#/components/schemas/Properties' + HTTPBasedEmailSenderUpdate: + type: object + properties: + provider: + type: string + example: HTTP + providerURL: + type: string + example: https://custom.email.provider/send + authType: + type: string + example: BASIC + properties: + type: array + example: + - key: http.client.method + value: POST + - key: contentType + value: JSON + - key: http.headers + value: "X-Version: 1, Header1: value1" + - key: body + value: "{\"subject\": \"{{subject}}\", \"body\": \"{{body}}\", \"footer\": \"{{footer}}\", \"to\": \"{{send-to}}\"}" + - key: clientId + value: "3e172dd2-901b-43a9-a26a-728466795f01" + - key: clientSecret + value: "83cdc120-ccf6-4163-a4a8-c1ba3e872daa" + - key: tokenEndpoint + value: "https://login.microsoftonline.com/da76d684-740f-4d94-8717-9d5fb21dd1f9/oauth2/v2.0/token" + - key: scopes + value: "https://graph.microsoft.com/.default" + items: + $ref: '#/components/schemas/Properties' + SMSSenderUpdateRequest: + required: + - provider + - contentType + type: object + properties: + provider: + type: string + example: NEXMO + providerURL: + type: string + example: https://rest.nexmo.com/sms/json + key: + type: string + example: 123**45 + secret: + type: string + example: 5tg**ssd + authentication: + $ref: '#/components/schemas/Authentication' + sender: + type: string + example: +94 775563324 + contentType: + type: string + enum: + - JSON + - FORM + properties: + type: array + example: + - key: http.headers + value: "X-Version: 1, Authorization: bearer ,Accept: application/json ,Content-Type: application/json" + items: + $ref: '#/components/schemas/Properties' + PushSenderUpdateRequest: + required: + - provider + - properties + type: object + properties: + provider: + type: string + properties: + type: array + example: + - key: fcm.serviceAccount + value: "jsonString" + - key: aws.keyId + value: "sampleKeyId" + items: + $ref: '#/components/schemas/Properties' + Properties: + required: + - key + - value + type: object + properties: + key: + type: string + value: + type: string + example: + - key: email + value: iam@gmail.com + EmailProviderList: + type: array + items: + $ref: '#/components/schemas/EmailSender' + SMSProviderList: + type: array + items: + $ref: '#/components/schemas/SMSSender' + PushProviderList: + type: array + items: + $ref: '#/components/schemas/PushSender' + Schema: + type: object + properties: + id: + type: integer + format: int64 + Authentication: + type: object + description: > + The type of authentication required by the action's endpoint. The following options are supported: + + - CLIENT_CREDENTIAL: Client credential authentication.
      + ``{ + "type": "CLIENT_CREDENTIAL", + "properties": { + "clientId": "3e172dd2-901b-43a9-a26a-728466795f01", + "clientSecret": "83cdc120-ccf6-4163-a4a8-c1ba3e872daa", + "tokenEndpoint": "https://custom.sms.provider/auth/token", + "scopes": "send_scope" + } + }`` + + - BASIC: Username and password based authentication.
      + ``{ + "type": "BASIC", + "properties": { + "username": "admin", + "password": "admin123" + } + }`` + - BEARER: Token based based authentication.
      + ``{ + "type": "BEARER", + "properties": { + "token": "dummy-token" + } + }`` + - API_KEY: API key secret based authentication.
      + ``{ + "type": "API_KEY", + "properties": { + "header": "auth", + "value": "123ert45" + } + }`` + required: + - type + properties: + type: + type: string + enum: + - CLIENT_CREDENTIAL + - BASIC + - BEARER + - API_KEY + - NONE + example: CLIENT_CREDENTIAL + properties: + type: object + description: Authentication properties specific to the selected type. + additionalProperties: true + example: + type: CLIENT_CREDENTIAL + properties: + clientId: 3e172dd2-901b-43a9-a26a-728466795f01 + clientSecret: 83cdc120-ccf6-4163-a4a8-c1ba3e872daa + tokenEndpoint: https://custom.sms.provider/auth/token + scopes: send_scope + parameters: + typeQueryParam: + name: type + in: query + description: | + Type of authenticators. Can be either 'LOCAL' or 'REQUEST_PATH' + required: false + style: form + explode: true + schema: + type: string + securitySchemes: + BasicAuth: + type: http + scheme: basic + OAuth2: + type: oauth2 + flows: + authorizationCode: + authorizationUrl: https://api.asgardeo.io/t/{tenant-domain}/oauth2/authorize + tokenUrl: https://api.asgardeo.io/t/{tenant-domain}/oauth2/token + scopes: {} + examples: + SMTPBasedEmailSenderClientCredentialPOSTRequestExample: + summary: "Post request for SMTP based email providers with client credential authentication" + value: + name: "EmailPublisher" + provider: "SMTP" + smtpServerHost: "smtp.gmail.com" + smtpPort: 587 + fromAddress: "test@gmail.com" + authType: "CLIENT_CREDENTIAL" + properties: + - key: "mail.smtp.signature" + value: "Identity Server" + - key: "clientId" + value: "3e172dd2-901b-43a9-a26a-728466795f01" + - key: "clientSecret" + value: "83cdc120-ccf6-4163-a4a8-c1ba3e872daa" + - key: "tokenEndpoint" + value: "https://login.microsoftonline.com/da84-740f-9d5ff9/oauth2/token" + - key: "scopes" + value: "https://graph.microsoft.com/.default" + SMTPBasedEmailSenderBasicAuthWithAuthTypePOSTRequestExample: + summary: "Post request for SMTP based email providers with basic authentication" + value: + name: "EmailPublisher" + provider: "SMTP" + smtpServerHost: "smtp.gmail.com" + smtpPort: 587 + fromAddress: "test@gmail.com" + authType: "BASIC" + properties: + - key: "mail.smtp.signature" + value: "Identity Server" + - key: "userName" + value: "iam" + - key: "password" + value: "iam123" + HTTPBasedEmailSenderWithBasicAuthTypePOSTRequestExample: + summary: "Post request for HTTP based email providers with basic authentication" + value: + name: "EmailPublisher" + provider: "HTTP" + providerURL: "https://api.example.com/api/v1" + authType: "BASIC" + properties: + - key: "http.client.method" + value: "POST" + - key: contentType + value: "JSON" + - key: "http.headers" + value: "X-Version: 1, Custom-Header: value" + - key: "body" + value: "{\"subject\": \"{{subject}}\", \"body\": \"{{body}}\", \"footer\": \"{{footer}}\", \"to\": \"{{send-to}}\"}" + - key: "userName" + value: "iam" + - key: "password" + value: "iam123" + HTTPBasedEmailSenderWithClientCredentialAuthTypePOSTRequestExample: + summary: "Post request for HTTP based email providers with client credential authentication" + value: + name: "EmailPublisher" + provider: "HTTP" + providerURL: "https://api.example.com/api/v1" + authType: "CLIENT_CREDENTIAL" + properties: + - key: "http.client.method" + value: "POST" + - key: contentType + value: "JSON" + - key: "http.headers" + value: "X-Version: 1, Custom-Header: value" + - key: "body" + value: "{\"subject\": \"{{subject}}\", \"body\": \"{{body}}\", \"footer\": \"{{footer}}\", \"to\": \"{{send-to}}\"}" + - key: "clientId" + value: "client-id-123" + - key: "clientSecret" + value: "client-secret-abc" + - key: "tokenEndpoint" + value: "https://example.com/oauth2/token" + - key: "scopes" + value: "send_scope" + HTTPBasedEmailSenderWithBearerTokenAuthTypePOSTRequestExample: + summary: "Post request for HTTP based email providers with bearer token authentication" + value: + name: "EmailPublisher" + provider: "HTTP" + providerURL: "https://api.example.com/api/v1" + authType: "BEARER" + properties: + - key: "http.client.method" + value: "POST" + - key: contentType + value: "JSON" + - key: "http.headers" + value: "X-Version: 1, Custom-Header: value" + - key: "body" + value: "{\"subject\": \"{{subject}}\", \"body\": \"{{body}}\", \"footer\": \"{{footer}}\", \"to\": \"{{send-to}}\"}" + - key: "accessToken" + value: "bearer-token" + HTTPBasedEmailSenderWithAPIKeyAuthTypePOSTRequestExample: + summary: "Post request for HTTP based email providers with API key authentication" + value: + name: "EmailPublisher" + provider: "HTTP" + providerURL: "https://api.example.com/api/v1" + authType: "API_KEY" + properties: + - key: "http.client.method" + value: "POST" + - key: contentType + value: "JSON" + - key: "http.headers" + value: "X-Version: 1, Custom-Header: value" + - key: "body" + value: "{\"subject\": \"{{subject}}\", \"body\": \"{{body}}\", \"footer\": \"{{footer}}\", \"to\": \"{{send-to}}\"}" + - key: "apiKeyHeader" + value: "API-Key-Header" + - key: "apiKeyValue" + value: "api-key-value" + HTTPBasedEmailSenderWithNoneAuthTypePOSTRequestExample: + summary: "Post request for HTTP based email providers with no authentication" + value: + name: "EmailPublisher" + provider: "HTTP" + providerURL: "https://api.example.com/api/v1" + authType: "NONE" + properties: + - key: "http.client.method" + value: "POST" + - key: contentType + value: "JSON" + - key: "http.headers" + value: "X-Version: 1, Custom-Header: value" + - key: "body" + value: "{\"subject\": \"{{subject}}\", \"body\": \"{{body}}\", \"footer\": \"{{footer}}\", \"to\": \"{{send-to}}\"}" + SMTPBasedEmailSenderClientCredentialPUTRequestExample: + summary: "Put request for SMTP based email providers with client credential authentication" + value: + provider: "SMTP" + smtpServerHost: "smtp.gmail.com" + smtpPort: 587 + fromAddress: "test@gmail.com" + authType: "CLIENT_CREDENTIAL" + properties: + - key: "mail.smtp.signature" + value: "Identity Server" + - key: "clientId" + value: "3e172dd2-901b-43a9-a26a-728466795f01" + - key: "clientSecret" + value: "83cdc120-ccf6-4163-a4a8-c1ba3e872daa" + - key: "tokenEndpoint" + value: "https://login.microsoftonline.com/da84-740f-9d5ff9/oauth2/token" + - key: "scopes" + value: "https://graph.microsoft.com/.default" + SMTPBasedEmailSenderBasicAuthWithAuthTypePUTRequestExample: + summary: "Put request for SMTP based email providers with basic authentication" + value: + provider: "SMTP" + smtpServerHost: "smtp.gmail.com" + smtpPort: 587 + fromAddress: "test@gmail.com" + authType: "BASIC" + properties: + - key: "mail.smtp.signature" + value: "Identity Server" + - key: "userName" + value: "iam" + - key: "password" + value: "iam123" + HTTPBasedEmailSenderWithBasicAuthTypePUTRequestExample: + summary: "Put request for HTTP based email providers with basic authentication" + value: + provider: "HTTP" + providerURL: "https://api.example.com/api/v1" + authType: "BASIC" + properties: + - key: "http.client.method" + value: "POST" + - key: contentType + value: "JSON" + - key: "http.headers" + value: "X-Version: 1, Custom-Header: value" + - key: "body" + value: "{\"subject\": \"{{subject}}\", \"body\": \"{{body}}\", \"footer\": \"{{footer}}\", \"to\": \"{{send-to}}\"}" + - key: "userName" + value: "iam" + - key: "password" + value: "iam123" + HTTPBasedEmailSenderWithClientCredentialAuthTypePUTRequestExample: + summary: "Put request for HTTP based email providers with client credential authentication" + value: + provider: "HTTP" + providerURL: "https://api.example.com/api/v1" + authType: "CLIENT_CREDENTIAL" + properties: + - key: "http.client.method" + value: "POST" + - key: contentType + value: "JSON" + - key: "http.headers" + value: "X-Version: 1, Custom-Header: value" + - key: "body" + value: "{\"subject\": \"{{subject}}\", \"body\": \"{{body}}\", \"footer\": \"{{footer}}\", \"to\": \"{{send-to}}\"}" + - key: "clientId" + value: "client-id-123" + - key: "clientSecret" + value: "client-secret-abc" + - key: "tokenEndpoint" + value: "https://example.com/oauth2/token" + - key: "scopes" + value: "send_scope" + HTTPBasedEmailSenderWithBearerTokenAuthTypePUTRequestExample: + summary: "Put request for HTTP based email providers with bearer token authentication" + value: + provider: "HTTP" + providerURL: "https://api.example.com/api/v1" + authType: "BEARER" + properties: + - key: "http.client.method" + value: "POST" + - key: contentType + value: "JSON" + - key: "http.headers" + value: "X-Version: 1, Custom-Header: value" + - key: "body" + value: "{\"subject\": \"{{subject}}\", \"body\": \"{{body}}\", \"footer\": \"{{footer}}\", \"to\": \"{{send-to}}\"}" + - key: "accessToken" + value: "bearer-token" + HTTPBasedEmailSenderWithAPIKeyAuthTypePUTRequestExample: + summary: "Put request for HTTP based email providers with API key authentication" + value: + provider: "HTTP" + providerURL: "https://api.example.com/api/v1" + authType: "API_KEY" + properties: + - key: "http.client.method" + value: "POST" + - key: contentType + value: "JSON" + - key: "http.headers" + value: "X-Version: 1, Custom-Header: value" + - key: "body" + value: "{\"subject\": \"{{subject}}\", \"body\": \"{{body}}\", \"footer\": \"{{footer}}\", \"to\": \"{{send-to}}\"}" + - key: "apiKeyHeader" + value: "API-Key-Header" + - key: "apiKeyValue" + value: "api-key-value" + HTTPBasedEmailSenderWithNoneAuthTypePUTRequestExample: + summary: "Put request for HTTP based email providers with no authentication" + value: + provider: "HTTP" + providerURL: "https://api.example.com/api/v1" + authType: "NONE" + properties: + - key: "http.client.method" + value: "POST" + - key: contentType + value: "JSON" + - key: "http.headers" + value: "X-Version: 1, Custom-Header: value" + - key: "body" + value: "{\"subject\": \"{{subject}}\", \"body\": \"{{body}}\", \"footer\": \"{{footer}}\", \"to\": \"{{send-to}}\"}" + SMTPBasedEmailSenderWithClientCredentialAuthTypeResponseExample: + summary: "Response for SMTP based email providers with client credential authentication" + value: + name: "EmailPublisher" + provider: "SMTP" + smtpServerHost: "smtp.gmail.com" + smtpPort: 587 + fromAddress: "test@gmail.com" + authType: "CLIENT_CREDENTIAL" + properties: + - key: "mail.smtp.signature" + value: "Identity Server" + - key: "clientId" + value: "3e172dd2-901b-43a9-a26a-728466795f01" + - key: "tokenEndpoint" + value: "https://login.microsoftonline.com/da84-740f-9d5ff9/oauth2/token" + - key: "scopes" + value: "https://graph.microsoft.com/.default" + SMTPBasedEmailSenderWithBasicAuthTypeResponseExample: + summary: "Response for SMTP based email providers with basic authentication" + value: + name: "EmailPublisher" + provider: "SMTP" + smtpServerHost: "smtp.gmail.com" + smtpPort: 587 + fromAddress: "test@gmail.com" + authType: "BASIC" + properties: + - key: "mail.smtp.signature" + value: "Identity Server" + - key: "userName" + value: "iam" + HTTPBasedEmailSenderWithBasicAuthTypeResponseExample: + summary: "Response for HTTP based email providers with basic authentication" + value: + name: "EmailPublisher" + provider: "HTTP" + providerURL: "https://api.example.com/api/v1" + authType: "BASIC" + properties: + - key: "http.client.method" + value: "POST" + - key: contentType + value: "JSON" + - key: "http.headers" + value: "X-Version: 1, Custom-Header: value" + - key: "body" + value: "{\"subject\": \"{{subject}}\", \"body\": \"{{body}}\", \"footer\": \"{{footer}}\", \"to\": \"{{send-to}}\"}" + - key: "userName" + value: "iam" + HTTPBasedEmailSenderWithClientCredentialAuthTypeResponseExample: + summary: "Response for HTTP based email providers with client credential authentication" + value: + name: "EmailPublisher" + provider: "HTTP" + providerURL: "https://api.example.com/api/v1" + authType: "CLIENT_CREDENTIAL" + properties: + - key: "http.client.method" + value: "POST" + - key: contentType + value: "JSON" + - key: "http.headers" + value: "X-Version: 1, Custom-Header: value" + - key: "body" + value: "{\"subject\": \"{{subject}}\", \"body\": \"{{body}}\", \"footer\": \"{{footer}}\", \"to\": \"{{send-to}}\"}" + - key: "clientId" + value: "client-id-123" + - key: "tokenEndpoint" + value: "https://example.com/oauth2/token" + - key: "scopes" + value: "send_scope" + HTTPBasedEmailSenderWithBearerTokenAuthTypeResponseExample: + summary: "Response for HTTP based email providers with bearer token authentication" + value: + name: "EmailPublisher" + provider: "HTTP" + providerURL: "https://api.example.com/api/v1" + authType: "BEARER" + properties: + - key: "http.client.method" + value: "POST" + - key: contentType + value: "JSON" + - key: "http.headers" + value: "X-Version: 1, Custom-Header: value" + - key: "body" + value: "{\"subject\": \"{{subject}}\", \"body\": \"{{body}}\", \"footer\": \"{{footer}}\", \"to\": \"{{send-to}}\"}" + HTTPBasedEmailSenderWithAPIKeyAuthTypeResponseExample: + summary: "Response for HTTP based email providers with API key authentication" + value: + name: "EmailPublisher" + provider: "HTTP" + providerURL: "https://api.example.com/api/v1" + authType: "API_KEY" + properties: + - key: "http.client.method" + value: "POST" + - key: contentType + value: "JSON" + - key: "http.headers" + value: "X-Version: 1, Custom-Header: value" + - key: "body" + value: "{\"subject\": \"{{subject}}\", \"body\": \"{{body}}\", \"footer\": \"{{footer}}\", \"to\": \"{{send-to}}\"}" + - key: "apiKeyHeader" + value: "API-Key-Header" + HTTPBasedEmailSenderWithNoneAuthTypeResponseExample: + summary: "Response for HTTP based email providers with no authentication" + value: + name: "EmailPublisher" + provider: "HTTP" + providerURL: "https://api.example.com/api/v1" + authType: "NONE" + properties: + - key: "http.client.method" + value: "POST" + - key: contentType + value: "JSON" + - key: "http.headers" + value: "X-Version: 1, Custom-Header: value" + - key: "body" + value: "{\"subject\": \"{{subject}}\", \"body\": \"{{body}}\", \"footer\": \"{{footer}}\", \"to\": \"{{send-to}}\"}" + SMTPBasedEmailSenderWithBasicAuthTypeListResponseExample: + summary: "List response containing an SMTP-based email provider with basic authentication" + value: + - name: "EmailPublisher" + provider: "SMTP" + smtpServerHost: "smtp.gmail.com" + smtpPort: 587 + fromAddress: "test@gmail.com" + authType: "BASIC" + properties: + - key: "mail.smtp.signature" + value: "Identity Server" + - key: "userName" + value: "iam" + SMTPBasedEmailSenderWithClientCredentialAuthTypeListResponseExample: + summary: "List response containing an SMTP-based email provider with client credential authentication" + value: + - name: "EmailPublisher" + provider: "SMTP" + smtpServerHost: "smtp.gmail.com" + smtpPort: 587 + fromAddress: "test@gmail.com" + authType: "CLIENT_CREDENTIAL" + properties: + - key: "mail.smtp.signature" + value: "Identity Server" + - key: "clientId" + value: "3e172dd2-901b-43a9-a26a-728466795f01" + - key: "tokenEndpoint" + value: "https://login.microsoftonline.com/da84-740f-9d5ff9/oauth2/token" + - key: "scopes" + value: "https://graph.microsoft.com/.default" + HTTPBasedEmailSenderWithBasicAuthTypeListResponseExample: + summary: "List response containing an HTTP-based email provider with basic authentication" + value: + - name: "EmailPublisher" + provider: "HTTP" + providerURL: "https://api.example.com/api/v1" + authType: "BASIC" + properties: + - key: "http.client.method" + value: "POST" + - key: contentType + value: "JSON" + - key: "http.headers" + value: "X-Version: 1, Custom-Header: value" + - key: "body" + value: "{\"subject\": \"{{subject}}\", \"body\": \"{{body}}\", \"footer\": \"{{footer}}\", \"to\": \"{{send-to}}\"}" + - key: "userName" + value: "iam" + HTTPBasedEmailSenderWithClientCredentialAuthTypeListResponseExample: + summary: "List response containing an HTTP-based email provider with client credential authentication" + value: + - name: "EmailPublisher" + provider: "HTTP" + providerURL: "https://api.example.com/api/v1" + authType: "CLIENT_CREDENTIAL" + properties: + - key: "http.client.method" + value: "POST" + - key: contentType + value: "JSON" + - key: "http.headers" + value: "X-Version: 1, Custom-Header: value" + - key: "body" + value: "{\"subject\": \"{{subject}}\", \"body\": \"{{body}}\", \"footer\": \"{{footer}}\", \"to\": \"{{send-to}}\"}" + - key: "clientId" + value: "client-id-123" + - key: "tokenEndpoint" + value: "https://example.com/oauth2/token" + - key: "scopes" + value: "send_scope" + HTTPBasedEmailSenderWithBearerTokenAuthTypeListResponseExample: + summary: "List response containing an HTTP-based email provider with bearer token authentication" + value: + - name: "EmailPublisher" + provider: "HTTP" + providerURL: "https://api.example.com/api/v1" + authType: "BEARER" + properties: + - key: "http.client.method" + value: "POST" + - key: contentType + value: "JSON" + - key: "http.headers" + value: "X-Version: 1, Custom-Header: value" + - key: "body" + value: "{\"subject\": \"{{subject}}\", \"body\": \"{{body}}\", \"footer\": \"{{footer}}\", \"to\": \"{{send-to}}\"}" + - key: "accessToken" + value: "bearer-token" + HTTPBasedEmailSenderWithAPIKeyAuthTypeListResponseExample: + summary: "List response containing an HTTP-based email provider with API key authentication" + value: + - name: "EmailPublisher" + provider: "HTTP" + providerURL: "https://api.example.com/api/v1" + authType: "API_KEY" + properties: + - key: "http.client.method" + value: "POST" + - key: contentType + value: "JSON" + - key: "http.headers" + value: "X-Version: 1, Custom-Header: value" + - key: "body" + value: "{\"subject\": \"{{subject}}\", \"body\": \"{{body}}\", \"footer\": \"{{footer}}\", \"to\": \"{{send-to}}\"}" + - key: "apiKeyHeader" + value: "API-Key-Header" + - key: "apiKeyValue" + value: "api-key-value" + HTTPBasedEmailSenderWithNoneAuthTypeListResponseExample: + summary: "List response containing an HTTP-based email provider with no authentication" + value: + - name: "EmailPublisher" + provider: "HTTP" + providerURL: "https://api.example.com/api/v1" + authType: "NONE" + properties: + - key: "http.client.method" + value: "POST" + - key: contentType + value: "JSON" + - key: "http.headers" + value: "X-Version: 1, Custom-Header: value" + - key: "body" + value: "{\"subject\": \"{{subject}}\", \"body\": \"{{body}}\", \"footer\": \"{{footer}}\", \"to\": \"{{send-to}}\"}" + TwilioSMSProviderRequestExample: + summary: Post and PUT request for Twilio SMS Provider + value: + provider: Twilio + sender: +94 775563324 + type : json + properties: + - key: body.scope + value: "internal" + - key: http.headers + value: "X-Version: 1, Accept: application/json, Content-Type: application/json" + authentication: + type: BASIC + properties: + username: "123ert45" + password: "5tg-rts-ssd" + VonageSMSProviderRequestExample: + summary: Post and PUT request for Vonage SMS Provider + value: + provider: Vonage + sender: +94 775563324 + type : json + properties: + - key: body.scope + value: "internal" + - key: http.headers + value: "X-Version: 1, Accept: application/json, Content-Type: application/json" + authentication: + type: BASIC + properties: + username: "123ert45" + password: "5tg-rts-ssd" + CustomSMSProviderRequestExample: + summary: Post and PUT request for Custom SMS Provider + value: + provider: Custom + sender: +94 775563324 + type : json + properties: + - key: body.scope + value: "internal" + - key: http.headers + value: "X-Version: 1, Accept: application/json, Content-Type: application/json" + authentication: + type: CLIENT_CREDENTIAL + properties: + clientId: 3e172dd2-901b-43a9-a26a-728466795f01 + clientSecret: 83cdc120-ccf6-4163-a4a8-c1ba3e872daa + tokenEndpoint: https://custom.sms.provider/auth/token + scopes: send_scope + TwilioSMSProviderResponseExample: + summary: Response for Twilio SMS Provider + value: + name: SMSPublisher + provider: Twilio + key: 123ert45 + secret: 5tg-rts-ssd + sender: +94 775563324 + type : json + properties: + - key: body.scope + value: "internal" + - key: http.headers + value: "X-Version: 1, Accept: application/json, Content-Type: application/json" + authentication: + type: BASIC + properties: + username: "123ert45" + password: "5tg-rts-ssd" + VonageSMSProviderResponseExample: + summary: Response for Vonage SMS Provider + value: + name: SMSPublisher + provider: Vonage + key: 123ert45 + secret: 5tg-rts-ssd + sender: +94 775563324 + type : json + properties: + - key: body.scope + value: "internal" + - key: http.headers + value: "X-Version: 1, Accept: application/json, Content-Type: application/json" + authentication: + type: BASIC + properties: + username: "123ert45" + password: "5tg-rts-ssd" + CustomSMSProviderResponseExample: + summary: Response for Custom SMS Provider + description: This document specifies a **RESTful API** for **WSO2 Identity Server Notification Senders** + value: + name: SMSPublisher + provider: Custom + key: "" + secret: "" + sender: +94 775563324 + type : json + properties: + - key: body.scope + value: "internal" + - key: http.headers + value: "X-Version: 1, Accept: application/json, Content-Type: application/json" + authentication: + type: CLIENT_CREDENTIAL + properties: + clientId: 3e172dd2-901b-43a9-a26a-728466795f01 + clientSecret: 83cdc120-ccf6-4163-a4a8-c1ba3e872daa + tokenEndpoint: https://custom.sms.provider/auth/token + scopes: send_scope + SMSProvidersListResponseExample: + summary: Response for list of SMS Provider + value: + - name: SMSPublisher + provider: Custom + key: "" + secret: "" + sender: +94 775563324 + type : json + properties: + - key: body.scope + value: "internal" + - key: http.headers + value: "X-Version: 1, Accept: application/json, Content-Type: application/json" + authentication: + type: CLIENT_CREDENTIAL + properties: + clientId: 3e172dd2-901b-43a9-a26a-728466795f01 + clientSecret: 83cdc120-ccf6-4163-a4a8-c1ba3e872daa + tokenEndpoint: https://custom.sms.provider/auth/token + scopes: send_scope diff --git a/docusaurus-asgardeo/static/apis/restapis/notification-senders.yaml b/docusaurus-asgardeo/static/apis/restapis/notification-senders.yaml new file mode 100644 index 0000000000..456a7d793c --- /dev/null +++ b/docusaurus-asgardeo/static/apis/restapis/notification-senders.yaml @@ -0,0 +1,1360 @@ +openapi: 3.0.0 +info: + title: Notification Senders API + description: This document specifies **Email, SMS and Push notification sender RESTful API** for **Asgardeo** + version: "v1" +servers: + - url: https://{serverUrl}/t/{tenantDomain}/api/server/v1 + variables: + serverUrl: + default: api.asgardeo.io +security: + - OAuth2: [] +paths: + /notification-senders/email: + get: + tags: + - Email Senders + summary: Get a list of email senders + description: | + This API provides the capability to retrieve the list of email senders.
      + + Scope(Permission) required: `internal_notification_senders_view` + operationId: getEmailSenders + responses: + "200": + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/EmailProviderList' + "400": + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Unauthorized + "403": + description: Forbidden + "404": + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "405": + description: Method Not Allowed. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{tenant-domain}/api/server/v1/notification-senders/email' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + post: + tags: + - Email Senders + summary: Create an email sender + description: | + This API provides the capability to create an email sender.\n\nIf the 'name' is not not defined, 'EmailPublisher' is taken as the default name.
      + + Scope(Permission) required: `internal_notification_senders_create` + operationId: createEmailSender + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/EmailSenderAdd' + example: + fromAddress: iam@gmail.com + userName: iam + password: iam123 + properties: + - key: mail.smtp.starttls.enable + value: true + responses: + "201": + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/EmailSender' + "400": + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Unauthorized + "403": + description: Forbidden + "404": + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "405": + description: Method Not Allowed. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "409": + description: Conflict + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{tenant-domain}/api/server/v1/notification-senders/email' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -H 'Content-Type: application/json' \ + -d '{ + "fromAddress": "iam@gmail.com", + "userName": "iam", + "password": "iam123", + "properties": [ + { + "key": "mail.smtp.starttls.enable", + "value": true + } + ] + }' + /notification-senders/email/{sender-name}: + get: + tags: + - Email Senders + summary: Retrieve an email sender by name + description: | + This API provides the capability to retrieve an email sender by name. + The URL encoded email sender name is used as sender-name.
      + + Scope(Permission) required: `internal_notification_senders_view` + operationId: getEmailSender + parameters: + - name: sender-name + in: path + description: name of the email sender + required: true + style: simple + explode: false + schema: + type: string + responses: + "200": + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/EmailSender' + "400": + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Unauthorized + "403": + description: Forbidden + "404": + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "405": + description: Method Not Allowed. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{tenant-domain}/api/server/v1/notification-senders/email/{email-sender-name}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + put: + tags: + - Email Senders + summary: Update an email sender + description: | + This API provides the capability to update an email sender by name. + The URL encoded email sender name is used as sender-name.
      + + Scope(Permission) required: `internal_notification_senders_update` + operationId: updateEmailSender + parameters: + - name: sender-name + in: path + description: name of the email sender + required: true + style: simple + explode: false + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/EmailSenderUpdateRequest' + example: + fromAddress: iam@gmail.com + userName: iam + password: iam123 + properties: + - key: mail.smtp.starttls.enable + value: true + required: true + responses: + "200": + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/EmailSender' + "400": + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Unauthorized + "403": + description: Forbidden + "404": + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "405": + description: Method Not Allowed. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PUT' \ + 'https://api.asgardeo.io/t/{tenant-domain}/api/server/v1/notification-senders/email/{email-sender-name}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -H 'Content-Type: application/json' \ + -d '{ + "fromAddress": "iam@gmail.com", + "userName": "iam", + "password": "iam123", + "properties": [ + { + "key": "mail.smtp.starttls.enable", + "value": true + } + ] + }' + delete: + tags: + - Email Senders + summary: Delete an email sender by name + description: | + This API provides the capability to delete an email sender by name. + The URL encoded email sender name is used as sender-name.
      + + Scope(Permission) required: `internal_notification_senders_delete` + operationId: deleteEmailSender + parameters: + - name: sender-name + in: path + description: name of the email sender + required: true + style: simple + explode: false + schema: + type: string + responses: + "204": + description: No Content + "400": + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Unauthorized + "403": + description: Forbidden + "404": + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "405": + description: Method Not Allowed. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'DELETE' \ + 'https://api.asgardeo.io/t/{tenant-domain}/api/server/v1/notification-senders/email/{email-sender-name}' \ + -H 'accept: */*' \ + -H 'Authorization: Bearer {bearer_token}' + /notification-senders/sms: + get: + tags: + - SMS Senders + summary: Get a list of SMS senders + description: | + This API provides the capability to retrieve a list of SMS notification senders.
      + + Scope(Permission) required: `internal_notification_senders_view` + operationId: getSMSSenders + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/SMSProviderList' + "400": + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Unauthorized + "403": + description: Forbidden + "404": + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "405": + description: Method Not Allowed. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{tenant-domain}/api/server/v1/notification-senders/sms' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + post: + tags: + - SMS Senders + summary: Create a SMS sender + description: | + This API provides the capability to create a SMS sender. + If the 'name' is not not defined, 'SMSPublisher' is taken as the default name.
      + + Scope(Permission) required: `internal_notification_senders_create` + operationId: createSMSSender + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/SMSSenderAdd' + example: + provider: NEXMO + providerURL: https://rest.nexmo.com/sms/json + key: 123**45 + secret: 5tg**ssd + sender: +94 775563324 + type : json + properties: + - key: body.scope + value: "internal" + - key: http.headers + value: "X-Version: 1, Authorization: bearer ,Accept: application/json ,Content-Type: application/json" + responses: + "201": + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/SMSSender' + "400": + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Unauthorized + "403": + description: Forbidden + "404": + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "405": + description: Method Not Allowed. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "409": + description: Conflict + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{tenant-domain}/api/server/v1/notification-senders/sms' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -H 'Content-Type: application/json' \ + -d '{ + "provider": "NEXMO", + "providerURL": "https://rest.nexmo.com/sms/json", + "key": "123**45", + "secret": "5tg**ssd", + "sender": "+94 775563324", + "type": "json", + "properties": [ + { + "key": "body.scope", + "value": "internal" + }, + { + "key": "http.headers", + "value": "X-Version: 1, Authorization: bearer ,Accept: application/json ,Content-Type: application/json" + } + ] + }' + /notification-senders/sms/{sender-name}: + get: + tags: + - SMS Senders + summary: Get a SMS sender by name + description: | + This API provides the capability to retrieve a SMS notification sender by name. + The URL encoded SMS sender name is used as sender-name.
      + + Scope(Permission) required: `internal_notification_senders_view` + operationId: getSMSSender + parameters: + - name: sender-name + in: path + description: name of the SMS sender + required: true + style: simple + explode: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/SMSSender' + "400": + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Unauthorized + "403": + description: Forbidden + "404": + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "405": + description: Method Not Allowed. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{tenant-domain}/api/server/v1/notification-senders/sms/{sms-sender-name}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + put: + tags: + - SMS Senders + summary: Update a SMS sender + description: | + This API provides the capability to update a SMS Sender. + The URL encoded SMS sender name is used as sender-name.
      + + + Scope(Permission) required: `internal_notification_senders_update` + operationId: updateSMSSender + parameters: + - name: sender-name + in: path + description: name of the SMS sender + required: true + style: simple + explode: false + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/SMSSenderUpdateRequest' + example: + provider: NEXMO + providerURL: https://rest.nexmo.com/sms/json + key: 123**45 + secret: 5tg**ssd + sender: +94 775563324 + type : json + properties: + - key: body.scope + value: "internal" + - key: http.headers + value: "X-Version: 1, Authorization: bearer ,Accept: application/json ,Content-Type: application/json" + required: true + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/SMSSender' + "400": + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Unauthorized + "403": + description: Forbidden + "404": + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "405": + description: Method Not Allowed. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PUT' \ + 'https://api.asgardeo.io/t/{tenant-domain}/api/server/v1/notification-senders/sms/{sms-sender-name}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -H 'Content-Type: application/json' \ + -d '{ + "provider": "NEXMO", + "providerURL": "https://rest.nexmo.com/sms/json", + "key": "123**45", + "secret": "5tg**ssd", + "sender": "+94 775563324", + "type": "json", + "properties": [ + { + "key": "body.scope", + "value": "internal" + }, + { + "key": "http.headers", + "value": "X-Version: 1, Authorization: bearer ,Accept: application/json ,Content-Type: application/json" + } + ] + }' + delete: + tags: + - SMS Senders + summary: Delete a SMS sender by name + description: | + This API provides the capability to delete a SMS sender by name. + The URL encoded SMS sender name is used as sender-name.
      + + Scope(Permission) required: `internal_notification_senders_delete` + operationId: deleteSMSSender + parameters: + - name: sender-name + in: path + description: name of the SMS sender + required: true + style: simple + explode: false + schema: + type: string + responses: + "204": + description: No Content + "400": + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Unauthorized + "403": + description: Forbidden + "404": + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "405": + description: Method Not Allowed. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'DELETE' \ + 'https://api.asgardeo.io/t/{tenant-domain}/api/server/v1/notification-senders/sms/{sms-sender-name}' \ + -H 'accept: */*' \ + -H 'Authorization: Bearer {bearer_token}' + /notification-senders/push: + get: + tags: + - Push Senders + summary: Get a list of push notification senders + description: | + This API provides the capability to retrieve the list of push notification senders.
      + + Scope(Permission) required: `internal_notification_senders_view` + operationId: getPushSenders + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/PushProviderList' + "400": + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Unauthorized + "403": + description: Forbidden + "404": + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "405": + description: Method Not Allowed. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{tenant-domain}/api/server/v1/notification-senders/push' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + post: + tags: + - Push Senders + summary: Create a push notification sender + description: | + This API provides the capability to create a push notification sender. + If the 'name' is not not defined, 'PushPublisher' is taken as the default name.
      + + Scope(Permission) required: `internal_notification_senders_create` + operationId: createSMSSender + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PushSenderAdd' + example: + provider: FCM + properties: + - key: serviceAccountContent + value: "base64EncodedServiceAccountJsonString" + responses: + "201": + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/PushSender' + "400": + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Unauthorized + "403": + description: Forbidden + "404": + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "405": + description: Method Not Allowed. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "409": + description: Conflict + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{tenant-domain}/api/server/v1/notification-senders/push' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -H 'Content-Type: application/json' \ + -d '{ + "provider": "FCM", + "properties": [ + { + "key": "serviceAccountContent", + "value": "base64EncodedServiceAccountJsonString" + } + ] + }' + /notification-senders/push/{sender-name}: + get: + tags: + - Push Senders + summary: Get a push sender by name + description: | + This API provides the capability to retrieve a push notification sender by name. + The URL encoded push sender name is used as sender-name.
      + + Scope(Permission) required: `internal_notification_senders_view` + operationId: getPushSender + parameters: + - name: sender-name + in: path + description: name of the push sender + required: true + style: simple + explode: false + schema: + type: string + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/PushSender' + "400": + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Unauthorized + "403": + description: Forbidden + "404": + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "405": + description: Method Not Allowed. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{tenant-domain}/api/server/v1/notification-senders/push/{push-sender-name}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + put: + tags: + - Push Senders + summary: Update a push notification sender + description: | + This API provides the capability to update a push notification sender. + The URL encoded push notification sender name is used as sender-name.
      + + + Scope(Permission) required: `internal_notification_senders_update` + operationId: updatePushSender + parameters: + - name: sender-name + in: path + description: name of the push notification sender + required: true + style: simple + explode: false + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PushSenderUpdateRequest' + example: + provider: FCM + properties: + - key: serviceAccountContent + value: "base64EncodedServiceAccountJsonString" + required: true + responses: + "200": + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/PushSender' + "400": + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Unauthorized + "403": + description: Forbidden + "404": + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "405": + description: Method Not Allowed. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PUT' \ + 'https://api.asgardeo.io/t/{tenant-domain}/api/server/v1/notification-senders/push/{push-sender-name}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -H 'Content-Type: application/json' \ + -d '{ + "provider": "FCM", + "properties": [ + { + "key": "serviceAccountContent", + "value": "base64EncodedServiceAccountJsonString" + } + ] + }' + delete: + tags: + - Push Senders + summary: Delete a push notification sender by name + description: | + This API provides the capability to delete a push notification sender by name. + The URL encoded push notification sender name is used as sender-name.
      + + Scope(Permission) required: `internal_notification_senders_delete` + operationId: deletePushSender + parameters: + - name: sender-name + in: path + description: name of the push notification sender + required: true + style: simple + explode: false + schema: + type: string + responses: + "204": + description: No Content + "400": + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "401": + description: Unauthorized + "403": + description: Forbidden + "404": + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "405": + description: Method Not Allowed. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + "500": + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'DELETE' \ + 'https://api.asgardeo.io/t/{tenant-domain}/api/server/v1/notification-senders/push/{push-sender-name}' \ + -H 'accept: */*' \ + -H 'Authorization: Bearer {bearer_token}' +components: + schemas: + Error: + type: object + properties: + code: + type: string + example: NSM-00000 + message: + type: string + example: Some Error Message + description: + type: string + example: Some Error Description + traceId: + type: string + example: e0fbcfeb-3617-43c4-8dd0-7b7d38e13047 + EmailSenderAdd: + required: + - fromAddress + type: object + properties: + name: + type: string + smtpServerHost: + type: string + smtpPort: + type: integer + fromAddress: + type: string + example: iam@gmail.com + userName: + type: string + example: iam + password: + type: string + example: iam123 + properties: + type: array + example: + - key: body.scope + value: "true" + - key: mail.smtp.starttls.enable + value: true + items: + $ref: '#/components/schemas/Properties' + SMSSenderAdd: + required: + - providerURL + - provider + - contentType + type: object + properties: + name: + type: string + example: SMSPublisher + provider: + type: string + example: NEXMO + providerURL: + type: string + example: https://rest.nexmo.com/sms/json + key: + type: string + example: 123**45 + secret: + type: string + example: 5tg**ssd + sender: + type: string + example: +94 775563324 + contentType: + type: string + enum: + - JSON + - FORM + properties: + type: array + example: + - key: http.headers + value: "X-Version: 1, Authorization: bearer ,Accept: application/json ,Content-Type: application/json" + items: + $ref: '#/components/schemas/Properties' + PushSenderAdd: + required: + - provider + - properties + type: object + properties: + name: + type: string + example: PushPublisher + provider: + type: string + example: fcm + properties: + type: array + example: + - key: fcm.serviceAccount + value: jsonString + items: + $ref: '#/components/schemas/Properties' + EmailSender: + required: + - fromAddress + - name + type: object + properties: + name: + type: string + example: EmailPublisher + smtpServerHost: + type: string + example: smtp.gmail.com + smtpPort: + type: integer + example: 587 + fromAddress: + type: string + example: iam@gmail.com + userName: + type: string + example: iam + password: + type: string + example: iam123 + properties: + type: array + example: + - key: mail.smtp.starttls.enable + value: true + items: + $ref: '#/components/schemas/Properties' + SMSSender: + required: + - providerURL + - name + - provider + - contentType + type: object + properties: + name: + type: string + example: SMSPublisher + provider: + type: string + example: NEXMO + providerURL: + type: string + example: https://rest.nexmo.com/sms/json + key: + type: string + example: 123**45 + secret: + type: string + example: 5tg**ssd + sender: + type: string + example: +94 775563324 + contentType: + type: string + enum: + - JSON + - FORM + properties: + type: array + example: + - key: body.scope + value: "internal" + - key: http.headers + value: "X-Version: 1, Authorization: bearer ,Accept: application/json ,Content-Type: application/json" + items: + $ref: '#/components/schemas/Properties' + PushSender: + required: + - provider + - name + properties: + name: + type: string + example: PushPublisher + provider: + type: string + example: fcm + properties: + type: array + example: + - key: fcm.serviceAccount + value: "jsonString" + items: + $ref: '#/components/schemas/Properties' + EmailSenderUpdateRequest: + required: + - fromAddress + type: object + properties: + smtpServerHost: + type: string + example: smtp.gmail.com + smtpPort: + type: integer + example: 587 + fromAddress: + type: string + example: iam@gmail.com + userName: + type: string + example: iam + password: + type: string + example: iam123 + properties: + type: array + example: + - key: body.scope + value: "true" + - key: mail.smtp.starttls.enable + value: true + items: + $ref: '#/components/schemas/Properties' + SMSSenderUpdateRequest: + required: + - providerURL + - provider + - contentType + type: object + properties: + provider: + type: string + example: NEXMO + providerURL: + type: string + example: https://rest.nexmo.com/sms/json + key: + type: string + example: 123**45 + secret: + type: string + example: 5tg**ssd + sender: + type: string + example: +94 775563324 + contentType: + type: string + enum: + - JSON + - FORM + properties: + type: array + example: + - key: http.headers + value: "X-Version: 1, Authorization: bearer ,Accept: application/json ,Content-Type: application/json" + items: + $ref: '#/components/schemas/Properties' + PushSenderUpdateRequest: + required: + - provider + - properties + type: object + properties: + provider: + type: string + properties: + type: array + example: + - key: fcm.serviceAccount + value: "jsonString" + items: + $ref: '#/components/schemas/Properties' + Properties: + required: + - key + - value + type: object + properties: + key: + type: string + value: + type: string + example: + - key: email + value: iam@gmail.com + EmailProviderList: + type: array + items: + $ref: '#/components/schemas/EmailSender' + SMSProviderList: + type: array + items: + $ref: '#/components/schemas/SMSSender' + PushProviderList: + type: array + items: + $ref: '#/components/schemas/PushSender' + parameters: + typeQueryParam: + name: type + in: query + description: | + Type of authenticators. Can be either 'LOCAL' or 'REQUEST_PATH' + required: false + style: form + explode: true + schema: + type: string + securitySchemes: + OAuth2: + type: oauth2 + flows: + authorizationCode: + authorizationUrl: https://api.asgardeo.io/t/{tenant-domain}/oauth2/authorize + tokenUrl: https://api.asgardeo.io/t/{tenant-domain}/oauth2/token + scopes: {} diff --git a/docusaurus-asgardeo/static/apis/restapis/oauth-dcr.yaml b/docusaurus-asgardeo/static/apis/restapis/oauth-dcr.yaml new file mode 100644 index 0000000000..86d1082cd7 --- /dev/null +++ b/docusaurus-asgardeo/static/apis/restapis/oauth-dcr.yaml @@ -0,0 +1,448 @@ +openapi: 3.0.1 +info: + title: Asgardeo - OAuth2 Dynamic Client Registration API + description: | + This document specifies an OAuth2 Dynamic Client Registration endpoint for Asgardeo. +
      +
      + ⚠️ NOTE +
      +
      + Starting May 1, 2026, null fields will no longer appear in the DCR API response to align with REST best practices. + We recommend using this grace period to update your integrations and ensure continued functionality. +
      +
      + version: 1.1.0 +servers: +- url: https:/api.asgardeo.io/t/{org-name}/api/identity/oauth2/dcr/v1.1 +security: +- OAuth2: [] +paths: + /register: + get: + tags: + - OAuth2 DCR + summary: | + Get application by name + description: | + "This API is used to get/retrieve an OAuth2 application by `client_name`. \n\n" + Scope(Permission) required: `internal_dcr_view` + operationId: getApplicationByName + parameters: + - name: client_name + in: query + description: The name of the OAuth2 client application. + required: true + schema: + type: string + responses: + 200: + description: Successfully Retrieved + content: + application/json: + schema: + $ref: '#/components/schemas/application' + 401: + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/error' + 500: + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/identity/oauth2/dcr/v1.1/register?client_name={client-app-name}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + post: + tags: + - OAuth2 DCR + summary: | + Register an OAuth2 app + description: "This API is used to create an OAuth2 application. + \n If your want to create your application to use the `implicit` or `authorization_code` grant types, you need to provide the `redirect_uri` field in your request.\ + \n If you are using any other grant type, \nsuch as `password`, you don't need to send the `redirect_uri` field in the request. + \n Check the sample request given below.\n\nScope(Permission) required: `internal_dcr_create`" + operationId: registerApplication + requestBody: + description: Application information to register. + content: + application/json: + schema: + $ref: '#/components/schemas/registrationRequest' + required: true + responses: + 201: + description: Created + content: + application/json: + schema: + $ref: '#/components/schemas/application' + 400: + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/error' + 409: + description: Conflict + content: + application/json: + schema: + $ref: '#/components/schemas/error' + 500: + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{organization-name}/api/identity/oauth2/dcr/v1.1/register' \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "redirect_uris": [ + "string" + ], + "client_name": "string", + "client_id": "string", + "client_secret": "string", + "grant_types": [ + "authorization_code", + "password" + ], + "jwks_uri": "string", + "url": "string", + "ext_param_client_id": "string", + "ext_param_client_secret": "string", + "contacts": [ + "string" + ], + "post_logout_redirect_uris": [ + "string" + ], + "request_uris": [ + "string" + ], + "ext_param_sp_template": "string", + "backchannel_logout_uri": "string", + "backchannel_logout_session_required": true + }' + x-codegen-request-body-name: registrationRequest + /register/{client_id}: + get: + tags: + - OAuth2 DCR + summary: | + Get application by ID + description: | + "This API is used to retrieve an OAuth2 application by `client_id`. \n\n" + Scope(Permission) required: `internal_dcr_view` + operationId: getApplication + parameters: + - name: client_id + in: path + description: Unique identifier of the OAuth2 client application. + required: true + schema: + type: string + responses: + 200: + description: Successfully Retrieved + content: + application/json: + schema: + $ref: '#/components/schemas/application' + 404: + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/error' + 500: + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/identity/oauth2/dcr/v1.1/register/{client-id}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + put: + tags: + - OAuth2 DCR + summary: | + Update an OAuth2 app + description: | + "This API is used to update an OAuth2 application.\n\n" + Scope(Permission) required: `internal_dcr_update` + operationId: updateApplication + parameters: + - name: client_id + in: path + description: Unique identifier for the OAuth2 client application. + required: true + schema: + type: string + requestBody: + description: Application information to update. + content: + application/json: + schema: + $ref: '#/components/schemas/updateRequest' + required: true + responses: + 200: + description: Successfully updated + content: + application/json: + schema: + $ref: '#/components/schemas/application' + 400: + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/error' + 409: + description: Conflict + content: + application/json: + schema: + $ref: '#/components/schemas/error' + 500: + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PUT' \ + 'https://api.asgardeo.io/t/{organization-name}/api/identity/oauth2/dcr/v1.1/register/{client_id}' \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "redirect_uris": [ + "string" + ], + "client_name": "client_application", + "client_id": "string", + "client_secret": "string", + "grant_types": [ + "authorization_code", + "password" + ], + "backchannel_logout_uri": "string", + "backchannel_logout_session_required": true + }' + x-codegen-request-body-name: updateRequest + delete: + tags: + - OAuth2 DCR + summary: | + Delete an OAuth2 app + description: | + "This API is used to delete an OAuth2 application by `client_id`.\n\n" + Scope(Permission) required: `internal_dcr_delete` + operationId: deleteApplication + parameters: + - name: client_id + in: path + description: Unique identifier of the OAuth2 client application. + required: true + schema: + type: string + responses: + 204: + description: Successfully deleted + content: {} + 404: + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/error' + 500: + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'DELETE' \ + 'https://api.asgardeo.io/t/{organization-name}/api/identity/oauth2/dcr/v1.1/register/{client_id}' \ + -H 'accept: */*' \ + -H 'Authorization: Bearer {bearer_token}' + x-wso2-request: | + curl -X DELETE -H "Authorization: Basic YWRtaW46YWRtaW4=" -H "Content-Type: application/json" -d '{}' "https://api.asgardeo.io/t/{org-name}/api/identity/oauth2/dcr/v1.1/register/s6BhdRkqt3" + x-wso2-response: | + "HTTP/1.1 204 No Content" +components: + schemas: + registrationRequest: + required: + - client_name + - redirect_uris + type: object + properties: + redirect_uris: + type: array + items: + type: string + description: The redirect URI determines where Asgardeo will redirect users after authentication and logout. + client_name: + type: string + description: The name of the OAuth2 client application. + ext_param_client_id: + type: string + description: The public identifier of the application. + ext_param_client_secret: + type: string + description: The secret corresponding to the `clientId` of the application. This is confidential and will be used to make requests and authenticate into your application. + grant_types: + type: array + example: + - authorization_code + - password + items: + type: string + description: "The This will determine how the application communicates with the token service. Asgardeo supports following grant types: +
        +
      • authorization_code
      • +
      • client_credentials
      • +
      • refresh_token
      • +
      • implicit
      • +
      • password
      • +
      " + jwks_uri: + type: string + url: + type: string + contacts: + type: array + items: + type: string + post_logout_redirect_uris: + type: array + items: + type: string + request_uris: + type: array + items: + type: string + ext_param_sp_template: + type: string + backchannel_logout_uri: + type: string + description: Represents the URL that is used for sending logout requests from the identity provider (IdP) to the application in a back-channel manner, without involving the user's browser. + backchannel_logout_session_required: + type: boolean + updateRequest: + type: object + properties: + redirect_uris: + type: array + items: + type: string + client_name: + type: string + example: "client_application" + description: The name of the OAuth2 client application. + client_id: + type: string + description: The public identifier of the application. + client_secret: + type: string + description: The secret corresponding to the `clientId` of the application. This is confidential and will be used to make requests and authenticate into your application. + grant_types: + type: array + example: + - authorization_code + - password + items: + type: string + description: "The This will determine how the application communicates with the token service. Asgardeo supports following grant types: +
        +
      • authorization_code
      • +
      • client_credentials
      • +
      • refresh_token
      • +
      • implicit
      • +
      • password
      • +
      " + backchannel_logout_uri: + type: string + backchannel_logout_session_required: + type: boolean + application: + type: object + properties: + client_id: + type: string + example: "s6BhdRkqt3" + description: The public identifier of the application. + client_secret: + type: string + example: "ZJYCqe3GGRvdrudKyZS0XhGv_Z45DuKhCUk0gBR1vZk" + description: The secret corresponding to the `clientId` of the application. This is confidential and will be used to make requests and authenticate into your application. + client_secret_expires_at: + type: string + example: "1577858400" + description: The remaining time for expiry of the `client_secret`. + redirect_uris: + type: array + items: + type: string + grant_types: + type: array + example: + - authorization_code + - password + items: + type: string + description: "The This will determine how the application communicates with the token service. Asgardeo supports following grant types: +
        +
      • authorization_code
      • +
      • client_credentials
      • +
      • refresh_token
      • +
      • implicit
      • +
      • password
      • +
      " + client_name: + type: string + example: "client_application" + description: The name of the OAuth2 client application. + error: + type: object + properties: + error: + type: string + error_description: + type: string + securitySchemes: + OAuth2: + type: oauth2 + flows: + authorizationCode: + authorizationUrl: https://api.asgardeo.io/t/{org-name}/oauth2/authorize + tokenUrl: https://api.asgardeo.io/t/{org-name}/oauth2/token + scopes: {} \ No newline at end of file diff --git a/docusaurus-asgardeo/static/apis/restapis/offline-user-onboard.yaml b/docusaurus-asgardeo/static/apis/restapis/offline-user-onboard.yaml new file mode 100644 index 0000000000..8b54f14ba6 --- /dev/null +++ b/docusaurus-asgardeo/static/apis/restapis/offline-user-onboard.yaml @@ -0,0 +1,104 @@ +openapi: 3.0.0 +info: + version: v1 + title: Offline User Onboard Management API + description: >- + This document specifies an **Offline user onboard management RESTFull API** for + Asgardeo. + +paths: + '/offline-invite-link': + post: + tags: + - Temporary Link + summary: Generates a random link that can be used to set a new password + description: | + 'Generates a random and secured one time link that can be used to set a new password for a user onboarded to the organization' + + Scope(Permission) required: `internal_offline_invite` + operationId: generateLink + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/InvitationRequest' + description: This represents the invitation request. + required: true + responses: + '201': + description: Created + content: + text/plain: + schema: + type: string + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/o/{organization-name}/api/users/v1/offline-invite-link' \ + -H 'Content-Type: application/json' \ + -H 'Accept: text/plain' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "username": "johnDoe", + "userstore": "DEFAULT" + }' +servers: + - url: 'https://api.asgardeo.io/o/{organization-name}/api/users/v1' + +security: + - OAuth2: [] +components: + schemas: + InvitationRequest: + type: object + required: + - username + - userstore + properties: + username: + type: string + description: Exisiting user's username + example: "johnDoe" + userstore: + type: string + description: User's userstore domain + example: "DEFAULT" + Error: + type: object + properties: + code: + type: string + example: "Some_error_code" + message: + type: string + example: "Some error message." + description: + type: string + example: "Some error description." + traceId: + type: string + example: "Some Correlation for Error Instance" + securitySchemes: + OAuth2: + type: oauth2 + flows: + authorizationCode: + authorizationUrl: 'https://api.asgardeo.io/o/{organization-name}/oauth2/authorize' + tokenUrl: 'http://api.asgardeo.io/o/{organization-name}/oauth2/token' + scopes: {} diff --git a/docusaurus-asgardeo/static/apis/restapis/org-management.yaml b/docusaurus-asgardeo/static/apis/restapis/org-management.yaml new file mode 100644 index 0000000000..26d5f1bd1b --- /dev/null +++ b/docusaurus-asgardeo/static/apis/restapis/org-management.yaml @@ -0,0 +1,1117 @@ +openapi: 3.0.0 +info: + version: "v1" + title: 'Asgardeo - Organization Management API Definition' + description: | + 'This is the RESTful API for organization management in Asgardeo. + + This API allows users to create, update, retrieve and delete organizations. + Other than that the API supports to share the application from the root organization to given organization, get the list of organizations that the application is shared to and delete the shared application from the organizations.' +servers: + - url: 'https://api.asgardeo.io/t/{organization-name}/api/server/v1' + variables: + server-url: + default: https://api.asgardeo.io/t/{organization-name}/api/server/v1 + root-organization-name: + default: "{organization-name}" +security: + - OAuth2: [] + +paths: + /organizations: + post: + tags: + - Organization + description: | + This API is used to create the organization defined in the user input. + + Scope(Permission) required: `internal_organization_create` + summary: + Create a new organization. + operationId: organizationPost + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationPOSTRequest' + description: This represents the organization to be added. + required: true + responses: + '201': + description: Successful response + headers: + Location: + description: Location of the newly created organization. + schema: + type: string + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationResponse' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/organizations' \ + -H 'Content-Type: application/json' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "name": "ABC Builders", + "description": "Building constructions", + "attributes": [ + { + "key": "Country", + "value": "USA" + } + ] + }' + x-codegen-request-body-name: body + get: + description: | + This API is used to search and retrieve organizations created for this tenant. + + Organizations can be filtered by id, name, description, created, lastModified, status, parentId, and meta attributes. + + Supported operators: "eq"(equals), "co"(contains), "sw"(starts with), "ew"(ends with), "ge"(greater than or equals), "le"(less than or equals), "gt"(greater than), "lt"(less than) + + Multiple attributes can be combined using the "and" operator. + + Examples: + - filter=name+eq+ABC Builders + - filter=attributes.Country+eq+Sri Lanka + + Scope(Permission) required: `internal_organization_view` + summary: + Retrieve organizations created for this tenant which matches the defined search criteria, if any. + operationId: organizationsGet + parameters: + - $ref: '#/components/parameters/filterQueryParam' + - $ref: '#/components/parameters/limitQueryParam' + - $ref: '#/components/parameters/afterQueryParam' + - $ref: '#/components/parameters/beforeQueryParam' + - $ref: '#/components/parameters/recursiveQueryParam' + responses: + '200': + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationsResponse' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '500': + $ref: '#/components/responses/ServerError' + '501': + $ref: '#/components/responses/NotImplemented' + tags: + - Organization + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/organizations' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + /organizations/check-name: + post: + summary: Check organization with given name exist among the organizations hierarchy. + description: | + This API is used to check whether organization with particular name exist or not. + + If the organization name is available for use, the response will be "available": true, else it will be "available": false. + + Scope(Permission) required: `internal_organization_view` + operationId: organizationsCheckNamePost + requestBody: + description: OrganizationNameCheckPOSTRequest object containing the organization name. + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationNameCheckPOSTRequest' + required: true + responses: + '200': + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationNameCheckPOSTResponse' + '404': + $ref: '#/components/responses/NotFound' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '500': + $ref: '#/components/responses/ServerError' + tags: + - Organization + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/organizations/check-name' \ + -H 'Content-Type: application/json' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "name": "XYZ Builders" + }' + x-codegen-request-body-name: body + /organizations/{organization-id}: + get: + description: | + This API is used to get an existing organization identified by the organization ID. + + Scope(Permission) required: `internal_organization_view` + summary: + Get an existing organization, identified by the organization ID. + parameters: + - name: organization-id + in: path + description: ID of the organization. + required: true + schema: + type: string + example: 5355f3f0-f8b3-457f-805a-b32a668c5125 + - $ref: '#/components/parameters/includePermissionsQueryParam' + responses: + '200': + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/GetOrganizationResponse' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + tags: + - Organization + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/organizations/{organization-id}' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + patch: + description: | + This API provides the capability to update an organization property + using patch request. Organization patch is supported only for key-value pairs. + + Scope(Permission) required: `internal_organization_update` + summary: + Patch an organization property by ID. Patch is supported only for + key-value pairs. + parameters: + - name: organization-id + in: path + description: ID of the organization to be patched. + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationPatchRequest' + required: true + responses: + '200': + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationResponse' + example: + { + "id": "06c1f4e2-3339-44e4-a825-96585e3653b1", + "name": "XYZ Builders", + "description": "Building constructions", + "status": "ACTIVE", + "created": "2021-10-25T12:31:53.406Z", + "lastModified": "2021-10-25T12:31:53.406Z", + "type": "TENANT", + "parent": { + "id": "10084a8d-113f-4211-a0d5-efe36b082211", + "ref": "/api/server/v1/organizations/10084a8d-113f-4211-a0d5-efe36b082211" + }, + "hasChildren": false, + "attributes": [ + { + "key": "Country", + "value": "USA" + } + ] + } + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + tags: + - Organization + x-codeSamples: + - lang: Curl + source: | + curl --location --request PATCH 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/organizations/{organization-id}' \ + -H 'Content-Type: application/json' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '[ + { + "operation": "REPLACE", + "path": "/name", + "value": "XYZ Builders" + } + ]' + x-codegen-request-body-name: body + put: + description: | + This API provides the capability to update an organization by its id. + + Scope(Permission) required: `internal_organization_update` + summary: + Update an organization by ID. + parameters: + - name: organization-id + in: path + description: ID of the organization to be updated. + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationPUTRequest' + required: true + responses: + '200': + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationResponse' + example: + { + "id": "06c1f4e2-3339-44e4-a825-96585e3653b1", + "name": "ABCD Builders", + "description": "Building constructions company", + "status": "ACTIVE", + "created": "2021-10-25T12:31:53.406Z", + "lastModified": "2021-10-25T12:31:53.406Z", + "type": "TENANT", + "parent": { + "id": "10084a8d-113f-4211-a0d5-efe36b082211", + "ref": "/api/server/v1/organizations/10084a8d-113f-4211-a0d5-efe36b082211" + }, + "hasChildren": false, + "attributes": [ + { + "key": "Country", + "value": "USA" + } + ] + } + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + tags: + - Organization + x-codeSamples: + - lang: Curl + source: | + curl --location --request PUT 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/organizations/{organization-id}' \ + -H 'Content-Type: application/json' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "name": "ABCD Builders", + "description": "Building constructions company", + "status": "ACTIVE", + "attributes": [ + { + "key": "Country", + "value": "USA" + } + ] + }' + x-codegen-request-body-name: body + delete: + description: | + This API provides the capability to delete an organization by + giving its ID. + + Scope(Permission) required: `internal_organization_delete` + summary: + Delete an organization by using the organization's ID. + parameters: + - name: organization-id + in: path + description: ID of the organization to be deleted. + required: true + schema: + type: string + responses: + '204': + description: Successfully deleted + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + tags: + - Organization + x-codeSamples: + - lang: Curl + source: | + curl --location --request DELETE 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/organizations/{organization-id}' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + /organizations/self: + get: + tags: + - Organization + description: | + This API retrieves the organization information associated with the currently accessing organization. + + Scopes (Permissions) required: `internal_organization_view` + summary: Get organization details of the currently accessing organization. + operationId: getSelfOrganization + responses: + '200': + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationResponse' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl --location --request GET 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/organizations/self' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + patch: + tags: + - Organization + description: | + This API updates the editable fields of the organization associated with the currently accessing organization. + Currently only the organization name and version can be updated using this API. + + Scopes (Permissions) required: `internal_organization_update` + summary: Update organization details of the currently accessing organization. + operationId: patchSelfOrganization + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationPatchRequest' + description: Partial update payload for the organization. + required: true + responses: + '200': + description: Successfully updated organization. + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationResponse' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl --location --request PATCH 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/organizations/self' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -H 'Content-Type: application/json' \ + -d '[ + { + "operation": "REPLACE", + "path": "/name", + "value": "ABCD Builders" + } + ]' + /organizations/metadata: + get: + tags: + - Organization Metadata + description: | + This API facilitates the retrieval of metadata including discovery attributes of the logged in organization.
      + + Scope(Permission) required: `internal_organization_view` + summary: + Get metadata of the logged in organization. + operationId: organizationMetadataGet + responses: + '200': + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationMetadata' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/organizations/metadata' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + /organizations/meta-attributes: + get: + tags: + - Organization Meta Attributes + description: | + This API facilitates the retrieval of organization meta attributes which matches the defined search criteria, if any. + + Supported operators: "eq"(equals), "co"(contains), "sw"(starts with), "ew"(ends with), "ge"(greater than or equals), "le"(less than or equals), "gt"(greater than), "lt"(less than) + + Multiple filters can be combined using the "and" operator. + + Example: filter=attributes+eq+Country + + Scope(Permission) required: `internal_organization_view` + summary: Get meta attributes of organizations with filter capabilities. + operationId: organizationsMetaAttributesGet + parameters: + - $ref: '#/components/parameters/filterQueryParam' + - $ref: '#/components/parameters/limitQueryParam' + - $ref: '#/components/parameters/afterQueryParam' + - $ref: '#/components/parameters/beforeQueryParam' + - $ref: '#/components/parameters/recursiveQueryParam' + responses: + '200': + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/MetaAttributesResponse' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '500': + $ref: '#/components/responses/ServerError' + '501': + $ref: '#/components/responses/NotImplemented' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/organizations/meta-attributes' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' +components: + parameters: + filterQueryParam: + in: query + name: filter + required: false + description: + Condition to filter the retrieval of records. + schema: + type: string + limitQueryParam: + in: query + name: limit + required: false + description: + Maximum number of records to be returned. (Should be greater than 0) + schema: + type: integer + format: int32 + minimum: 0 + offsetQueryParam: + in: query + name: offset + required: false + description: Number of records to skip for pagination. + schema: + type: integer + format: int32 + minimum: 0 + beforeQueryParam: + in: query + name: before + required: false + description: + Points to the previous range of data that can be retrieved. + schema: + type: string + afterQueryParam: + in: query + name: after + required: false + description: + Points to the next range of data to be returned. + schema: + type: string + recursiveQueryParam: + in: query + name: recursive + required: false + description: | + Determines whether a recursive search should happen. + If set to true, will include organizations in all levels of the hierarchy; If set to false, includes only organizations in the next level of the hierarchy. + schema: + type: boolean + default: false + showChildrenQueryParam: + in: query + name: showChildren + required: false + description: + Returns the organization details along with the child organization IDs belonging to this organization. + schema: + type: boolean + default: false + includePermissionsQueryParam: + in: query + name: includePermissions + required: false + description: + Returns the organization details along with permissions assigned for the requested user in this organization. + schema: + type: boolean + default: false + + schemas: + Error: + type: object + required: + - code + - message + properties: + code: + type: string + example: ORG-00000 + description: An error code. + message: + type: string + example: Some Error Message + description: An error message. + description: + type: string + example: Some Error Description + description: An error description. + traceId: + type: string + example: e0fbcfeb-3617-43c4-8dd0-7b7d38e13047 + description: An error trace identifier. + + OrganizationPOSTRequest: + type: object + required: + - name + properties: + name: + type: string + example: "ABC Builders" + orgHandle: + type: string + example: "abcbuilders" + description: + type: string + example: "Building constructions" + parentId: + type: string + description: "The parent organization id should be the organization where the request is invoked. If a value is not specified it will be resolved internally." + attributes: + type: array + items: + $ref: '#/components/schemas/Attribute' + example: + { + "name": "ABC Builders", + "description": "Building constructions", + "attributes": [ + { + "key": "Country", + "value": "USA" + } + ] + } + OrganizationPUTRequest: + type: object + required: + - name + - status + properties: + name: + type: string + example: "ABCD Builders" + orgHandle: + type: string + example: "abcbuilders" + description: + type: string + example: "Building constructions company" + status: + type: string + enum: [ACTIVE, DISABLED] + example: ACTIVE + version: + type: string + example: 'v1.0.0' + attributes: + type: array + items: + $ref: '#/components/schemas/Attribute' + OrganizationNameCheckPOSTRequest: + type: object + properties: + name: + type: string + example: "XYZ Builders" + OrganizationNameCheckPOSTResponse: + type: object + properties: + available: + type: boolean + example: true + Attribute: + type: object + required: + - key + - value + properties: + key: + type: string + example: "Country" + value: + type: string + example: "USA" + OrganizationsResponse: + type: object + properties: + links: + type: array + items: + $ref: '#/components/schemas/Link' + example: + [ + { + "href": "/api/server/v1/organizations?limit=10&filter=name+co+der&next=MjAyMS0xMi0yMSAwNToxODozMS4wMDQzNDg=", + "rel": "next", + }, { + "href": "/api/server/v1/organizations?limit=10&filter=name+co+der&before=MjAyMS0xMi0yMSAwNToxODozMS4wMDQzNDg=", + "rel": "previous", + } + ] + organizations: + type: array + items: + $ref: '#/components/schemas/BasicOrganizationResponse' + Link: + type: object + properties: + href: + type: string + format: uri + description: Endpoint that will return the next or previous page of data. + rel: + type: string + description: Describes whether the provided link is to access the next or previous page of data. + readOnly: true + BasicOrganizationResponse: + type: object + required: + - id + - name + - orgHandle + - status + - version + - ref + properties: + id: + type: string + example: '06c1f4e2-3339-44e4-a825-96585e3653b1' + name: + type: string + example: 'ABC Builders' + orgHandle: + type: string + example: 'abcbuilders' + status: + type: string + enum: [ ACTIVE, DISABLED ] + example: ACTIVE + version: + type: string + example: 'v1.0.0' + hasChildren: + type: boolean + example: false + ref: + type: string + example: '/api/server/v1/organizations/06c1f4e2-3339-44e4-a825-96585e3653b1' + attributes: + type: array + items: + $ref: '#/components/schemas/Attribute' + OrganizationResponse: + type: object + required: + - id + - name + - orgHandle + - status + - version + - created + - lastModified + - type + properties: + id: + type: string + example: '06c1f4e2-3339-44e4-a825-96585e3653b1' + name: + type: string + example: 'ABC Builders' + orgHandle: + type: string + example: 'abcbuilders' + description: + type: string + example: 'Building constructions' + status: + type: string + enum: [ACTIVE, DISABLED] + example: ACTIVE + version: + type: string + example: 'v1.0.0' + created: + type: string + example: '2021-10-25T12:31:53.406Z' + lastModified: + type: string + example: '2021-10-25T12:31:53.406Z' + type: + type: string + example: "TENANT" + enum: + - TENANT + parent: + $ref: '#/components/schemas/ParentOrganization' + hasChildren: + type: boolean + example: false + attributes: + type: array + items: + $ref: '#/components/schemas/Attribute' + GetOrganizationResponse: + type: object + required: + - id + - name + - orgHandle + - status + - version + - created + - lastModified + - type + properties: + id: + type: string + example: '06c1f4e2-3339-44e4-a825-96585e3653b1' + name: + type: string + example: 'ABC Builders' + orgHandle: + type: string + example: 'abcbuilders' + description: + type: string + example: 'Building constructions' + status: + type: string + enum: [ACTIVE, DISABLED] + example: ACTIVE + version: + type: string + example: 'v1.0.0' + created: + type: string + example: '2021-10-25T12:31:53.406Z' + lastModified: + type: string + example: '2021-10-25T12:31:53.406Z' + type: + type: string + example: "TENANT" + enum: + - TENANT + parent: + $ref: '#/components/schemas/ParentOrganization' + hasChildren: + type: boolean + example: false + attributes: + type: array + items: + $ref: '#/components/schemas/Attribute' + permissions: + type: array + items: + type: string + ancestorPath: + type: array + description: 'Ancestors up to the request initiated organization' + items: + type: object + properties: + id: + type: string + name: + type: string + depth: + type: integer + example: + [ + { + "id": "10084a8d-113f-4211-a0d5-efe36b082211", + "name": "Global Holding Corp", + "depth": 0 + } + ] + MetaAttributesResponse: + type: object + properties: + links: + type: array + items: + $ref: '#/components/schemas/Link' + example: + [ + { + "href": "/api/server/v1/organizations/meta-attributes?limit=10&recursive=false&filter=attributes+co+C&after=MjAyMS0xMi0yMSAwNToxODozMS4wMDQzNDg=", + "rel": "next", + }, { + "href": "/api/server/v1/organizations/meta-attributes?limit=10&recursive=false&filter=attributes+co+C&before=MjAyMS0xMi0yMSAwNToxODozMS4wMDQzNDg=", + "rel": "previous", + } + ] + attributes: + type: array + items: + type: string + example: + - "Country" + - "Region" + #----------------------------------------------------- + # Organization Parent Object + #----------------------------------------------------- + ParentOrganization: + type: object + required: + - id + - ref + properties: + id: + type: string + example: '10084a8d-113f-4211-a0d5-efe36b082211' + ref: + type: string + example: '/api/server/v1/organizations/10084a8d-113f-4211-a0d5-efe36b082211' + + #----------------------------------------------------- + # Organization Patch Operation Object + #----------------------------------------------------- + OrganizationPatchRequest: + type: array + items: + $ref: '#/components/schemas/OrganizationPatchRequestItem' + OrganizationPatchRequestItem: + description: A JSONPatch as defined by RFC 6902. Patch operation is supported only for root level attributes of an organization. + required: + - operation + - path + properties: + operation: + type: string + description: The operation to be performed. + enum: + - ADD + - REMOVE + - REPLACE + example: REPLACE + path: + type: string + description: A JSON-Pointer + example: '/name' + value: + type: string + description: The value to be used within the operations. + example: 'XYZ Builders' + DiscoveryAttribute: + type: object + required: + - type + - value + properties: + type: + type: string + example: 'emailDomain' + values: + type: array + items: + type: string + example: 'abc.com' + OrganizationMetadata: + type: object + required: + - id + - name + - orgHandle + - status + - version + - created + - lastModified + - type + properties: + id: + type: string + example: '06c1f4e2-3339-44e4-a825-96585e3653b1' + name: + type: string + example: 'ABC Builders' + orgHandle: + type: string + example: 'abcbuilders' + description: + type: string + example: 'Building constructions' + status: + type: string + enum: [ACTIVE, DISABLED] + example: ACTIVE + version: + type: string + example: 'v1.0.0' + created: + type: string + example: '2021-10-25T12:31:53.406Z' + lastModified: + type: string + example: '2021-10-25T12:31:53.406Z' + type: + type: string + example: "TENANT" + enum: + - TENANT + parent: + $ref: '#/components/schemas/ParentOrganization' + attributes: + type: array + items: + $ref: '#/components/schemas/Attribute' + permissions: + type: array + items: + type: string + discoveryAttributes: + type: array + items: + $ref: '#/components/schemas/DiscoveryAttribute' + + #-------------------------------------------------------- + # Descriptions of Organization Management API responses. + #-------------------------------------------------------- + responses: + BadRequest: + description: Invalid input in the request. + content: + 'application/json': + schema: + $ref: '#/components/schemas/Error' + NotFound: + description: Requested resource is not found. + content: + 'application/json': + schema: + $ref: '#/components/schemas/Error' + Unauthorized: + description: Authentication information is missing or invalid. + Forbidden: + description: Access forbidden. + ServerError: + description: Internal server error. + content: + 'application/json': + schema: + $ref: '#/components/schemas/Error' + NotImplemented: + description: Not Implemented. + content: + 'application/json': + schema: + $ref: '#/components/schemas/Error' + OrgNotFound: + description: Organization Not Found + OrgExist: + description: Organization Exist + #----------------------------------------------------- + # Applicable authentication mechanisms. + #----------------------------------------------------- + securitySchemes: + OAuth2: + type: oauth2 + flows: + authorizationCode: + authorizationUrl: 'https://api.asgardeo.io/t/{organization-name}/oauth2/authorize' + tokenUrl: 'https://api.asgardeo.io/t/{organization-name}/oauth2/token' + scopes: {} diff --git a/docusaurus-asgardeo/static/apis/restapis/organization-discovery-config-mgt.yaml b/docusaurus-asgardeo/static/apis/restapis/organization-discovery-config-mgt.yaml new file mode 100644 index 0000000000..0e756d78a4 --- /dev/null +++ b/docusaurus-asgardeo/static/apis/restapis/organization-discovery-config-mgt.yaml @@ -0,0 +1,250 @@ +openapi: 3.0.0 +info: + title: Asgardeo - Organization Discovery Configuration Management API Definition + description: This document specifies a **RESTful API** for Organization Discovery Configuration Management in Asgardeo. + version: "v1" +servers: + - url: 'https://api.asgardeo.io/t/{organization-name}/api/server/v1' + variables: + server-url: + default: https://api.asgardeo.io/t/{organization-name}/api/server/v1 + root-organization-name: + default: "{organization-name}" +security: + - OAuth2: [] + +paths: + /organization-configs/discovery: + get: + tags: + - Discovery + summary: Get organization discovery configuration. + description: | + This API facilitates the retrieval of discovery configuration of the root organization.
      + + Scope(Permission) required: `internal_organization_config_view` + operationId: getDiscoveryConfig + responses: + '200': + description: Successful response. + content: + application/json: + schema: + $ref: '#/components/schemas/Config' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/organization-configs/discovery' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + post: + tags: + - Discovery + summary: Add organization discovery configuration. + description: | + This API provides the capability to add discovery configuration for the root organization.
      + + Scope(Permission) required: `internal_organization_config_add` + operationId: createDiscoveryConfig + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/Config' + responses: + '201': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Config' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '409': + $ref: '#/components/responses/Conflict' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/organization-configs/discovery' \ + -H 'Content-Type: application/json' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "properties": [ + { + "key": "emailDomain.enable", + "value": true + } + ] + }' + x-codegen-request-body-name: body + put: + tags: + - Discovery + summary: Update organization discovery configuration. + description: | + This API provides the capability to update discovery configuration of the root organization.
      + + Scope(Permission) required: `internal_organization_config_update` + operationId: updateDiscoveryConfig + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/Config' + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/Config' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl --location --request PUT 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/organization-configs/discovery' \ + -H 'Content-Type: application/json' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "properties": [ + { + "key": "emailDomain.enable", + "value": true + } + ] + }' + x-codegen-request-body-name: body + delete: + tags: + - Discovery + summary: Delete organization discovery configuration. + description: | + This API provides the capability to delete discovery configuration of the root organization.
      + + Scope(Permission) requiredd: `internal_organization_config_delete` + operationId: deleteDiscoveryConfig + responses: + '204': + $ref: '#/components/responses/NoContent' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl --location --request DELETE 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/organization-configs/discovery' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' +components: + schemas: + Error: + type: object + required: + - code + - message + properties: + code: + type: string + example: OCM-00000 + description: An error code. + message: + type: string + example: Some Error Message + description: An error message. + description: + type: string + example: Some Error Description + description: An error description. + traceId: + type: string + example: e0fbcfeb-3617-43c4-8dd0-7b7d38e13047 + description: An error trace identifier. + + Config: + type: object + required: + - properties + properties: + properties: + type: array + items: + $ref: '#/components/schemas/Properties' + Properties: + required: + - key + - value + type: object + properties: + key: + type: string + example: emailDomain.enable + value: + type: string + example: true + + responses: + BadRequest: + description: Invalid input in the request. + content: + 'application/json': + schema: + $ref: '#/components/schemas/Error' + NotFound: + description: Requested resource is not found. + content: + 'application/json': + schema: + $ref: '#/components/schemas/Error' + Conflict: + description: Resource already exists. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + NoContent: + description: No content. + Unauthorized: + description: Authentication information is missing or invalid. + Forbidden: + description: Access forbidden. + ServerError: + description: Internal server error. + content: + 'application/json': + schema: + $ref: '#/components/schemas/Error' + + securitySchemes: + OAuth2: + type: oauth2 + flows: + authorizationCode: + authorizationUrl: https://api.asgardeo.io/t/{organization-name}/oauth2/authorize + tokenUrl: https://api.asgardeo.io/t/{organization-name}/oauth2/token + scopes: {} \ No newline at end of file diff --git a/docusaurus-asgardeo/static/apis/restapis/organization-discovery.yaml b/docusaurus-asgardeo/static/apis/restapis/organization-discovery.yaml new file mode 100644 index 0000000000..22323842b4 --- /dev/null +++ b/docusaurus-asgardeo/static/apis/restapis/organization-discovery.yaml @@ -0,0 +1,551 @@ +openapi: 3.0.0 +info: + version: "v1" + title: 'Organization Discovery API' + description: | + This document specifies an **Organization Discovery RESTful API** for Asgardeo. + +servers: + - url: 'https://api.asgardeo.io/t/{organization-name}/api/server/v1' + +security: + - OAuth2: [] + +paths: + /organizations/discovery: + post: + tags: + - Organization Discovery + description: | + This API serves the purpose of adding discovery attributes to an organization, with the current restriction that only the primary organization has the capability to perform this action.
      + + Scope(Permission) required: `internal_organization_discovery_update` + summary: + Map discovery attributes to the organization. + operationId: organizationDiscoveryPost + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationDiscoveryPostRequest' + description: This represents the organization discovery attributes to be added. + required: true + responses: + '201': + description: Successful response + headers: + Location: + description: Location URL to fetch the discovery attributes of the organization. + schema: + type: string + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationDiscoveryAttributes' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/organizations/discovery' \ + -H 'Content-Type: application/json' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "organizationId": "06c1f4e2-3339-44e4-a825-96585e3653b1", + "attributes": [ + { + "type": "emailDomain", + "values": [ + "abc.com" + ] + } + ] + }' + x-codegen-request-body-name: body + get: + tags: + - Organization Discovery + description: | + This API facilitates the retrieval of discovery attributes of organizations in the hierarchy, allowing filtering by discovery attribute type and value. It currently provides the capability to retrieve these attributes from only the primary organization.
      + + Scope(Permission) required: `internal_organization_discovery_view` + summary: + Get discovery attributes of organizations. + operationId: organizationsDiscoveryGet + parameters: + - $ref: '#/components/parameters/filterQueryParam' + - $ref: '#/components/parameters/offsetQueryParam' + - $ref: '#/components/parameters/limitQueryParam' + responses: + '200': + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationsDiscoveryResponse' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '500': + $ref: '#/components/responses/ServerError' + '501': + $ref: '#/components/responses/NotImplemented' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/organizations/discovery' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + /organizations/{organization-id}/discovery: + get: + tags: + - Organization Discovery + description: | + This API facilitates the retrieval of discovery attributes for an organization. It currently provides the capability to retrieve these attributes only from the primary organization.
      + + Scope(Permission) required: `internal_organization_discovery_view` + summary: + Get discovery attributes of the organization. + operationId: organizationDiscoveryGet + parameters: + - name: organization-id + in: path + description: ID of the organization whose discovery attributes are to be fetched. + required: true + schema: + type: string + responses: + '200': + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationDiscoveryAttributes' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + '501': + $ref: '#/components/responses/NotImplemented' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/organizations/06c1f4e2-3339-44e4-a825-96585e3653b1/discovery' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + delete: + tags: + - Organization Discovery + description: | + This API serves the purpose of deleting discovery attributes of an organization, with the current restriction that only the primary organization has the capability to perform this action.
      + + Scope(Permission) required: `internal_organization_discovery_delete` + summary: + Delete discovery attributes of an organization. + parameters: + - name: organization-id + in: path + description: ID of the organization whose discovery attributes are to be deleted. + required: true + schema: + type: string + responses: + '204': + description: Successfully deleted + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl --location --request DELETE 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/organizations/06c1f4e2-3339-44e4-a825-96585e3653b1/discovery' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + put: + tags: + - Organization Discovery + description: | + This API serves the purpose of updating discovery attributes of an organization, with the current restriction that only the primary organization has the capability to perform this action.
      + + Scope(Permission) required: `internal_organization_discovery_update` + summary: + Update discovery attributes of an organization. + parameters: + - name: organization-id + in: path + description: ID of the organization whose discovery attributes are to be updated. + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationDiscoveryAttributes' + required: true + responses: + '200': + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationDiscoveryAttributes' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl --location --request PUT 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/organizations/06c1f4e2-3339-44e4-a825-96585e3653b1/discovery' \ + -H 'Content-Type: application/json' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "attributes": [ + { + "type": "emailDomain", + "values": [ + "abc.com" + ] + } + ] + }' + x-codegen-request-body-name: body + /organizations/check-discovery: + post: + tags: + - Organization Discovery + summary: Check whether given discovery attribute exists among the organization hierarchy. + description: | + This API is used to verify whether a specific discovery attribute has already been associated with an organization within the hierarchy. It is available for use within any organization in the hierarchy. + + Scope(Permission) required: `internal_organization_discovery_view` + operationId: organizationCheckDiscovery + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationDiscoveryCheckPOSTRequest' + required: true + responses: + '200': + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationDiscoveryCheckPOSTResponse' + '404': + $ref: '#/components/responses/NotFound' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/organizations/check-discovery' \ + -H 'Content-Type: application/json' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "type": "emailDomain", + "value": "abc.com" + }' + x-codegen-request-body-name: body +components: + parameters: + filterQueryParam: + in: query + name: filter + required: false + description: + Condition to filter the retrieval of records. + schema: + type: string + limitQueryParam: + in: query + name: limit + required: false + description: + Maximum number of records to be returned. (Should be greater than 0) + schema: + type: integer + format: int32 + minimum: 0 + offsetQueryParam: + in: query + name: offset + required: false + description: Number of records to skip for pagination. + schema: + type: integer + format: int32 + minimum: 0 + beforeQueryParam: + in: query + name: before + required: false + description: + Points to the previous range of data that can be retrieved. + schema: + type: string + afterQueryParam: + in: query + name: after + required: false + description: + Points to the next range of data to be returned. + schema: + type: string + recursiveQueryParam: + in: query + name: recursive + required: false + description: + Determines whether a recursive search should happen. + schema: + type: boolean + default: false + showChildrenQueryParam: + in: query + name: showChildren + required: false + description: + Returns the organization details along with the child organization IDs belonging to this organization. + schema: + type: boolean + default: false + includePermissionsQueryParam: + in: query + name: includePermissions + required: false + description: + Returns the organization details along with permissions assigned for the requested user in this organization. + schema: + type: boolean + default: false + + schemas: + Error: + type: object + required: + - code + - message + properties: + code: + type: string + example: ORG-00000 + description: An error code. + message: + type: string + example: Some Error Message + description: An error message. + description: + type: string + example: Some Error Description + description: An error description. + traceId: + type: string + example: e0fbcfeb-3617-43c4-8dd0-7b7d38e13047 + description: An error trace identifier. + Link: + type: object + properties: + href: + type: string + format: uri + description: Endpoint that will return the next or previous page of data. + rel: + type: string + description: Describes whether the provided link is to access the next or previous page of data. + readOnly: true + OrganizationDiscoveryPostRequest: + type: object + required: + - organizationId + - attributes + properties: + organizationId: + type: string + description: The ID of the organization whose discovery attributes are to be added. + example: '06c1f4e2-3339-44e4-a825-96585e3653b1' + attributes: + type: array + items: + $ref: '#/components/schemas/DiscoveryAttribute' + OrganizationDiscoveryAttributes: + type: object + required: + - attributes + properties: + attributes: + type: array + items: + $ref: '#/components/schemas/DiscoveryAttribute' + DiscoveryAttribute: + type: object + required: + - type + - value + properties: + type: + type: string + example: 'emailDomain' + values: + type: array + items: + type: string + example: 'abc.com' + OrganizationsDiscoveryResponse: + type: object + properties: + totalResults: + type: integer + example: 10 + startIndex: + type: integer + example: 1 + count: + type: integer + example: 10 + links: + type: array + items: + $ref: '#/components/schemas/Link' + example: + [ + { + "href": "/api/server/v1/organizations/discovery?filter=attributes.type+eq+emailDomain&limit=10&offset=50", + "rel": "next", + }, { + "href": "/api/server/v1/organizations/discovery?filter=attributes.type+eq+emailDomain&limit=10&offset=30", + "rel": "previous", + } + ] + organizations: + type: array + items: + $ref: '#/components/schemas/OrganizationDiscoveryResponse' + OrganizationDiscoveryResponse: + type: object + required: + - organizationId + - organizationName + - orgHandle + - attributes + properties: + organizationId: + type: string + description: The ID of the organization. + example: '06c1f4e2-3339-44e4-a825-96585e3653b1' + organizationName: + type: string + description: The name of the organization. + example: 'ABC Builders' + orgHandle: + type: string + description: The handle of the organization. + example: 'abcbuilders' + attributes: + type: array + items: + $ref: '#/components/schemas/DiscoveryAttribute' + OrganizationDiscoveryCheckPOSTRequest: + required: + - type + - value + type: object + properties: + type: + type: string + example: 'emailDomain' + value: + type: string + example: 'abc.com' + OrganizationDiscoveryCheckPOSTResponse: + type: object + required: + - available + properties: + available: + type: boolean + example: true + #-------------------------------------------------------- + # Descriptions of Organization Management API responses. + #-------------------------------------------------------- + responses: + BadRequest: + description: Invalid input in the request. + content: + 'application/json': + schema: + $ref: '#/components/schemas/Error' + NotFound: + description: Requested resource is not found. + content: + 'application/json': + schema: + $ref: '#/components/schemas/Error' + Unauthorized: + description: Authentication information is missing or invalid. + Forbidden: + description: Access forbidden. + ServerError: + description: Internal server error. + content: + 'application/json': + schema: + $ref: '#/components/schemas/Error' + NotImplemented: + description: Not Implemented. + content: + 'application/json': + schema: + $ref: '#/components/schemas/Error' + OrgNotFound: + description: Organization Not Found + OrgExist: + description: Organization Exist + #----------------------------------------------------- + # Applicable authentication mechanisms. + #----------------------------------------------------- + securitySchemes: + OAuth2: + type: oauth2 + flows: + authorizationCode: + authorizationUrl: 'https://api.asgardeo.io/t/{organization-name}/oauth2/authorize' + tokenUrl: 'https://api.asgardeo.io/t/{organization-name}/oauth2/token' + scopes: {} diff --git a/docusaurus-asgardeo/static/apis/restapis/organization-user-share-v2.yaml b/docusaurus-asgardeo/static/apis/restapis/organization-user-share-v2.yaml new file mode 100644 index 0000000000..88edb4f6c0 --- /dev/null +++ b/docusaurus-asgardeo/static/apis/restapis/organization-user-share-v2.yaml @@ -0,0 +1,1080 @@ +openapi: 3.0.0 +info: + version: 1.0.0 + title: "User Sharing API (v2)" + description: |- + This document defines the **User Sharing REST API (v2)** for organizations in **Asgardeo**. + It enables organization administrators to: + - Share users across child organizations. + - Configure per-organization user role assignments. + - Manage and revoke shared access. + - Retrieve a user's shared organizations and effective roles. + + **Shared scopes with User Sharing API v1:** The OAuth2 scopes `internal_user_share`, `internal_user_unshare`, and `internal_user_shared_access_view` are shared between this API (User Sharing v2) and the User Sharing v1 API. Authorizing either API automatically grants access to the equivalent endpoints in the other that use the same scopes. + + contact: + name: WSO2 + url: 'https://wso2.com/asgardeo/' + email: iam-dev@wso2.org + license: + name: Apache 2.0 + url: 'http://www.apache.org/licenses/LICENSE-2.0.html' +servers: + - url: 'https://api.asgardeo.io/t/{organization-name}/api/server/v2' + variables: + organization-name: + default: "{organization-name}" + +security: + - OAuth2: [] + +paths: + /users/share: + post: + tags: + - User Sharing + summary: Share users with specific organizations + description: |- + Share one or more users with a selected set of organizations, optionally + assigning roles to each shared user in each target organization. + + This endpoint is treated as a **processing function**: + it triggers a sharing process and responds with `202 Accepted`. + + **Scope required:** `internal_user_share` + operationId: shareUsersWithSelected + requestBody: + required: true + content: + application/json: + schema: + $ref: "#/components/schemas/UserShareSelectedRequestBody" + example: + userCriteria: + userIds: + - "7a1b7d63-8cfc-4dc9-9332-3f84641b72d8" + - "5d2a1c84-9f7a-43cd-b12e-6e52d7f87e16" + organizations: + - orgId: "b028ca17-8f89-449c-ae27-fa955e66465d" + policy: "SELECTED_ORG_ONLY" + roleAssignment: + mode: "SELECTED" + roles: + - displayName: "Org Admin" + audience: + display: "My Org 1" + type: "organization" + - orgId: "a17b28ca-9f89-449c-ae27-fa955e66465f" + policy: "SELECTED_ORG_WITH_ALL_EXISTING_AND_FUTURE_CHILDREN" + responses: + "202": + description: User sharing process triggered successfully. + content: + application/json: + schema: + $ref: "#/components/schemas/ProcessSuccessResponse" + example: + status: "Processing" + details: "User sharing process triggered successfully." + "400": + description: Bad Request + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + "500": + description: Internal Server Error + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{organization-name}/api/server/v2/users/share' \ + -H 'Content-Type: application/json' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "userCriteria": { + "userIds": [ + "7a1b7d63-8cfc-4dc9-9332-3f84641b72d8", + "5d2a1c84-9f7a-43cd-b12e-6e52d7f87e16" + ] + }, + "organizations": [ + { + "orgId": "b028ca17-8f89-449c-ae27-fa955e66465d", + "policy": "SELECTED_ORG_ONLY", + "roleAssignment": { + "mode": "SELECTED", + "roles": [ + { + "displayName": "Org Admin", + "audience": { + "display": "My Org 1", + "type": "organization" + } + } + ] + } + }, + { + "orgId": "a17b28ca-9f89-449c-ae27-fa955e66465f", + "policy": "SELECTED_ORG_WITH_ALL_EXISTING_AND_FUTURE_CHILDREN" + } + ] + }' + + patch: + tags: + - User Sharing + summary: Perform incremental role assignment operations for already shared users + description: |- + Perform **incremental updates** to the shared attributes (eg: role assignments) update of already shared users. + + This endpoint supports **SCIM-like PATCH semantics**: + - `op: "add"` → assign additional roles. + - `op: "remove"` → remove specific roles. + + > **Note:** + > Only **role assignments** updates are managed here as of now. Sharing/unsharing organizations + > is handled via `/users/share`, `/users/share-with-all`, `/users/unshare`, + > and `/users/unshare-with-all`. + + **Scope required:** `internal_user_shared_access_update` + operationId: patchUserSharing + requestBody: + required: true + content: + application/json: + schema: + $ref: "#/components/schemas/UserSharingPatchRequest" + examples: + addAndRemoveRoles: + summary: Add and remove roles for a shared user in a specific organization + value: + userCriteria: + userIds: + - "7a1b7d63-8cfc-4dc9-9332-3f84641b72d8" + Operations: + - op: "add" + path: "organizations[orgId eq b028ca17-8f89-449c-ae27-fa955e66465d].roles" + value: + - displayName: "Org Viewer" + audience: + display: "My Org 1" + type: "organization" + - displayName: "App Editor" + audience: + display: "My App 1" + type: "application" + - op: "remove" + path: "organizations[orgId eq b028ca17-8f89-449c-ae27-fa955e66465d].roles" + value: + - displayName: "Org Admin" + audience: + display: "My Org 1" + type: "organization" + responses: + "202": + description: Role assignment patch operation processed successfully. + content: + application/json: + schema: + $ref: "#/components/schemas/ProcessSuccessResponse" + example: + status: "Processing" + details: "Shared user attributes patch process triggered successfully." + "400": + description: Bad Request + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + "404": + description: Not Found + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + "500": + description: Internal Server Error + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + x-codeSamples: + - lang: Curl + source: | + curl --location --request PATCH 'https://api.asgardeo.io/t/{organization-name}/api/server/v2/users/share' \ + -H 'Content-Type: application/json' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "userCriteria": { + "userIds": [ + "7a1b7d63-8cfc-4dc9-9332-3f84641b72d8" + ] + }, + "Operations": [ + { + "op": "add", + "path": "organizations[orgId eq b028ca17-8f89-449c-ae27-fa955e66465d].roles", + "value": [ + { + "displayName": "Org Viewer", + "audience": { + "display": "My Org 1", + "type": "organization" + } + }, + { + "displayName": "App Editor", + "audience": { + "display": "My App 1", + "type": "application" + } + } + ] + }, + { + "op": "remove", + "path": "organizations[orgId eq b028ca17-8f89-449c-ae27-fa955e66465d].roles", + "value": [ + { + "displayName": "Org Admin", + "audience": { + "display": "My Org 1", + "type": "organization" + } + } + ] + } + ] + }' + + /users/share-with-all: + post: + tags: + - User Sharing + summary: Share users with all organizations + description: |- + Share one or more users with **all organizations** according to the specified policy. + + A common `roleAssignment` can be provided to assign roles in all matching organizations. + + This endpoint is treated as a **processing function** and responds with `202 Accepted`. + + **Scope required:** `internal_user_share` + operationId: shareUsersWithAll + requestBody: + required: true + content: + application/json: + schema: + $ref: "#/components/schemas/UserShareAllRequestBody" + example: + userCriteria: + userIds: + - "7a1b7d63-8cfc-4dc9-9332-3f84641b72d8" + policy: "ALL_EXISTING_AND_FUTURE_ORGS" + roleAssignment: + mode: "SELECTED" + roles: + - displayName: "Global Org Viewer" + audience: + display: "My Org 1" + type: "organization" + responses: + "202": + description: Share-all process triggered successfully. + content: + application/json: + schema: + $ref: "#/components/schemas/ProcessSuccessResponse" + "400": + description: Bad Request + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + "500": + description: Internal Server Error + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{organization-name}/api/server/v2/users/share-with-all' \ + -H 'Content-Type: application/json' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "userCriteria": { + "userIds": [ + "7a1b7d63-8cfc-4dc9-9332-3f84641b72d8" + ] + }, + "policy": "ALL_EXISTING_AND_FUTURE_ORGS", + "roleAssignment": { + "mode": "SELECTED", + "roles": [ + { + "displayName": "Global Org Viewer", + "audience": { + "display": "My Org 1", + "type": "organization" + } + } + ] + } + }' + + /users/unshare: + post: + tags: + - User Sharing + summary: Unshare users from specific organizations + description: |- + Unshare one or more users from a selected set of organizations. + + > **Note:** + > This only removes the user from the specified organizations. If the user + > was shared with a parent org plus its children via a broader policy, + > you must explicitly include all relevant organization IDs when unsharing. + + This endpoint is treated as a **processing function** and responds with `202 Accepted`. + + **Scope required:** `internal_user_unshare` + operationId: unshareUsersFromSelected + requestBody: + required: true + content: + application/json: + schema: + $ref: "#/components/schemas/UserUnshareSelectedRequestBody" + example: + userCriteria: + userIds: + - "7a1b7d63-8cfc-4dc9-9332-3f84641b72d8" + orgIds: + - "b028ca17-8f89-449c-ae27-fa955e66465d" + - "a17b28ca-9f89-449c-ae27-fa955e66465f" + responses: + "202": + description: Unsharing process triggered successfully. + content: + application/json: + schema: + $ref: "#/components/schemas/ProcessSuccessResponse" + example: + status: "Processing" + details: "User unsharing process triggered successfully." + "400": + description: Bad Request + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + "500": + description: Internal Server Error + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{organization-name}/api/server/v2/users/unshare' \ + -H 'Content-Type: application/json' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "userCriteria": { + "userIds": [ + "7a1b7d63-8cfc-4dc9-9332-3f84641b72d8" + ] + }, + "orgIds": [ + "b028ca17-8f89-449c-ae27-fa955e66465d", + "a17b28ca-9f89-449c-ae27-fa955e66465f" + ] + }' + + /users/unshare-with-all: + post: + tags: + - User Sharing + summary: Unshare users from all organizations + description: |- + Completely remove all shared access for one or more users from **all organizations**. + + This endpoint is treated as a **processing function** and responds with `202 Accepted`. + + **Scope required:** `internal_user_unshare` + operationId: unshareUsersFromAll + requestBody: + required: true + content: + application/json: + schema: + $ref: "#/components/schemas/UserUnshareAllRequestBody" + example: + userCriteria: + userIds: + - "7a1b7d63-8cfc-4dc9-9332-3f84641b72d8" + responses: + "202": + description: Unshare-all process triggered successfully. + content: + application/json: + schema: + $ref: "#/components/schemas/ProcessSuccessResponse" + example: + status: "Processing" + details: "User unsharing process triggered successfully." + "400": + description: Bad Request + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + "500": + description: Internal Server Error + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{organization-name}/api/server/v2/users/unshare-with-all' \ + -H 'Content-Type: application/json' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "userCriteria": { + "userIds": [ + "7a1b7d63-8cfc-4dc9-9332-3f84641b72d8" + ] + } + }' + + /users/{userId}/share: + get: + tags: + - User Accessible Organizations + summary: List organizations where the user has shared access + description: |- + Retrieve the list of organizations where the specified user has shared access, + including per-organization effective role assignments. + + The response shape depends on how the user was shared: + - If user has been shared via **`ALL_EXISTING_AND_FUTURE_ORGS`** policy → top-level `sharingMode` is returned, + and no per-org `sharingMode` is present on each organization entry. + - If user has been shared via **`SELECTED_ORG_WITH_ALL_EXISTING_AND_FUTURE_CHILDREN`** → no top-level `sharingMode` is returned, + and each organization entry includes its own `sharingMode`. + - If user has not been shared under any future applicable policies mentioned above, the response will simply include the list of shared organizations without any `sharingMode` information. + + This follows the same pattern as **`GET /applications/{applicationId}/share`**. + + **Scope required:** `internal_user_shared_access_view` + operationId: getUserSharedOrganizations + parameters: + - in: path + name: userId + required: true + schema: + type: string + description: The ID of the user. + - in: query + name: before + required: false + schema: + type: string + example: "Ng==" + description: Base64 encoded cursor value for backward pagination. + - in: query + name: after + required: false + schema: + type: string + example: "Ng==" + description: Base64 encoded cursor value for forward pagination. + - in: query + name: filter + required: false + schema: + type: string + example: "orgId eq b028ca17-8f89-449c-ae27-fa955e66465d" + description: |- + Condition to filter the retrieval of records. + Supports `sw`, `co`, `ew`, and `eq` operations. + - in: query + name: limit + required: false + schema: + type: integer + example: 10 + description: |- + Maximum number of records to return. If you do not specify this parameter, + this will return all shared organizations. + - in: query + name: recursive + required: false + schema: + type: boolean + description: |- + Determines whether a recursive search should happen. + If set to true, includes shared organizations in all levels of the hierarchy; + if set to false, includes only shared organizations in the next level of the hierarchy. + - in: query + name: attributes + required: false + schema: + type: string + example: "roles" + description: |- + Specifies the required parameters in the response. + Supported values: `roles`, `sharingMode`. + responses: + "200": + description: Successful response with the user's shared organizations. + content: + application/json: + schema: + oneOf: + - $ref: "#/components/schemas/UserSharedOrgsAllResponse" + - $ref: "#/components/schemas/UserSharedOrgsSelectedResponse" + examples: + sharedWithAll: + summary: User shared with all organizations + value: + links: + - href: "/t/{organization-name}/api/server/v2/users/7a1b7d63-8cfc-4dc9-9332-3f84641b72d8/share?limit=10&after=MTA=" + rel: "next" + sharingMode: + policy: "ALL_EXISTING_AND_FUTURE_ORGS" + roleAssignment: + mode: "SELECTED" + roles: + - displayName: "Global Org Viewer" + audience: + display: "My Org 1" + type: "organization" + organizations: + - orgId: "b028ca17-8f89-449c-ae27-fa955e66465d" + orgName: "Child Org 1" + orgHandle: "child-org-1" + orgStatus: "ACTIVE" + orgRef: "/t/wso2.com/api/server/v1/organizations/b028ca17-8f89-449c-ae27-fa955e66465d" + hasChildren: true + depthFromRoot: 1 + parentOrgId: "08f8c1d2-4b3e-4c5a-9f6b-7d8e9f0a1b2c" + parentUserId: "7a1b7d63-8cfc-4dc9-9332-3f84641b72d8" + sharedUserId: "550e8400-e29b-41d4-a716-446655440000" + sharedType: "SHARED" + roles: + - displayName: "Global Org Viewer" + audience: + display: "My Org 1" + type: "organization" + sharedWithSelected: + summary: User shared with selected organizations + value: + links: + - href: "/t/{organization-name}/api/server/v2/users/7a1b7d63-8cfc-4dc9-9332-3f84641b72d8/share?limit=10&after=MTA=" + rel: "next" + organizations: + - orgId: "b028ca17-8f89-449c-ae27-fa955e66465d" + orgName: "Child Org 1" + orgHandle: "child-org-1" + orgStatus: "ACTIVE" + orgRef: "/t/wso2.com/api/server/v1/organizations/b028ca17-8f89-449c-ae27-fa955e66465d" + hasChildren: true + depthFromRoot: 1 + parentOrgId: "08f8c1d2-4b3e-4c5a-9f6b-7d8e9f0a1b2c" + parentUserId: "7a1b7d63-8cfc-4dc9-9332-3f84641b72d8" + sharedUserId: "550e8400-e29b-41d4-a716-446655440000" + sharedType: "SHARED" + sharingMode: + policy: "SELECTED_ORG_WITH_ALL_EXISTING_AND_FUTURE_CHILDREN" + roleAssignment: + mode: "SELECTED" + roles: + - displayName: "Org Admin" + audience: + display: "My Org 1" + type: "organization" + roles: + - displayName: "Org Admin" + audience: + display: "My Org 1" + type: "organization" + - orgId: "a17b28ca-9f89-449c-ae27-fa955e66465f" + orgName: "Child Org 2" + orgHandle: "child-org-2" + orgStatus: "ACTIVE" + orgRef: "/t/wso2.com/api/server/v1/organizations/a17b28ca-9f89-449c-ae27-fa955e66465f" + hasChildren: false + depthFromRoot: 1 + parentOrgId: "08f8c1d2-4b3e-4c5a-9f6b-7d8e9f0a1b2c" + parentUserId: "7a1b7d63-8cfc-4dc9-9332-3f84641b72d8" + sharedUserId: "3f2504e0-4f89-41d3-9a0c-0305e82c3301" + sharedType: "SHARED" + sharingMode: + policy: "SELECTED_ORG_WITH_ALL_EXISTING_AND_FUTURE_CHILDREN" + roleAssignment: + mode: "NONE" + roles: [] + "400": + description: Bad Request + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + "500": + description: Internal Server Error + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + x-codeSamples: + - lang: Curl + label: Basic + source: | + curl --location 'https://api.asgardeo.io/t/{organization-name}/api/server/v2/users/{userId}/share' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + - lang: Curl + label: With pagination and attributes + source: | + curl --location 'https://api.asgardeo.io/t/{organization-name}/api/server/v2/users/{userId}/share?limit=10&after=Ng==&attributes=roles,sharingMode&recursive=true' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + - lang: Curl + label: With filter + source: | + curl --location 'https://api.asgardeo.io/t/{organization-name}/api/server/v2/users/{userId}/share?filter=orgId+eq+b028ca17-8f89-449c-ae27-fa955e66465d' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + +components: + securitySchemes: + OAuth2: + type: oauth2 + flows: + authorizationCode: + authorizationUrl: "https://api.asgardeo.io/t/{organization-name}/oauth2/authorize" + tokenUrl: "https://api.asgardeo.io/t/{organization-name}/oauth2/token" + scopes: + internal_user_share: "Share users across organizations." + internal_user_unshare: "Unshare users from organizations." + internal_user_shared_access_view: "View shared organizations and roles for a user." + internal_user_shared_access_update: "Update shared attributes (e.g., roles) for shared users." + + schemas: + + # ===== Core request models ===== + + UserCriteria: + type: object + description: Criteria for selecting users to share/unshare. + properties: + userIds: + type: array + description: List of user IDs. + items: + type: string + required: + - userIds + + UserShareSelectedRequestBody: + type: object + description: |- + Request body for sharing users with a **selected set of organizations**. + required: + - userCriteria + - organizations + properties: + userCriteria: + $ref: "#/components/schemas/UserCriteria" + organizations: + type: array + description: List of organizations to share users with, along with policies and optional role assignments. + items: + $ref: "#/components/schemas/UserOrgShareConfig" + + UserOrgShareConfig: + type: object + description: Per-organization sharing configuration for selected organizations. + required: + - orgId + - policy + properties: + orgId: + type: string + description: Organization ID to share the users with. + policy: + type: string + description: |- + Sharing scope for this organization. + + Possible values: + - `SELECTED_ORG_ONLY` + - `SELECTED_ORG_WITH_ALL_EXISTING_AND_FUTURE_CHILDREN` + roleAssignment: + $ref: "#/components/schemas/RoleAssignment" + description: |- + Optional role assignment configuration for this organization. + If omitted, the default behavior is to assign **no roles** (equivalent to `mode = NONE`). + + UserShareAllRequestBody: + type: object + description: |- + Request body for sharing users with **all organizations** controlled by the selected policy. + required: + - userCriteria + - policy + properties: + userCriteria: + $ref: "#/components/schemas/UserCriteria" + policy: + type: string + description: |- + Global sharing policy. + + Possible values: + - `ALL_EXISTING_AND_FUTURE_ORGS` + roleAssignment: + $ref: "#/components/schemas/RoleAssignment" + description: |- + Optional global role assignment configuration that applies to all organizations + covered by this policy. If omitted, default behavior is **no roles**. + + UserUnshareSelectedRequestBody: + type: object + description: |- + Request body for unsharing users from selected organizations. + required: + - userCriteria + - orgIds + properties: + userCriteria: + $ref: "#/components/schemas/UserCriteria" + orgIds: + type: array + description: List of organization IDs from which users should be unshared. + items: + type: string + + UserUnshareAllRequestBody: + type: object + description: |- + Request body for unsharing users from **all organizations**. + required: + - userCriteria + properties: + userCriteria: + $ref: "#/components/schemas/UserCriteria" + + # ===== PATCH models ===== + + UserSharingPatchRequest: + type: object + description: |- + PATCH request for performing incremental role assignment operations + on already shared users. + required: + - userCriteria + - Operations + properties: + userCriteria: + $ref: "#/components/schemas/UserCriteria" + Operations: + type: array + items: + $ref: "#/components/schemas/UserSharingPatchOperation" + + UserSharingPatchOperation: + type: object + description: |- + A single PATCH operation (SCIM-like) for user sharing. + + Currently supported: + - `op: "add"` → Add roles. + - `op: "remove"` → Remove roles. + required: + - op + - path + properties: + op: + type: string + description: "Operation type. Supported values: `add`, `remove`." + path: + type: string + description: |- + JSON-like path in the format: + - `organizations[orgId eq \"\"].roles` + value: + type: array + description: |- + List of roles to add/remove under the specified path. + items: + $ref: "#/components/schemas/RoleShareConfig" + + # ===== Role assignment models ===== + + RoleAssignment: + type: object + description: |- + Role assignment configuration for shared users. + + This controls which roles are assigned to the user in the target organization. + + - `NONE` → Do not assign any roles via user sharing. + - `SELECTED` → Assign only the roles listed under `roles`. + properties: + mode: + type: string + enum: + - NONE + - SELECTED + default: SELECTED + description: Mode of role assignment. + roles: + type: array + description: |- + List of roles to assign when `mode = SELECTED`. + Required when `mode = SELECTED`. Ignored when `mode = NONE`. + items: + $ref: "#/components/schemas/RoleShareConfig" + + RoleShareConfig: + type: object + description: |- + Role to be assigned to the shared user in the sub-organization. + required: + - displayName + - audience + properties: + displayName: + type: string + description: "Human-readable name of the role." + example: "Org Admin" + audience: + type: object + required: + - display + - type + properties: + display: + type: string + description: "Display name of the audience (organization or application)." + example: "My Org 1" + type: + type: string + description: |- + Type of the role audience: + - `organization` + - `application` + example: "organization" + + # ===== Sharing Mode models ===== + + SharingModeAll: + type: object + description: |- + Top-level sharing mode present when the user is shared with ALL organizations. + Policy is always `ALL_EXISTING_AND_FUTURE_ORGS`. + required: + - policy + - roleAssignment + properties: + policy: + type: string + enum: + - ALL_EXISTING_AND_FUTURE_ORGS + description: Global sharing policy covering all existing and future organizations. + roleAssignment: + $ref: "#/components/schemas/RoleAssignment" + + SharingModeSelected: + type: object + description: |- + Per-org sharing mode present when the user is shared with SELECTED organizations. + Policy is always `SELECTED_ORG_WITH_ALL_EXISTING_AND_FUTURE_CHILDREN`. + required: + - policy + - roleAssignment + properties: + policy: + type: string + enum: + - SELECTED_ORG_WITH_ALL_EXISTING_AND_FUTURE_CHILDREN + description: Sharing policy scoped to a selected organization and its children. + roleAssignment: + $ref: "#/components/schemas/RoleAssignment" + + # ===== Organization entry models ===== + + UserSharedOrganizationBase: + type: object + description: Common fields for a shared organization entry. + properties: + orgId: + type: string + description: ID of the child organization. + orgName: + type: string + description: Name of the child organization. + orgHandle: + type: string + description: Unique, human-readable handle of the organization. + example: "sampleOrg" + orgStatus: + type: string + description: Current status of the organization. + example: "ACTIVE" + orgRef: + type: string + description: API reference of the organization resource. + example: "/t/wso2.com/api/server/v1/organizations/b4526d91-a8bf-43d2-8b14-c548cf73065b" + hasChildren: + type: boolean + description: Indicates whether the organization has child organizations. + depthFromRoot: + type: integer + description: Depth of the organization in the hierarchy, where root is 0. + example: 1 + parentOrgId: + type: string + nullable: true + description: ID of the parent (sharing initiated) organization. + parentUserId: + type: string + nullable: true + description: ID of the user in the parent (sharing initiated) organization. + sharedUserId: + type: string + description: ID of the shared user object in the target organization. + sharedType: + type: string + description: Shared type of the user. + example: "SHARED" + roles: + type: array + description: Effective roles assigned to this user in this organization via user sharing. + items: + $ref: "#/components/schemas/RoleShareConfig" + + UserSharedOrganizationAllEntry: + description: |- + Organization entry when user is shared via ALL_EXISTING_AND_FUTURE_ORGS policy. + No per-org sharingMode is present. + allOf: + - $ref: "#/components/schemas/UserSharedOrganizationBase" + + UserSharedOrganizationSelectedEntry: + description: |- + Organization entry when user is shared via SELECTED org policy. + Includes per-org sharingMode with policy SELECTED_ORG_WITH_ALL_EXISTING_AND_FUTURE_CHILDREN. + allOf: + - $ref: "#/components/schemas/UserSharedOrganizationBase" + - type: object + required: + - sharingMode + properties: + sharingMode: + $ref: "#/components/schemas/SharingModeSelected" + + # ===== Top-level response models ===== + + UserSharedOrgsAllResponse: + type: object + description: |- + Response when the user is shared with ALL organizations. + - Top-level `sharingMode` is present with policy `ALL_EXISTING_AND_FUTURE_ORGS`. + - Per-org `sharingMode` is absent on each organization entry. + required: + - sharingMode + - organizations + properties: + links: + type: array + items: + $ref: "#/components/schemas/Link" + sharingMode: + $ref: "#/components/schemas/SharingModeAll" + organizations: + type: array + items: + $ref: "#/components/schemas/UserSharedOrganizationAllEntry" + + UserSharedOrgsSelectedResponse: + type: object + description: |- + Response when the user is shared with SELECTED organizations. + - Top-level `sharingMode` is absent. + - Each organization entry includes its own `sharingMode` with policy + `SELECTED_ORG_WITH_ALL_EXISTING_AND_FUTURE_CHILDREN`. + required: + - organizations + properties: + links: + type: array + items: + $ref: "#/components/schemas/Link" + organizations: + type: array + items: + $ref: "#/components/schemas/UserSharedOrganizationSelectedEntry" + + # ===== Common models ===== + + Link: + type: object + properties: + href: + type: string + example: "/t/{organization-name}/api/server/v2/users/7a1b7d63-8cfc-4dc9-9332-3f84641b72d8/share?limit=10&after=MTA=" + rel: + type: string + example: "next" + + ProcessSuccessResponse: + type: object + description: |- + Indicates that a sharing / unsharing / patch process has been triggered. + properties: + status: + type: string + example: "Processing" + details: + type: string + example: "User sharing process triggered successfully." + + Error: + type: object + description: | + Error response model with a code, message, description, and trace ID. + required: + - code + - message + - traceId + properties: + code: + type: string + example: "US-00000" + message: + type: string + example: "Some error message." + description: + type: string + example: "Some error description." + traceId: + type: string + example: "e0fbcfeb-7fc2-4b62-8b82-72d3c5fbcdeb" diff --git a/docusaurus-asgardeo/static/apis/restapis/organization-user-share.yaml b/docusaurus-asgardeo/static/apis/restapis/organization-user-share.yaml new file mode 100644 index 0000000000..e563bbd821 --- /dev/null +++ b/docusaurus-asgardeo/static/apis/restapis/organization-user-share.yaml @@ -0,0 +1,804 @@ +openapi: 3.0.0 +info: + version: "v1" + title: 'User Sharing API (deprecated)' + description: |- + This document defines the **User Sharing REST API for organizations** in **Asgardeo**. This enables organization administrators to share users across child organizations, manage and revoke shared access, and retrieve users' shared organizations and roles. + + **Shared scopes with User Sharing API v2:** The OAuth2 scopes `internal_user_share`, `internal_user_unshare`, and `internal_user_shared_access_view` are shared between this API (v1) and the User Sharing v2 API. Authorizing either API automatically grants access to the equivalent endpoints in the other that use the same scopes. + +security: + - OAuth2: [] + - BasicAuth: [] + +servers: + - url: 'https://api.asgardeo.io/t/{organization-name}/api/server/v1' + variables: + tenant-domain: + default: "{tenant-domain}" + +paths: + /users/share: + post: + tags: + - User Sharing + summary: Share a user across specific organizations + description: | + This API shares one or more users across specified organizations, assigning roles based on the provided policy. The policy defines the sharing scope for each organization, including whether access extends to child organizations. + + > **Important**
      + > If you switch a user from a general sharing policy to a selective sharing policy or vice versa, without unsharing a user, it can lead to access issues. To ensure a smooth transition, first unshare the user from all organizations and share them again with the desired organization(s) under the updated policy.
      + > If you overlook this step and notice unexpected user-sharing behavior when new organizations are created, use the `/users/unshare-with-all` API to reset access before applying the new sharing policy. + + Scope(Permission) required: `internal_user_share` + operationId: processUserSharing + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/UserShareRequestBody' + example: + userCriteria: + userIds: + - "7a1b7d63-8cfc-4dc9-9332-3f84641b72d8" + - "5d2a1c84-9f7a-43cd-b12e-6e52d7f87e16" + organizations: + - orgId: "b028ca17-8f89-449c-ae27-fa955e66465d" + policy: "SELECTED_ORG_ONLY" + roles: + - displayName: "role_2" + audience: + display: "My Org 1" + type: "organization" + - orgId: "a17b28ca-9f89-449c-ae27-fa955e66465f" + policy: "SELECTED_ORG_WITH_EXISTING_IMMEDIATE_AND_FUTURE_CHILDREN" + roles: [] + required: true + responses: + '202': + description: Sharing process triggered successfully. + content: + application/json: + schema: + $ref: '#/components/schemas/ProcessSuccessResponse' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Internal Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/users/share' \ + -H 'Accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token} \ + -d '{ + "userCriteria": { + "userIds": [ + "7a1b7d63-8cfc-4dc9-9332-3f84641b72d8", + "5d2a1c84-9f7a-43cd-b12e-6e52d7f87e16" + ] + }, + "organizations": [ + { + "orgId": "b028ca17-8f89-449c-ae27-fa955e66465d", + "policy": "SELECTED_ORG_ONLY", + "roles": [ + { + "displayName": "role_2", + "audience": { + "display": "My Org 1", + "type": "organization" + } + } + ] + }, + { + "orgId": "a17b28ca-9f89-449c-ae27-fa955e66465f", + "policy": "SELECTED_ORG_WITH_EXISTING_IMMEDIATE_AND_FUTURE_CHILDREN", + "roles": [] + } + ] + }' + x-codegen-request-body-name: body + + /users/share-with-all: + post: + tags: + - User Sharing + summary: Share a user with all organizations + description: | + This API shares users across all organizations, applying the provided roles to each organization. The policy determines the scope of sharing, including whether it applies to all current organizations or future organizations as well. + + > **Important**
      + > If you switch a user from a general sharing policy to a selective sharing policy or vice versa, without unsharing a user, it can lead to access issues. To ensure a smooth transition, first unshare the user from all organizations and share them again with the desired organization(s) under the updated policy.
      + > If you overlook this step and notice unexpected user-sharing behavior when new organizations are created, use the `/users/unshare-with-all` API to reset access before applying the new sharing policy. + + Scope(Permission) required: `internal_user_share` + operationId: processUserSharingAll + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/UserShareWithAllRequestBody' + example: + userCriteria: + userIds: + - "7a1b7d63-8cfc-4dc9-9332-3f84641b72d8" + - "5d2a1c84-9f7a-43cd-b12e-6e52d7f87e16" + policy: "ALL_EXISTING_ORGS_ONLY" + roles: + - displayName: "role_1" + audience: + display: "My Org 1" + type: "organization" + - displayName: "role_2" + audience: + display: "My App 1" + type: "application" + required: true + responses: + '202': + description: Sharing process triggered successfully. + content: + application/json: + schema: + $ref: '#/components/schemas/ProcessSuccessResponse' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Internal Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/users/share-with-all' \ + -H 'Accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token} \ + -d '{ + "userCriteria": { + "userIds": [ + "7a1b7d63-8cfc-4dc9-9332-3f84641b72d8", + "5d2a1c84-9f7a-43cd-b12e-6e52d7f87e16" + ] + }, + "policy": "ALL_EXISTING_ORGS_ONLY", + "roles": [ + { + "displayName": "role_1", + "audience": { + "display": "My Org 1", + "type": "organization" + } + }, + { + "displayName": "role_2", + "audience": { + "display": "My App 1", + "type": "application" + } + } + ] + }' + x-codegen-request-body-name: body + + /users/unshare: + post: + tags: + - User Sharing + summary: Unshare a user from specific organizations + description: | + The parent organization admins can use this API to unshare a shared user from a selected list of organizations. + The payload includes the list of user IDs and the organizations from which the users should be unshared. + + Note the following details: + - unsharing can only be done from the same organization that initially shared the user. + - if you have shared a user with an organization and its children, unsharing the user from that + organization will not unshare the user from the child organizations. + You must explicitly declare all the organization IDs from which the user should be removed. + + Scope(Permission) required: `internal_user_unshare` + operationId: processUserUnsharing + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/UserUnshareRequestBody' + example: + userCriteria: + userIds: + - "7a1b7d63-8cfc-4dc9-9332-3f84641b72d8" + - "5d2a1c84-9f7a-43cd-b12e-6e52d7f87e16" + organizations: + - "b028ca17-8f89-449c-ae27-fa955e66465d" + - "a17b28ca-9f89-449c-ae27-fa955e66465f" + required: true + responses: + '202': + description: Unsharing process triggered successfully. + content: + application/json: + schema: + $ref: '#/components/schemas/ProcessSuccessResponse' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Internal Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/users/unshare' \ + -H 'Accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token} \ + -d '{ + "userCriteria": { + "userIds": [ + "7a1b7d63-8cfc-4dc9-9332-3f84641b72d8", + "5d2a1c84-9f7a-43cd-b12e-6e52d7f87e16" + ] + }, + "organizations": [ + "b028ca17-8f89-449c-ae27-fa955e66465d", + "a17b28ca-9f89-449c-ae27-fa955e66465f" + ] + }' + x-codegen-request-body-name: body + + /users/unshare-with-all: + post: + tags: + - User Sharing + summary: Remove a user's shared access + description: | + This API removes all shared access for one or more users, unsharing them from all organizations. + Note that unsharing can only be done from the same organization that initially shared the user. + + Scope(Permission) required: `internal_user_unshare` + operationId: removeUserSharing + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/UserUnshareWithAllRequestBody' + example: + userCriteria: + userIds: + - "7a1b7d63-8cfc-4dc9-9332-3f84641b72d8" + - "5d2a1c84-9f7a-43cd-b12e-6e52d7f87e16" + required: true + responses: + '202': + description: Share removal process triggered successfully. + content: + application/json: + schema: + $ref: '#/components/schemas/ProcessSuccessResponse' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Internal Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/users/unshare-with-all' \ + -H 'Accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token} \ + -d '{ + "userCriteria": { + "userIds": [ + "7a1b7d63-8cfc-4dc9-9332-3f84641b72d8", + "5d2a1c84-9f7a-43cd-b12e-6e52d7f87e16" + ] + } + }' + x-codegen-request-body-name: body + + /users/{userId}/shared-organizations: + get: + tags: + - User Accessible Organizations + summary: Get the list of organizations accessible by the user + description: | + This API retrieves the list of organizations where the specified user has shared access. + + Scope(Permission) required: `internal_user_shared_access_view` + parameters: + - in: path + name: userId + required: true + schema: + type: string + description: The ID of the user. + - in: query + name: after + schema: + type: string + description: The cursor indicating the item after which the next page of results will begin. + - in: query + name: before + schema: + type: string + description: The cursor pointing to the item before which the previous page of results should be returned. + - in: query + name: limit + schema: + type: integer + description: The maximum number of results to return per page. + - in: query + name: filter + schema: + type: string + description: A filter to apply to the results, such as by organization name or other criteria. + - in: query + name: recursive + schema: + type: boolean + default: false + description: Whether to retrieve organizations recursively, including child organizations. + responses: + '200': + description: Successful Response with Accessible Organizations + content: + application/json: + schema: + $ref: '#/components/schemas/UserSharedOrganizationsResponse' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Internal Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/users/{userId}/shared-organizations' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token} + + /users/{userId}/shared-roles: + get: + tags: + - User Accessible Roles + summary: Get roles assigned to a user in an organization + description: | + This API fetches the roles assigned to the specified user within a particular organization.
      + Note that the roles returned are only the roles assigned by the organization that initially shared the user. + Any additional roles assigned to the user from the shared organizations are not included in this response. + + Scope(Permission) required: `internal_user_shared_access_view` + parameters: + - in: path + name: userId + required: true + schema: + type: string + description: The ID of the user for whom roles are being retrieved. + - in: query + name: orgId + required: true + schema: + type: string + description: The organization ID for which roles are being fetched. + - in: query + name: after + schema: + type: string + description: The cursor indicating the item after which the next page of results will begin. + - in: query + name: before + schema: + type: string + description: The cursor pointing to the item before which the previous page of results should be returned. + - in: query + name: limit + schema: + type: integer + description: The maximum number of results to return per page. + - in: query + name: filter + schema: + type: string + description: Filter to apply when retrieving the roles. + - in: query + name: recursive + schema: + type: boolean + description: Set to true to retrieve roles recursively. + responses: + '200': + description: Successful Response with Accessible Roles + content: + application/json: + schema: + $ref: '#/components/schemas/UserSharedRolesResponse' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Internal Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/users/{userId}/shared-roles?orgId={orgId}' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token} + +components: + + securitySchemes: + + BasicAuth: + type: http + scheme: basic + OAuth2: + type: oauth2 + flows: + authorizationCode: + authorizationUrl: 'https://api.asgardeo.io/t/{organization-name}/oauth2/authorize' + tokenUrl: 'https://api.asgardeo.io/t/{organization-name}/oauth2/token' + scopes: + share: internal_user_share + unshare: internal_user_unshare + view: internal_user_shared_access_view + + schemas: + + UserShareRequestBody: + type: object + description: | + The request body for sharing users with multiple child organizations. + Includes a list of users, organizations, sharing scope as policy, and roles. + required: + - userCriteria + - organizations + properties: + userCriteria: + type: object + description: Contains a list of user IDs to be shared. + properties: + userIds: + type: array + description: List of user IDs. + items: + type: string + description: The ID of a user to be shared. + organizations: + type: array + description: List of organizations specifying sharing scope and roles. + items: + type: object + required: + - orgId + - policy + properties: + orgId: + type: string + description: The ID of the organization to share the users with. + policy: + type: string + description: | + The scope of sharing for this organization. Possible values are: + + - SELECTED_ORG_ONLY:
      + Share the resource only with the selected organization. + - SELECTED_ORG_WITH_ALL_EXISTING_CHILDREN_ONLY:
      + Share with the selected organization and all its existing child organizations. New child organizations created after the policy is applied will **not** be included. + - SELECTED_ORG_WITH_ALL_EXISTING_AND_FUTURE_CHILDREN:
      + Share with the selected organization, all its current child organizations, and automatically include any future child organizations created later. + - SELECTED_ORG_WITH_EXISTING_IMMEDIATE_CHILDREN_ONLY:
      + Share only with the selected organization’s immediate existing child organizations. Future immediate children are **not** included. + - SELECTED_ORG_WITH_EXISTING_IMMEDIATE_AND_FUTURE_CHILDREN:
      + Share with the selected organization’s immediate existing child organizations and automatically include any immediate child organizations created in the future. + roles: + type: array + description: A list of roles to be shared with the organization. + items: + $ref: '#/components/schemas/RoleWithAudience' + example: + userCriteria: + userIds: + - "7a1b7d63-8cfc-4dc9-9332-3f84641b72d8" + - "5d2a1c84-9f7a-43cd-b12e-6e52d7f87e16" + organizations: + - orgId: "b028ca17-8f89-449c-ae27-fa955e66465d" + policy: "SELECTED_ORG_ONLY" + roles: + - displayName: "role_2" + audience: + display: "My Org 1" + type: "organization" + - orgId: "a17b28ca-9f89-449c-ae27-fa955e66465f" + policy: "SELECTED_ORG_ONLY" + roles: [] + + UserShareWithAllRequestBody: + type: object + description: | + Process a request to share users with all organizations. + The payload contains the roles applicable across all organizations and a policy that defines the scope of sharing. + required: + - userCriteria + - policy + properties: + userCriteria: + type: object + description: Contains a list of user IDs to be shared. + properties: + userIds: + type: array + description: List of user IDs. + items: + type: string + description: The ID of a user to be shared. + policy: + type: string + description: | + The scope of sharing for this organization. Possible values are: + + - ALL_EXISTING_ORGS_ONLY:
      + Share the resource with all organizations that exist at the time the policy is applied. New organizations created after the policy is applied will **not** be included. + - ALL_EXISTING_AND_FUTURE_ORGS:
      + Share the resource with all current organizations and automatically include any organizations created in the future. + - IMMEDIATE_EXISTING_ORGS_ONLY:
      + Share the resource only with immediate child organizations that exist when the policy is applied. Future immediate child organizations are **not** included. + - IMMEDIATE_EXISTING_AND_FUTURE_ORGS:
      + Share the resource with immediate existing child organizations and automatically include any immediate child organizations created in the future. + roles: + type: array + description: A list of roles shared across all organizations. + items: + $ref: '#/components/schemas/RoleWithAudience' + example: + userCriteria: + userIds: + - "7a1b7d63-8cfc-4dc9-9332-3f84641b72d8" + - "5d2a1c84-9f7a-43cd-b12e-6e52d7f87e16" + policy: "ALL_EXISTING_ORGS_ONLY" + roles: + - displayName: "role_1" + audience: + display: "My Org 1" + type: "organization" + - displayName: "role_2" + audience: + display: "My App 1" + type: "application" + + UserUnshareRequestBody: + type: object + description: | + The request body for unsharing users from multiple organizations. + Includes a list of user IDs and a list of organization IDs. + required: + - userCriteria + - organizations + properties: + userCriteria: + type: object + description: Contains a list of user IDs to be unshared. + properties: + userIds: + type: array + description: List of user IDs. + items: + type: string + description: The ID of a user to be unshared. + organizations: + type: array + description: List of organization IDs from which the users should be unshared. + items: + type: string + example: + userCriteria: + userIds: + - "7a1b7d63-8cfc-4dc9-9332-3f84641b72d8" + - "5d2a1c84-9f7a-43cd-b12e-6e52d7f87e16" + organizations: + - "b028ca17-8f89-449c-ae27-fa955e66465d" + - "a17b28ca-9f89-449c-ae27-fa955e66465f" + + UserUnshareWithAllRequestBody: + type: object + description: | + The request body for unsharing users from all organizations. + Includes a list of user IDs. + required: + - userCriteria + properties: + userCriteria: + type: object + description: Contains a list of user IDs to be unshared. + properties: + userIds: + type: array + description: List of user IDs. + items: + type: string + description: The ID of a user to be unshared. + example: + userCriteria: + userIds: + - "7a1b7d63-8cfc-4dc9-9332-3f84641b72d8" + - "5d2a1c84-9f7a-43cd-b12e-6e52d7f87e16" + + UserSharedOrganizationsResponse: + type: object + description: | + Response listing organizations where a user has shared access, including sharing policies, shared type and pagination links for navigating results. + properties: + links: + type: array + description: Pagination links for navigating the result set. + items: + type: object + properties: + href: + type: string + description: URL to navigate to the next or previous page. + rel: + type: string + description: Indicates if the link is for the "next" or "previous" page. + sharedOrganizations: + type: array + description: A list of shared access details for the user across multiple organizations + items: + type: object + properties: + orgId: + type: string + description: ID of the child organization + example: "b028ca17-8f89-449c-ae27-fa955e66465d" + orgName: + type: string + description: Name of the child organization + example: "Organization Name" + sharedUserId: + type: string + description: ID of the shared user + example: "7a1b7d63-8cfc-4dc9-9332-3f84641b72d8" + sharedType: + type: string + description: Shared type of the user (SHARED/INVITED) + example: "SHARED" + rolesRef: + type: string + description: URL reference to retrieve paginated roles for the shared user in this organization + example: "/api/server/v1/users/{userId}/shared-roles?orgId={orgId}" + + UserSharedRolesResponse: + type: object + description: | + Response showing the roles assigned to a user within a specific organization, with pagination support for large role sets. + properties: + links: + type: array + description: Pagination links for navigating the result set. + items: + type: object + properties: + href: + type: string + description: URL to navigate to the next or previous page. + rel: + type: string + description: Indicates if the link is for the "next" or "previous" page. + roles: + type: array + description: A list of roles with audience details + items: + $ref: '#/components/schemas/RoleWithAudience' + + RoleWithAudience: + type: object + description: | + Represents a user role within a specific audience (organization or application), defined by its display name and audience type. + required: + - displayName + - audience + properties: + displayName: + type: string + description: Display name of the role + example: "role_1" + audience: + type: object + required: + - display + - type + properties: + display: + type: string + description: Display name of the audience + example: "My Org 1" + type: + type: string + description: Type of the audience, e.g., 'organization' or 'application' + example: "organization" + + ProcessSuccessResponse: + type: object + description: | + Indicates that the sharing or unsharing process has started successfully, with the current status and relevant details. + properties: + status: + type: string + description: Status of the process. + example: "Processing" + details: + type: string + description: Additional information about the process. + example: "User sharing process triggered successfully." + + Error: + type: object + description: | + Details of an error, including code, message, description, and a trace ID to help with debugging. + required: + - code + - message + - traceId + properties: + code: + type: string + example: "OUI-00000" + description: An error code. + message: + type: string + example: "Some Error Message" + description: An error message. + description: + type: string + example: "Some Error Description" + description: An error description. + traceId: + type: string + format: uuid + example: "e0fbcfeb-7fc2-4b62-8b82-72d3c5fbcdeb" + description: A trace ID in UUID format to help with debugging. diff --git a/docusaurus-asgardeo/static/apis/restapis/password-recovery.yaml b/docusaurus-asgardeo/static/apis/restapis/password-recovery.yaml new file mode 100644 index 0000000000..2632889543 --- /dev/null +++ b/docusaurus-asgardeo/static/apis/restapis/password-recovery.yaml @@ -0,0 +1,936 @@ +openapi: 3.0.0 +info: + version: "v1-oas3" + title: Asgardeo - Password Recovery API + description: | + This is the RESTful API for password recovery initiated by the user. +
      To access this API in Asgardeo, you need to first [get an access token](https://wso2.com/asgardeo/docs/apis/authentication/#get-an-access-token) from your organization using the following scopes. + + Scopes required:
      + - ```internal_identity_mgt_view``` + - ```internal_identity_mgt_update``` + - ```internal_identity_mgt_create``` + - ```internal_identity_mgt_delete``` + +security: + - OAuth2: [] +servers: + - url: 'https://api.asgardeo.io/t/{organization-name}/api/users/v2' +paths: + /recovery/password/init: + post: + tags: + - Password Recovery + summary: | + Initiate password recovery + operationId: initiatePasswordRecovery + description: | + This API is used to initiate the password recovery flow. The API will return recovery information for password recovery. + responses: + '200': + description: | + The user is successfully identified for the given claims and returning available notification channels for the user. + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/AccountRecoveryType' + examples: + response: + value: + - mode: recoverWithNotifications + flowConfirmationCode: 1234-1234-1234-1234 + channelInfo: + recoveryCode: 1234-55678-5668-2345 + channels: + - id: 1 + type: EMAIL + value: wso2***********.com + preferred: false + - id: 2 + type: SMS + value: '**********123' + preferred: true + links: + - rel: next + href: /api/users/v2/recovery/password/recovery + type: POST + '400': + description: Bad Request. The request cannot be processed by the server. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + examples: + response: + value: + code: UAR-10001 + message: bad_request + description: Bad request. + traceId: 23456fghj678vb78 + '404': + description: >- + No user found for the given set of claims or no recovery channels + are availabe for the user. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + examples: + response: + value: + code: UAR-10002 + message: Not found + description: No user found. + traceId: 23456fghj678vb78 + '409': + description: Multiple users were found for the given claims. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + examples: + response: + value: + code: UAR-10008 + message: Conflict + description: Multiple users were found for given claims. + traceId: 23456fghj678vb78 + '500': + description: Server Error. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + examples: + response: + value: + code: UAR-15001 + message: Internal Error + description: Internal Error. + traceId: 23456fghj678vb78 + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{organization-name}/api/users/v2/recovery/password/init' \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "claims": [ + { + "uri": "http://wso2.org/claims/givenname", + "value": "user1" + } + ], + "properties": [ + { + "key": "key", + "value": "value" + } + ] + }' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/InitRequest' + description: | + Request to initiate password recovery process. The request should contain the claims to identify the user. User claims are `REQUIRED`. + required: true + /recovery/password/recover: + post: + tags: + - Password Recovery + summary: | + Get recovery information + operationId: recoverPassword + description: | + This API is used to send recovery information to the user who matches the recovery code via the channel specified by the channel ID. + The API will return the recovery flow confirmation code. + responses: + '202': + description: | + - Password recovery initiated via internal channels. API will send a `confirmationCode`/`otp` to the channel specified by the user. + - Use the confirmation code/OTP with "password recovery confirm API" to confirm the password recovery. + content: + application/json: + schema: + $ref: '#/components/schemas/PasswordRecoveryInternalNotifyResponse' + examples: + response: + value: + code: PWR-02002 + message: Password recovery information sent via user preferred notification channel. + flowConfirmationCode: 1234-1234-1234-1234 + notificationChannel: EMAIL + resendCode: 12345-45678-6789098-8765 + links: + - rel: next + href: api/users/v2/recovery/password/confirm + type: POST + - rel: resend + href: api/users/v2/recovery/password/resend + type: POST + '400': + description: Bad Request. Request cannot be processed by the server. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + examples: + response: + value: + code: PWR-10001 + message: bad_request + description: Bad request + traceId: 23456fghj678vb78 + '403': + description: Password recovery is not enabled. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + examples: + response: + value: + code: PWR-10004 + message: Forbidden + description: Password recovery is not enabled. + traceId: 23456fghj678vb78 + '404': + description: Recovery code is not found. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + examples: + response: + value: + code: PWR-10001 + message: not_found + description: Recovery code not found. + traceId: 23456fghj678vb78 + '406': + description: | + - The recovery code given in the request is not valid or expired. + - Channel ID is not valid + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + examples: + response: + value: + code: PWR-10003 + message: not acceptable + description: 'invalid error code: 1234-2345-12345-123456' + traceId: 23456fghj678vb78 + '500': + description: Server Error. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + examples: + response: + value: + code: PWR-15001 + message: Internal Error + description: Internal Error + traceId: 23456fghj678vb78 + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{organization-name}/api/users/v2/recovery/password/recover' \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "recoveryCode": "1234-5678-2455-3433", + "channelId": "1", + "properties": [ + { + "key": "key", + "value": "value" + } + ] + }' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/RecoveryRequest' + description: | + - Request to receive recovery notifications. + - The `recoveryCode` and `channelId` are required fields. + - Note that the `channelId` should always be a value larger than `0`. + required: true + /recovery/password/resend: + post: + tags: + - Password Recovery + summary: | + Resend password recovery confirmation details + operationId: resendConfirmation + description: | + - This API is used to resend a `confirmation code`/`OTP` to the user via a user-preferred channel defined at password recovery. + - The API will return the next API calls. + responses: + '202': + description: | + - This API will send a `confirmationCode`/`otp` to the channel specified by the user. + - Use the confirmation code/OTP with "password recovery confirm API" to confirm the password recovery. + content: + application/json: + schema: + $ref: '#/components/schemas/ResendConfirmationCodeInternalResponse' + examples: + response: + value: + code: PWR-02002 + message: successful_request + flowConfirmationCode: 1234-1234-1234-1234 + notificationChannel: EMAIL + resendCode: 1234-12345-234-123456 + links: + - rel: next + href: api/user/v2/recovery/password/recover + type: POST + - rel: resend + href: api/users/v2/recovery/password/resend + type: POST + '400': + description: Bad Request. Request cannot be processed by the server. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + examples: + response: + value: + code: UAR-10001 + message: bad_request + description: Bad request. + traceId: 23456fghj678vb78 + '404': + description: Resend code is not found. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + examples: + response: + value: + code: UAR-10001 + message: not_found + description: Recovery code not found. + traceId: 23456fghj678vb78 + '406': + description: The Resend code given in the request is not valid or expired. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + examples: + response: + value: + code: UAR-10003 + message: not acceptable + description: 'invalid error code: 1234-2345-12345-123456' + traceId: 23456fghj678vb78 + '500': + description: Server Error. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + examples: + response: + value: + code: UAR-15001 + message: Internal Error + description: Internal Error + traceId: 23456fghj678vb78 + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{organization-name}/api/users/v2/recovery/password/resend' \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "resendCode": "1234-2ws34-1234", + "properties": [ + { + "key": "key", + "value": "value" + } + ] + }' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ResendConfirmationRequest' + description: | + Request to resend the `confirmationCode`/`otp` to the user via a user preferred channel. + required: true + /recovery/password/confirm: + post: + tags: + - Password Recovery + summary: | + Confirm password recovery + operationId: confirmRecovery + description: | + - This API is used to validate the `confirmationCode`/`otp` given at password recovery. + - Use the returned `reset code` with the "password reset API" to reset the password. + - The API will return the `reset code` and the next API call. + responses: + '200': + description: | + - Password reset confirmed. + - Use the returned `resetCode` with the "password reset API" to reset the password. + content: + application/json: + schema: + $ref: '#/components/schemas/ResetCodeResponse' + examples: + response: + value: + resetCode: 2806aed9-fe7c-4b47-a91f-0aa897fac9a2 + links: + - rel: next + href: | + /t/{organization-name}/api/users/v2/recovery/password/reset + type: POST + '400': + description: Bad Request. Request cannot be processed by the server. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + examples: + response: + value: + code: PWR-10001 + message: bad_request + description: Bad request. + traceId: 23456fghj678vb78 + '404': + description: Confirmation code is not found. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + examples: + response: + value: + code: PWR-10001 + message: not_found + description: Recovery code not found. + traceId: 23456fghj678vb78 + '406': + description: | + The confirmation code given in the request is not valid or expired. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + examples: + response: + value: + code: PWR-10001 + message: not acceptable + description: 'invalid error code: 1234-2345-12345-123456' + traceId: 23456fghj678vb78 + '500': + description: Server Error. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + examples: + response: + value: + code: PWR-15001 + message: Internal Error + description: Internal Error + traceId: 23456fghj678vb78 + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{organization-name}/api/users/v2/recovery/password/confirm' \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "confirmationCode": "1234-2ws34-12345", + "otp": "wi8Ivm", + "properties": [ + { + "key": "key", + "value": "value" + } + ] + }' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ConfirmRequest' + description: | + - Request to confirm the password recovery. + - `confirmationCode` is `REQUIRED`. + - `otp` is required only for OTP based password recovery. The `flowConfirmationCode` returned from the password recovery request should be set as the `confirmationCode` for OTP-based recovery. + required: true + /recovery/password/reset: + post: + tags: + - Password Recovery + summary: | + Reset password + operationId: resetPassword + description: > + This API is used to reset the password of the user who matches the flowConfirmationCode given by the recover API and the resetCode given by the confirmation API. + responses: + '200': + description: Successful password reset. + content: + application/json: + schema: + $ref: '#/components/schemas/PasswordResetResponse' + examples: + response: + value: + code: PWR-02005 + message: Successful password reset + '400': + description: Bad Request. Request cannot be processed by the server. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + examples: + response: + value: + code: PWR-10001 + message: bad_request + description: Bad request. + traceId: 23456fghj678vb78 + '404': + description: Reset code is not found. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + examples: + response: + value: + code: PWR-10001 + message: not_found + description: Recovery code not found. + traceId: 23456fghj678vb78 + '406': + description: The reset code given in the request is not valid or expired. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + examples: + response: + value: + code: PWR-10001 + message: not acceptable + description: 'invalid error code: 1234-2345-12345-123456' + traceId: 23456fghj678vb78 + '412': + description: Password policy violation. + content: + application/json: + schema: + $ref: '#/components/schemas/RetryErrorResponse' + examples: + response: + value: + code: PWR-10001 + message: bad_request + description: Password policy violation. + traceId: 23456fghj678vb78 + resetCode: 1234-12345-sdf-34567567 + links: [ + { + "rel": "next", + "href": "/t/{organization-name}/api/users/v2/recovery/password/reset", + "type": "POST" + } + ] + '500': + description: Server Error. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + examples: + response: + value: + code: PWR-15001 + message: Internal Error + description: Internal Error + traceId: 23456fghj678vb78 + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{organization-name}/api/users/v2/recovery/password/reset' \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "resetCode": "string", + "flowConfirmationCode": "string", + "password": "string", + "properties": [ + { + "key": "key", + "value": "value" + } + ] + }' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ResetRequest' + description: | + - Request to reset the password. + - `resetCode`, `flowConfirmationCode` and `password` are required. + required: true +components: + schemas: + InitRequest: + type: object + description: Request to initiate an account recovery + properties: + claims: + type: array + description: The user claims to identify the user as `UserClaim` objects. + items: + $ref: '#/components/schemas/UserClaim' + properties: + type: array + description: (OPTIONAL) Additional META properties + items: + $ref: '#/components/schemas/Property' + required: + - claims + RecoveryRequest: + type: object + description: | + Request to start the password recovery for the user who matches with the recovery code via the given `channelId`. + properties: + recoveryCode: + type: string + description: Recovery code for the user. + example: 1234-5678-2455-3433 + channelId: + type: string + description: | + The identifier of the notification channel that the user prefers to get recovery notifications. + example: '1' + properties: + type: array + description: (OPTIONAL) Additional META properties. + items: + $ref: '#/components/schemas/Property' + required: + - recoveryCode + - channelId + ResendConfirmationRequest: + type: object + description: Request to resend the confirmation code in password recovery. + properties: + resendCode: + type: string + description: Resend code returned by the password recovery API. + example: 1234-2ws34-1234 + properties: + type: array + description: (OPTIONAL) Additional META properties. + items: + $ref: '#/components/schemas/Property' + ConfirmRequest: + type: object + description: Request to confirm password recovery. + required: + - confirmationCode + properties: + confirmationCode: + type: string + description: Confirmation code of the recovery flow. + example: 1234-2ws34-12345 + otp: + type: string + description: OTP sent to the user + example: wi8Ivm + properties: + type: array + description: (OPTIONAL) Additional META properties. + items: + $ref: '#/components/schemas/Property' + ResetRequest: + type: object + description: Object to reset the password of a user. + required: + - resetCode + - flowConfirmationCode + - password + properties: + resetCode: + type: string + description: resetCode given by the confirm API. + flowConfirmationCode: + type: string + description: Confirmation code of the recovery flow. + password: + type: string + description: New password given by the user. + properties: + type: array + description: (OPTIONAL) Additional META properties. + items: + $ref: '#/components/schemas/Property' + PasswordRecoveryInternalNotifyResponse: + type: object + properties: + code: + type: string + description: Success status code. + example: PWR-02002 + message: + type: string + description: Success status message. + example: successful_request + flowConfirmationCode: + type: string + description: Recovery flow confirmation code. + example: 1234-1234-1234-1234 + notificationChannel: + type: string + description: Channel that is used to send recovery information. + example: EMAIL + resendCode: + type: string + description: | + Code to resend the confirmation code to the user via the user-selected channel. + example: 1234-123456-12345-12345 + links: + type: array + description: Contains next available API calls. + items: + $ref: '#/components/schemas/APICall' + ResetCodeResponse: + properties: + resetCode: + type: string + description: Password reset code to reset the password. + example: 1234-55678-5668-2345 + links: + type: array + description: Contains next available API calls. + items: + $ref: '#/components/schemas/APICall' + PasswordResetResponse: + type: object + description: API response for a successful password reset. + properties: + code: + type: string + description: Operation code + example: PWR-02001 + message: + type: string + description: Message regarding the operation. + example: successful_request + ResendConfirmationCodeInternalResponse: + type: object + description: The object encapsulates the details regarding the resend confirmation code. + properties: + code: + type: string + description: Success status code. + example: PWR-02002 + message: + type: string + description: Success status message. + example: successful_request + flowConfirmationCode: + type: string + description: Recovery flow confirmation code. + example: 1234-1234-1234-1234 + notificationChannel: + type: string + description: Channel that is used to send recovery information. + example: EMAIL + resendCode: + type: string + description: The code to resend the confirmation code. + example: 1234-12345-234-123456 + links: + type: array + description: Contains next available API calls. + items: + $ref: '#/components/schemas/APICall' + RetryErrorResponse: + type: object + properties: + code: + type: string + description: Error code corresponding to the error. + example: PWR-10004 + message: + type: string + description: Error message + example: Retry + description: + type: string + description: Error description + example: Password policy violation + traceId: + type: string + description: Some correlation for error instance. + example: 2345dfgh678h789bhjk + resetCode: + type: string + description: Password reset code used in the request. + example: 1234-34567-3456-2345678 + links: + type: array + description: Contains next available API calls. + items: + $ref: '#/components/schemas/APICall' + ErrorResponse: + type: object + properties: + code: + type: string + description: Error code corresponding to the error. + example: UAR-10001 + message: + type: string + description: Error message + example: invalid_request + description: + type: string + description: Description of the error. + example: Invalid claim uri + traceId: + type: string + description: Some correlation for error instance. + example: 2345dfgh678h789bhjk + AccountRecoveryType: + type: object + description: Object that encapsulates details of the account recovery channel. + properties: + mode: + type: string + example: recoverWithNotifications + flowConfirmationCode: + type: string + example: 1234-1234-1234-1234 + channelInfo: + $ref: '#/components/schemas/RecoveryChannelInformation' + links: + type: array + description: Contains next available API calls. + items: + $ref: '#/components/schemas/APICall' + RecoveryChannelInformation: + description: Response with the recovery ID and the available recovery channels. + properties: + recoveryCode: + type: string + description: Code to recover the user account. + example: 1234-55678-5668-2345 + channels: + type: array + description: Lists the available recovery channels for the user. + items: + $ref: '#/components/schemas/RecoveryChannel' + RecoveryChannel: + type: object + description: Object with notification channel attributes. + properties: + id: + type: string + description: Identifier given to the channel. + example: '1' + type: + type: string + description: Type of the channel. + example: EMAIL + value: + type: string + description: Masked channel value. + example: wso2***********.com + preferred: + type: boolean + description: Specifies whether the channel is a user-preferred channel. + example: true + UserClaim: + type: object + description: Object that holds a user claim and the corresponding value. + properties: + uri: + type: string + description: Claim uri + example: 'http://wso2.org/claims/givenname' + value: + type: string + description: Value for the claim. + example: user1 + Property: + type: object + description: Object that holds a property as a key, value pair. + properties: + key: + type: string + description: Unique identifier as the key of the property. + example: key + value: + type: string + description: Value of the property. + example: value + APICall: + type: object + description: Object that holds the next API call details. + properties: + rel: + type: string + description: Next API call. + example: next + href: + type: string + description: Next API URL. + example: /api/users/recovery/v2/ + type: + type: string + description: HTTP method type. + example: POST + securitySchemes: + OAuth2: + type: oauth2 + flows: + clientCredentials: + tokenUrl: 'https://api.asgardeo.io/t/{org-name}/oauth2/token' + scopes: + internal_identity_mgt_view: Grants read access + internal_identity_mgt_create: Grants write access + internal_identity_mgt_delete: Grants permission to delete records + internal_identity_mgt_update: Grants permission to update existing records \ No newline at end of file diff --git a/docusaurus-asgardeo/static/apis/restapis/push-notification-devices.yaml b/docusaurus-asgardeo/static/apis/restapis/push-notification-devices.yaml new file mode 100644 index 0000000000..cb316105c4 --- /dev/null +++ b/docusaurus-asgardeo/static/apis/restapis/push-notification-devices.yaml @@ -0,0 +1,331 @@ +openapi: 3.0.0 +info: + version: "v1" + title: 'Push Notification Device Management API' + description: 'This is the RESTful API for managing devices used for the push notification feature by the users in Asgardeo.' +servers: + - url: 'https://api.asgardeo.io/t/{tenant-domain}/api/users/v1/me/push' +tags: + - name: me + description: Operations for the authenticated user. + - name: device + description: Operations initiated through user's push authenticator device. +paths: + /discovery-data: + get: + tags: + - me + description: | + This API is used to generate registration discovery data for the device registration QR code. + Scope(Permission) required: `internal_login` + summary: | + Generate data for device registration. + operationId: getRegistrationDiscoveryData + responses: + '200': + description: Successfully generated registration discovery data. + content: + application/json: + schema: + $ref: '#/components/schemas/DiscoveryDataDTO' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '500': + $ref: '#/components/responses/ServerError' + /devices: + post: + tags: + - device + description: | + This API is used to register a push notification device into the Identity Server. This API will be invoked from the device. + summary: Register devices to receive push notifications. + operationId: registerDevice + requestBody: + description: Request body sent by a device for registration. + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/RegistrationRequestDTO' + responses: + '201': + description: Registered a new device + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '500': + $ref: '#/components/responses/ServerError' + get: + tags: + - me + description: | + This API is used to list the devices registered for the particular user. + Scope(Permission) required: `internal_login` + summary: Get all devices registered for a user. + operationId: getDevices + responses: + '200': + description: Listed devices registered for a user + content: + application/json: + schema: + $ref: '#/components/schemas/DeviceDTOList' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '500': + $ref: '#/components/responses/ServerError' + /devices/{deviceId}: + get: + tags: + - me + description: | + This API is used to get a specific registered device. + Scope(Permission) required: `internal_login` + summary: Get device details by device ID. + operationId: getDeviceById + parameters: + - name: deviceId + in: path + description: ID of the device to be returned + required: true + schema: + type: string + responses: + '200': + description: Successfully returned the device belongs to the ID + content: + application/json: + schema: + $ref: '#/components/schemas/DeviceDTO' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '500': + $ref: '#/components/responses/ServerError' + delete: + tags: + - me + description: | + This API is used to remove a registered device. + Scope(Permission) required: `internal_login` + summary: Remove a registered device + operationId: deleteDeviceById + parameters: + - name: deviceId + in: path + description: ID of the device to be removed + required: true + schema: + type: string + responses: + '204': + description: The device was removed. + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '500': + $ref: '#/components/responses/ServerError' + /devices/{deviceId}/remove: + post: + tags: + - device + description: | + This API is used to remove a registered device through device. + summary: Remove a registered device from the device. + operationId: removeDeviceFromMobile + parameters: + - name: deviceId + in: path + description: ID of the device to be removed + required: true + schema: + type: string + requestBody: + description: Remove request sent from the device. + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/RemoveRequestDTO' + responses: + '204': + description: The device was removed. + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '500': + $ref: '#/components/responses/ServerError' +components: + schemas: + DiscoveryDataDTO: + type: object + description: Device registration information + properties: + deviceId: + description: Device ID + type: string + example: b03f90c9-6723-48f6-863b-a35f1ac77f57 + username: + description: Username + type: string + example: admin + host: + description: Host + type: string + example: https://api.asgardeo.io/ + tenantDomain: + description: Tenant domain + type: string + example: carbon.super + organizationId: + description: Organization ID + type: string + example: b03f90c9-6723-48f6-863b-a35f1ac77f57 + organizationName: + description: Organization name + type: string + example: sampleOrg + challenge: + description: Challenge + type: string + example: b03f90c9-6723-48f6-863b-a35f1ac77f57 + RegistrationRequestDTO: + type: object + description: The registration request body sent from the device + properties: + deviceId: + type: string + description: Unique UUID for the device + example: b03f90c9-6723-48f6-863b-a35f1ac77f57 + model: + type: string + description: Model of the device + example: iPhone 16 + name: + type: string + description: Name of the device + example: My Device + deviceToken: + type: string + description: device token unique to the device + example: 'fuRr8s_eQrmB88nu5Tz8oa:APA91bFMqYbuzDYyOGK28VoiLHWYXZYzGNVg3tfxfNwKPH-jDIFpNDdUHkmq5wqBUySYZnuHfpycyQvUrPhwV3UZ1YzjUNLvb9gzFZudfJd1N3fWuU0w2nq_hVJc0UPRabvNPuJy8wMB' + publicKey: + type: string + description: Public key of the keypair generated by the device for the account + example: 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOhCpj5pAEqdCdyxuHii0oLFAgnTePMI1EeomZHCRaZZNGv8fdcHyme9rpknNx/caAz9Gck5HrB/vto86cHpBkAghsBBLLWPUlblWNZCBX4pqFhZu+uZKvOnSqp1SwP13yx72nLKbjHRRJGgwCrg/mbdSGN/QKxRU+UhdKVVpQIDAQAB' + signature: + type: string + description: Signature string comprising of the pushId and the challenge + example: 'rT/VxgPYMioT6wHajYg0mJpBv46HvFBm/elZ/VL4ClUIFfX7i3Ou5ER5sEiFtehaurLXPNsA8hF4SQAueVBRymEAmchhwYlT160g3wv6kDQvWLkTqnLWGfn++wg5xRManOoN9zG9GhxCgRr9y+lk9rtvydfX0lTcdEZBkynSJnM=' + RegistrationResponseDTO: + type: object + description: The registration response sent after successful device registration. + properties: + deviceId: + type: string + description: Unique UUID for the device. + example: b03f90c9-6723-48f6-863b-a35f1ac77f57 + DeviceDTO: + type: object + description: Model for the registered device object + properties: + deviceId: + type: string + example: b03f90c9-6723-48f6-863b-a35f1ac77f57 + name: + type: string + example: My Phone + model: + type: string + example: iPhone 16 + provider: + type: string + example: fcm + DeviceDTOList: + type: array + items: + $ref: '#/components/schemas/DeviceDTO' + RemoveRequestDTO: + type: object + description: Remove device request body sent from the device + required: + - token + properties: + token: + type: string + description: JWT containing the remove device information signed with a unique private key + example: 'signedJWTToken' + Error: + type: object + required: + - code + - message + properties: + code: + type: string + example: UOM-00000 + description: An error code. + message: + type: string + example: Some Error Message + description: An error message. + description: + type: string + example: Some Error Description + description: An error description. + traceId: + type: string + example: e0fbcfeb-3617-43c4-8dd0-7b7d38e13047 + description: An error trace identifier. + #-------------------------------------------------------- + # Descriptions of error responses. + #-------------------------------------------------------- + responses: + BadRequest: + description: Invalid input in the request. + content: + 'application/json': + schema: + $ref: '#/components/schemas/Error' + NotFound: + description: Resource is not found. + content: + 'application/json': + schema: + $ref: '#/components/schemas/Error' + Unauthorized: + description: Authentication information is missing or invalid. + Forbidden: + description: Access forbidden. + ServerError: + description: Internal server error. + content: + 'application/json': + schema: + $ref: '#/components/schemas/Error' + NotImplemented: + description: Not Implemented. + content: + 'application/json': + schema: + $ref: '#/components/schemas/Error' diff --git a/docusaurus-asgardeo/static/apis/restapis/roles.yaml b/docusaurus-asgardeo/static/apis/restapis/roles.yaml new file mode 100644 index 0000000000..444f2fa076 --- /dev/null +++ b/docusaurus-asgardeo/static/apis/restapis/roles.yaml @@ -0,0 +1,1166 @@ +openapi: 3.0.0 +info: + title: Asgardeo - SCIM 2.0 Roles V2 API + version: v2 + description: | + This is the RESTful API for SCIM 2.0 Roles API in Asgardeo. + This API allows creating, deleting, listing, roles and updating role name, permissions, users and groups of the roles. + + To access the SCIM 2.0 Roles APIs in Asgardeo, you need to first [get an access token](https://wso2.com/asgardeo/docs/apis/authentication/#get-an-access-token) from your organization. +servers: + - url: https://api.asgardeo.io/t/{organization-name}/scim2/v2 +security: + - OAuth2: [] + +paths: + /Roles: + get: + tags: + - Roles Endpoint + summary: Filter Roles + description: > + This API returns roles according to the specified filter, sort and + pagination parameters. + + + Scope(Permission) required: `internal_role_mgt_view` + operationId: getRoleV2 + parameters: + - name: filter + in: query + description: Filter expression for filtering + required: false + schema: + type: string + - name: startIndex + in: query + description: The 1-based index of the first query result + required: false + schema: + type: integer + format: int32 + - name: count + in: query + description: Specifies the desired maximum number of query results per page. + required: false + schema: + type: integer + format: int32 + - name: sortBy + in: query + description: |- + Specifies the attribute whose value + SHALL be used to order the returned responses + required: false + schema: + type: string + - name: sortOder + in: query + description: The order in which the "sortBy" parameter is applied. + required: false + schema: + type: string + responses: + '200': + description: Valid roles are found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/RolesListResponseObjectV2' + '401': + description: Unauthorized + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUnauthorized' + '403': + description: Forbidden + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorForbidden' + '404': + description: No Role found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorNoRoleAvailable' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/scim2/v2/Roles' \ + -H 'accept: application/scim+json' \ + -H 'Authorization: Bearer {bearer_token}' + post: + tags: + - Roles Endpoint + summary: Create Role + description: > + This API creates a role and returns the details of the created role + including its unique ID. + + + Scope(Permission) required: + - `internal_role_mgt_create` + + ➕ Additional Scopes + + To assign permissions, users, or groups to the role you create, you also need the following additional scopes: + + | Action | Scope | + |---------|--------| + | Assign permissions | `internal_role_mgt_permissions_update` | + | Assign users | `internal_role_mgt_users_update` | + | Assign groups | `internal_role_mgt_groups_update` | + operationId: createRoleV2 + requestBody: + content: + application/scim+json: + schema: + $ref: '#/components/schemas/RoleCreationObjectV2' + responses: + '201': + description: Valid role is created + content: + application/scim+json: + schema: + $ref: '#/components/schemas/RolePostResponseObjectV2' + '401': + description: Unauthorized + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUnauthorized' + '403': + description: Forbidden + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorForbidden' + '404': + description: Role is not found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorRoleNotAvailable' + '409': + description: Role already exist + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorRoleAlreadyAvailable' + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{organization-name}/scim2/v2/Roles' \ + -H 'accept: application/scim+json' \ + -H 'Content-Type: application/scim+json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "schemas": [ + "urn:ietf:params:scim:schemas:extension:2.0:Role" + ], + "displayName": "loginRole", + "audience": { + "value": "3645709f-ea8d-5595-7690-e1fa0efe3df9", + "type": "application" + }, + "users": [ + { + "value": "008bba85-451d-414b-87de-c03b5a1f4217" + } + ], + "groups": [ + { + "value": "7bac6a86-1f21-4937-9fb1-5be4a93ef469" + } + ], + "permissions": [ + { + "value": "internal_login", + "display": "Internal Login" + } + ] + }' + x-codegen-request-body-name: body + /Roles/.search: + post: + tags: + - Roles Endpoint + summary: Search Roles + description: > + This API returns roles according to the specified filter, sort and + pagination parameters. + + + Scope(Permission) required: `internal_role_mgt_view` + operationId: getRolesByPostV2 + requestBody: + content: + application/scim+json: + schema: + $ref: '#/components/schemas/RoleSearchRequestObjectV2' + responses: + '200': + description: Valid roles are found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/RoleSearchResponseObjectV2' + '401': + description: Unauthorized + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUnauthorized' + '403': + description: Forbidden + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorForbidden' + '404': + description: Valid roles are not found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/RoleSearchErrorResponseObject' + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{organization-name}/scim2/v2/Roles/.search' \ + -H 'accept: application/scim+json' \ + -H 'Content-Type: application/scim+json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "schemas": [ + "urn:ietf:params:scim:api:messages:2.0:SearchRequest" + ], + "startIndex": 1, + "filter": "displayName eq loginRole" + }' + x-codegen-request-body-name: body + /Roles/{id}: + get: + tags: + - Roles Endpoint + summary: Get Role by ID + description: > + This API returns the role details of a particular role using its unique + ID. + + + Scope(Permission) required: `internal_role_mgt_view` + operationId: getRolebyIdV2 + parameters: + - name: id + in: path + description: Unique ID of the resource type. + required: true + schema: + type: string + - name: attributes + in: query + description: SCIM defined attributes parameter. + required: false + schema: + type: string + - name: excludedAttributes + in: query + description: SCIM defined excludedAttribute parameter. + required: false + schema: + type: string + responses: + '200': + description: Valid role is found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/RoleGetResponseObjectV2' + '401': + description: Unauthorized + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUnauthorized' + '403': + description: Forbidden + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorForbidden' + '404': + description: Valid role is not found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorNoRoleAvailable' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/scim2/v2/Roles/{role-id}' \ + -H 'accept: application/scim+json' \ + -H 'Authorization: Bearer {bearer_token}' + put: + tags: + - Roles Endpoint + summary: Update Role - PUT + description: | + This API updates the role details and returns the updated role details + using a PUT operation. + + Scope(Permission) required: + - `internal_role_mgt_update` + + ➕ Additional Scopes + + To update permissions, users, or groups assignments of the role, you also need the following additional scopes: + + | Action | Scope | + |---------|--------| + | Update permissions | `internal_role_mgt_permissions_update` | + | Update users | `internal_role_mgt_users_update` | + | Update groups | `internal_role_mgt_groups_update` | + operationId: updateRoleV2 + parameters: + - name: id + in: path + description: Unique ID of the resource type. + required: true + schema: + type: string + requestBody: + content: + application/scim+json: + schema: + $ref: '#/components/schemas/RolePutRequestObjectV2' + responses: + '200': + description: Role is updated + content: + application/scim+json: + schema: + $ref: '#/components/schemas/RolePutResponseObjectV2' + '400': + description: Invalid Input + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorInvalidInput' + '401': + description: Unauthorized + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUnauthorized' + '403': + description: Forbidden + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorForbidden' + '404': + description: Valid role is not found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorNoRoleAvailable' + '406': + description: Not Acceptable + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorNotAcceptable' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PUT' \ + 'https://api.asgardeo.io/t/{organization-name}/scim2/v2/Roles/{role-id}' \ + -H 'accept: application/scim+json' \ + -H 'Content-Type: application/scim+json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "displayName": "loginRole", + "users": [ + { + "value": "409ca90b-2ba6-4474-9a45-2cf7376e6e43" + } + ], + "groups": [ + { + "value": "7bac6a86-1f21-4937-9fb1-5be4a93ef469" + } + ], + "permissions": [ + { + "value": "internal_login", + "display": "Internal Login" + } + ] + }' + x-codegen-request-body-name: body + delete: + tags: + - Roles Endpoint + summary: Delete Role + description: | + This API deletes a particular role using its unique ID. + + Scope(Permission) required: `internal_role_mgt_delete` + operationId: deleteRoleV2 + parameters: + - name: id + in: path + description: Unique ID of the resource type. + required: true + schema: + type: string + responses: + '204': + description: Role is deleted + '401': + description: Unauthorized + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUnauthorized' + '403': + description: Forbidden + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorForbidden' + '404': + description: Valid role is not found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorNoRoleAvailable' + x-codeSamples: + - lang: Curl + source: | + curl -X 'DELETE' \ + 'https://api.asgardeo.io/t/{organization-name}/scim2/v2/Roles/{role-id}' \ + -H 'accept: application/scim+json' \ + -H 'Authorization: Bearer {bearer_token}' + patch: + tags: + - Roles Endpoint + summary: Update Role - PATCH + description: | + This API updates the role details and returns the updated role details + using a PATCH operation. + + Scope(Permission) required: + + - `internal_role_mgt_update` + + ➕ Additional Scopes + + To update permissions, users, or groups assignments of the role, you also need the following additional scopes: + + | Action | Scope | + |---------|--------| + | Update permissions | `internal_role_mgt_permissions_update` | + | Update users | `internal_role_mgt_users_update` | + | Update groups | `internal_role_mgt_groups_update` | + operationId: patchRole + parameters: + - name: id + in: path + description: Unique id of the resource type. + required: true + schema: + type: string + requestBody: + content: + application/scim+json: + schema: + $ref: '#/components/schemas/PatchRoleOperationRequestObjectV2' + responses: + '200': + description: Role is updated + content: + application/scim+json: + schema: + $ref: '#/components/schemas/PatchRoleOperationResponseObjectV2' + '401': + description: Unauthorized + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUnauthorized' + '403': + description: Forbidden + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorForbidden' + '404': + description: Valid role is not found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorNoRoleAvailable' + '406': + description: Not Acceptable + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorNotAcceptable' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PATCH' \ + 'https://api.asgardeo.io/t/{organization-name}/scim2/v2/Roles/{role-id}' \ + -H 'accept: application/scim+json' \ + -H 'Content-Type: application/scim+json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "schemas": [ + "urn:ietf:params:scim:api:messages:2.0:PatchOp" + ], + "Operations": [ + { + "op": "add", + "path": "groups", + "value": [ + { + "value": "7bac6a86-1f21-4937-9fb1-5be4a93ef469" + } + ] + }, + { + "op": "add", + "path": "users", + "value": [ + { + "value": "9cac6a86-1f21-4937-9fb1-5be4a93ef349" + } + ] + }, + { + "op": "remove", + "path": "users[value eq 0565f472-28fe-4d93-83ad-096c66ed4a47]" + }, + { + "op": "remove", + "path": "groups[value eq 9065f445-265e-4rfg3-83ad-666c66ed4a55]" + }, + { + "op": "replace", + "value": { + "permissions": [ + { + "value": "internal_group_mgt_view" + } + ] + } + } + ] + }' + x-codegen-request-body-name: body +components: + securitySchemes: + OAuth2: + type: oauth2 + flows: + authorizationCode: + authorizationUrl: https://api.asgardeo.io/t/{organization-name}/oauth2/authorize + tokenUrl: https://api.asgardeo.io/t/{organization-name}/oauth2/token + scopes: + view: internal_role_mgt_view + create: internal_role_mgt_create + update: internal_role_mgt_update + delete: internal_role_mgt_delete + schemas: + RolesListResponseObjectV2: + type: object + properties: + totalResults: + type: integer + example: 3 + startIndex: + type: integer + example: 1 + itemsPerPage: + type: integer + example: 3 + schemas: + type: array + items: + type: string + example: urn:ietf:params:scim:api:messages:2.0:ListResponse + Resources: + type: array + items: + $ref: '#/components/schemas/RoleObV2' + RoleSearchRequestObjectV2: + type: object + properties: + schemas: + type: object + example: + - urn:ietf:params:scim:api:messages:2.0:SearchRequest + startIndex: + type: integer + example: 1 + count: + type: integer + example: 10 + filter: + type: string + example: displayName eq loginRole + RoleSearchResponseObjectV2: + type: object + properties: + totalResults: + type: integer + example: 1 + startIndex: + type: integer + example: 1 + itemsPerPage: + type: integer + example: 3 + schemas: + type: array + items: + type: string + example: urn:ietf:params:scim:api:messages:2.0:ListResponse + Resources: + type: array + items: + $ref: '#/components/schemas/RoleObV2' + RoleObV2: + type: object + properties: + displayName: + type: string + example: loginRole + meta: + type: object + properties: + location: + type: string + example: >- + https://api.asgardeo.io/t/{org-name}/scim2/v2/Roles/4645709c-ea8c-4495-8590-e1fa0efe3de0 + id: + type: string + example: 4645709c-ea8c-4495-8590-e1fa0efe3de0 + audience: + type: object + properties: + value: + type: string + example: 3645709f-ea8d-5595-7690-e1fa0efe3df9 + display: + type: string + example: My App + type: + type: string + example: application + properties: + type: array + items: + type: object + properties: + name: + type: string + example: isSharedRole + value: + type: string + example: 'false' + RoleCreationObjectV2: + type: object + required: + - displayName + - schemas + properties: + schemas: + type: array + items: + type: string + example: urn:ietf:params:scim:schemas:extension:2.0:Role + displayName: + type: string + example: loginRole + audience: + type: object + properties: + value: + type: string + example: 3645709f-ea8d-5595-7690-e1fa0efe3df9 + type: + type: string + enum: + - application + - organization + example: application + users: + type: array + items: + type: object + example: + value: 008bba85-451d-414b-87de-c03b5a1f4217 + groups: + type: array + items: + type: object + example: + value: 7bac6a86-1f21-4937-9fb1-5be4a93ef469 + permissions: + type: array + items: + type: object + properties: + value: + type: string + example: internal_login + display: + type: string + example: Internal Login + RoleGetResponseObjectV2: + type: object + properties: + displayName: + type: string + example: loginRole + meta: + type: object + properties: + location: + type: string + example: >- + https://api.asgardeo.io/t/{org-name}/scim2/v2/Roles/4645709c-ea8c-4495-8590-e1fa0efe3de0 + resourceType: + type: string + example: Role + schemas: + type: array + items: + type: string + example: urn:ietf:params:scim:schemas:extension:2.0:Role + id: + type: string + example: 4645709c-ea8c-4495-8590-e1fa0efe3de0 + audience: + type: object + properties: + value: + type: string + example: 3645709f-ea8d-5595-7690-e1fa0efe3df9 + display: + type: string + example: My App + type: + type: string + enum: + - application + - organization + example: application + users: + type: array + items: + type: object + properties: + $ref: + type: string + example: >- + https://api.asgardeo.io/t/{org-name}/scim2/Users/3a12bae9-4386-44be-befd-caf349297f45 + display: + type: string + example: kim + value: + type: string + example: 008bba85-451d-414b-87de-c03b5a1f4217 + groups: + type: array + items: + type: object + properties: + $ref: + type: string + example: >- + https://api.asgardeo.io/t/{org-name}/scim2/Groups/7bac6a86-1f21-4937-9fb1-5be4a93ef469 + display: + type: string + example: PRIMARY/manager + value: + type: string + example: 7bac6a86-1f21-4937-9fb1-5be4a93ef469 + permissions: + type: array + items: + type: object + properties: + value: + type: string + example: internal_login + display: + type: string + example: Internal Login + associatedApplications: + type: array + items: + type: object + properties: + value: + type: string + display: + type: string + example: + - value: 3645709f-ea8d-5595-7690-e1fa0efe3df9 + display: My App + properties: + type: array + items: + type: object + properties: + name: + type: string + example: isSharedRole + value: + type: string + example: 'false' + RolePostResponseObjectV2: + type: object + properties: + displayName: + type: string + example: loginRole + meta: + type: object + properties: + location: + type: string + example: >- + https://api.asgardeo.io/t/{org-name}/scim2/v2/Roles/4645709c-ea8c-4495-8590-e1fa0efe3de0 + resourceType: + type: string + example: Role + schemas: + type: array + items: + type: string + example: urn:ietf:params:scim:schemas:extension:2.0:Role + id: + type: string + example: 4645709c-ea8c-4495-8590-e1fa0efe3de0 + audience: + type: object + properties: + value: + type: string + example: 3645709f-ea8d-5595-7690-e1fa0efe3df9 + display: + type: string + example: My App + type: + type: string + enum: + - application + - organization + example: application + RolePutRequestObjectV2: + type: object + properties: + displayName: + type: string + example: loginRole + users: + type: array + items: + type: object + example: + value: 409ca90b-2ba6-4474-9a45-2cf7376e6e43 + groups: + type: array + items: + type: object + example: + value: 7bac6a86-1f21-4937-9fb1-5be4a93ef469 + permissions: + type: array + items: + type: object + properties: + value: + type: string + example: internal_login + display: + type: string + example: Internal Login + RolePutResponseObjectV2: + type: object + properties: + displayName: + type: string + example: loginRole + meta: + type: object + properties: + location: + type: string + example: >- + https://api.asgardeo.io/t/{org-name}/scim2/v2/Roles/4645709c-ea8c-4495-8590-e1fa0efe3de0 + resourceType: + type: string + example: Role + schemas: + type: array + items: + type: string + example: urn:ietf:params:scim:schemas:extension:2.0:Role + id: + type: string + example: 4645709c-ea8c-4495-8590-e1fa0efe3de0 + audience: + type: object + properties: + value: + type: string + example: 3645709f-ea8d-5595-7690-e1fa0efe3df9 + display: + type: string + example: My App + type: + type: string + enum: + - application + - organization + example: application + PatchRoleOperationRequestObjectV2: + type: object + properties: + schemas: + type: array + items: + type: string + example: urn:ietf:params:scim:api:messages:2.0:PatchOp + Operations: + type: array + example: + - op: add + path: groups + value: + - value: 7bac6a86-1f21-4937-9fb1-5be4a93ef469 + - op: add + path: users + value: + - value: 9cac6a86-1f21-4937-9fb1-5be4a93ef349 + - op: remove + path: "users[value eq 0565f472-28fe-4d93-83ad-096c66ed4a47]" + - op: remove + path: "groups[value eq 9065f445-265e-4rfg3-83ad-666c66ed4a55]" + items: + $ref: '#/components/schemas/RolePatchOperationobjV2' + RolePatchOperationobjV2: + type: object + properties: + op: + type: string + enum: + - add + - remove + - replace + path: + type: string + value: + type: array + items: + type: object + properties: + value: + type: string + example: + - op: add + path: groups + value: + - value: 7bac6a86-1f21-4937-9fb1-5be4a93ef469 + - op: add + path: users + value: + - value: 9cac6a86-1f21-4937-9fb1-5be4a93ef349 + - op: remove + path: users[value eq 0565f472-28fe-4d93-83ad-096c66ed4a47] + PatchRoleOperationResponseObjectV2: + type: object + properties: + displayName: + type: string + example: loginRole + meta: + type: object + properties: + location: + type: string + example: >- + https://api.asgardeo.io/t/{org-name}/scim2/v2/Roles/4645709c-ea8c-4495-8590-e1fa0efe3de0 + resourceType: + type: string + example: Role + schemas: + type: object + example: + - urn:ietf:params:scim:schemas:extension:2.0:Role + id: + type: string + example: 4645709c-ea8c-4495-8590-e1fa0efe3de0 + audience: + type: object + properties: + value: + type: string + example: 3645709f-ea8d-5595-7690-e1fa0efe3df9 + display: + type: string + example: My App + type: + type: string + enum: + - application + - organization + example: application + ErrorInvalidInput: + type: object + required: + - status + - schema + - detail + properties: + status: + type: string + example: '400' + schemas: + type: string + example: urn:ietf:params:scim:api:messages:2.0:Error + scimType: + type: string + example: invalidSyntax + detail: + type: string + example: Request is unparsable, syntactically incorrect, or violates schema. + ErrorUnauthorized: + type: object + required: + - status + - schema + properties: + status: + type: string + example: '401' + schemas: + type: string + example: urn:ietf:params:scim:api:messages:2.0:Error + scimType: + type: string + example: Unauthorized + ErrorNotAcceptable: + type: object + required: + - status + - schema + properties: + status: + type: string + example: '406' + schemas: + type: string + example: urn:ietf:params:scim:api:messages:2.0:Error + scimType: + type: string + example: Not Acceptable + ErrorForbidden: + type: object + required: + - status + - schema + properties: + status: + type: string + example: '403' + schemas: + type: string + example: urn:ietf:params:scim:api:messages:2.0:Error + scimType: + type: string + example: Forbidden + ErrorNoRoleAvailable: + type: object + required: + - status + - schema + - detail + properties: + status: + type: string + example: '404' + schemas: + type: array + items: + type: string + example: urn:ietf:params:scim:api:messages:2.0:Error + detail: + type: string + example: Role not found in the system. + ErrorRoleNotAvailable: + type: object + required: + - status + - schema + - detail + properties: + status: + type: string + example: '404' + schemas: + type: string + example: urn:ietf:params:scim:api:messages:2.0:Error + detail: + type: string + example: >- + No Role with the id : 4645709c-ea8c-4495-8590-e1fa0efe3de0 in the + system. + ErrorRoleAlreadyAvailable: + type: object + required: + - status + - schema + - detail + properties: + status: + type: string + example: '409' + schemas: + type: string + example: urn:ietf:params:scim:api:messages:2.0:Error + detail: + type: string + example: 'Role with name: Internal/loginRole already exists in the system.' + RoleSearchErrorResponseObject: + type: object + required: + - totalResults + - startIndex + - itemsPerPage + - schemas + properties: + totalResults: + type: integer + example: 0 + startIndex: + type: integer + example: 1 + itemsPerPage: + type: integer + example: 0 + schemas: + type: array + items: + example: urn:ietf:params:scim:api:messages:2.0:ListResponse diff --git a/docusaurus-asgardeo/static/apis/restapis/rule-metadata.yaml b/docusaurus-asgardeo/static/apis/restapis/rule-metadata.yaml new file mode 100644 index 0000000000..857b83853f --- /dev/null +++ b/docusaurus-asgardeo/static/apis/restapis/rule-metadata.yaml @@ -0,0 +1,401 @@ +openapi: 3.0.1 +info: + title: Asgardeo Rule Metadata REST API + description: "The Rule Metadata API provides the essential metadata required to configure rules dynamically based on the flow context. \nThe metadata retrieved by this API is designed to support rule configuration in the user interface (UI) by delivering information about each configurable field, the set of applicable comparison operators (e.g., equals, contains) for each field, and lists of possible values or options for fields.\n" + contact: + name: WSO2 + url: https://wso2.com/identity-and-access-management/ + license: + name: Apache 2.0 + url: https://www.apache.org/licenses/LICENSE-2.0.html + version: v1 +servers: + - url: 'https://api.asgardeo.io/t/{organization-name}/api/server/v1' +security: +- OAuth2: [] +paths: + /rules/metadata: + get: + tags: + - Metadata + summary: Get metadata for rule configuration. + description: |+ + This API provides a list of fields, associated metadata, and applicable operators for each field based on the specified flow type. This information is used to populate the UI for rule configuration. + + Scope (Permission) required: ``internal_rule_metadata_view`` + + operationId: getExpressionMeta + parameters: + - name: flow + in: query + description: | + Specifies the flow to retrieve rule metadata. This ensures that the metadata returned is relevant to the given flow. + + Note: At present, only the 'preIssueAccessToken','preUpdatePassword' and 'preUpdateProfile' flows are supported. + required: true + style: form + explode: true + schema: + type: string + enum: + - preIssueAccessToken + - preUpdatePassword + - preUpdateProfile + - preLogin + - postLogin + - inLogin + - preRegistration + - inRegistration + - inPasswordExpiry + responses: + "200": + description: Applicable fields and operators + content: + application/json: + schema: + $ref: '#/components/schemas/ExpressionMeta' + examples: + preIssueAccessToken: + summary: Sample response for pre-issue access token flow + value: + - field: + name: application + displayName: application + operators: + - name: equals + displayName: equals + - name: notEquals + displayName: not equals + value: + inputType: options + valueType: reference + valueReferenceAttribute: id + valueDisplayAttribute: name + links: + - href: /applications?offset=0&limit=10 + method: GET + rel: values + - href: /applications?filter=name+eq+*&limit=10 + method: GET + rel: filter + - field: + name: grantType + displayName: grant type + operators: + - name: equals + displayName: equals + - name: notEquals + displayName: not equals + value: + inputType: options + valueType: string + values: + - name: authorization_code + displayName: authorization code + - name: password + displayName: password + - name: refresh_token + displayName: refresh token + - name: client_credentials + displayName: client credentials + - name: urn:ietf:params:oauth:grant-type:token-exchange + displayName: token exchange + preUpdatePassword: + summary: Sample response for pre-update password flow + value: + - field: + name: flow + displayName: flow + operators: + - name: equals + displayName: equals + - name: notEquals + displayName: not equals + value: + inputType: options + valueType: string + values: + - name: adminInitiatedPasswordReset + displayName: Admin initiated password reset + - name: adminInitiatedPasswordUpdate + displayName: Admin initiated password update + - name: adminInitiatedUserInviteToSetPassword + displayName: Admin initiated user invite to set password + - name: applicationInitiatedPasswordUpdate + displayName: Application initiated password update + - name: userInitiatedPasswordReset + displayName: User initiated password reset + - name: userInitiatedPasswordUpdate + displayName: User initiated password update + - name: adminInitiatedRegistration + displayName: Admin initiated registration + - name: applicationInitiatedRegistration + displayName: Application initiated registration + - name: userInitiatedRegistration + displayName: User initiated registration + preUpdateProfile: + summary: Sample response for pre-update profile flow + value: + - field: + name: flow + displayName: flow + operators: + - name: equals + displayName: equals + - name: notEquals + displayName: not equals + value: + inputType: options + valueType: string + values: + - name: adminInitiatedProfileUpdate + displayName: Admin initiated profile update + - name: applicationInitiatedProfileUpdate + displayName: Application initiated profile update + - name: userInitiatedProfileUpdate + displayName: User initiated profile update + - field: + name: claim + displayName: claim + operators: + - name: equals + displayName: equals + - name: notEquals + displayName: not equals + value: + inputType: options + valueType: reference + valueReferenceAttribute: claimURI + valueDisplayAttribute: displayName + links: + - href: /claim-dialects/local/claims?exclude-hidden-claims=true + method: GET + rel: values + inLogin: + summary: Sample response for login flow + value: + - field: + name: role + displayName: user.role + operators: + - name: equals + displayName: equals + - name: notEquals + displayName: not equals + value: + inputType: options + valueType: reference + valueReferenceAttribute: id + valueDisplayAttribute: name + links: + - href: /scim2/Roles?offset=0&limit=10 + method: GET + rel: values + - href: /scim2/Roles?filter=name+eq+*&limit=10 + method: GET + rel: filter + - field: + name: group + displayName: user.group + operators: + - name: equals + displayName: equals + - name: notEquals + displayName: not equals + value: + inputType: options + valueType: reference + valueReferenceAttribute: id + valueDisplayAttribute: name + links: + - href: /scim2/Groups?offset=0&limit=10 + method: GET + rel: values + - href: /scim2/Groups?filter=name+eq+*&limit=10 + method: GET + rel: filter + - field: + name: email + displayName: user.email + operators: + - name: equals + displayName: equals + - name: notEquals + displayName: not equals + - name: startsWith + displayName: starts with + - name: endsWith + displayName: ends with + - name: contains + displayName: contains + value: + inputType: input + valueType: string + "400": + description: Bad Request + "401": + description: Unauthorized + "500": + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/rules/metadata?flow=preIssueAccessToken' \ + --header 'Authorization: Bearer {bearer_token}' +components: + schemas: + ExpressionMeta: + type: array + description: Represents the metadata for rule expressions. It includes field definitions and associated operators. + items: + $ref: '#/components/schemas/FieldDefinition' + FieldDefinition: + type: object + properties: + field: + $ref: '#/components/schemas/Field' + operators: + type: array + description: | + Specifies the list of valid operators that can be applied to this field in rule expressions. Each operator defines a comparison or matching condition (e.g., \"equals\", \"contains\", \"greaterThan\") that determines how the field's value will be evaluated within a rule. + items: + $ref: '#/components/schemas/Operator' + value: + $ref: '#/components/schemas/Value' + Field: + type: object + properties: + name: + type: string + description: Name of the field. This is an immutable attribute and uniquely identifies the field allowed in the rule. + example: role + displayName: + type: string + description: Display name of the field. Use as a user friendly label of the field to show in UI. + example: user.role + dependantFields: + type: array + description: Lists the names of fields on which this field depends for its display or selection in the next expression. + example: [] + items: + type: string + Value: + type: object + properties: + inputType: + type: string + description: | + Defines how the field should be presented and populated in the rule configuration UI. This property indicates whether the field allows direct user input or if the values are selected from predefined options. Possible types include: + + - "input": Allows for direct user entry, such as text or numeric input. + - "options": Provides a list of selectable values, often fetched from an external data source, enabling users to pick from predefined choices. + enum: + - input + - options + valueType: + type: string + description: | + Specifies the expected data type for the field’s value within a rule expression. This property defines how the field's value should be interpreted when used in rule conditions. Possible types include: + - "string": Text value. + - "number": Numerical value. + - "boolean": True or false. + - "date": Date value. + - "reference": A reference to an external identifier, often used with options-type fields to indicate that the value is an ID or a unique attribute from related data." + enum: + - string + - number + - boolean + - date + - reference + valueReferenceAttribute: + type: string + description: "The key attribute in the options data (e.g., 'id') used to represent the option's selected value in rule expressions. Only available when 'valueType' is 'reference'." + example: id + valueDisplayAttribute: + type: string + description: "The attribute to show as the label for each option in the dropdown (e.g., 'name') when listing options. Only available when 'valueType' is 'reference'." + example: name + links: + type: array + description: Endpoints to retrieve or search for options dynamically. Included only when 'valueType' is 'reference'. + example: + - href: /scim2/roles?offset=0&limit=10 + method: GET + rel: values + - href: /scim2/roles/.search + method: GET + rel: filter + items: + $ref: '#/components/schemas/Link' + values: + type: array + description: "List of selectable values for options fields when 'valueType' is 'string', 'number', 'boolean', or 'date'." + items: + $ref: '#/components/schemas/ValueObject' + Operator: + type: object + properties: + name: + type: string + description: Name of the operator. The immutable identifier of the operator referenced within the rule expression. + displayName: + type: string + description: Display name of the operator. Use as a user friendly label of the operator to show in UI. + ValueObject: + type: object + properties: + name: + type: string + description: The name that uniquely identifies the option. + displayName: + type: string + description: The display name for the option. + Link: + type: object + properties: + href: + type: string + description: Url of the endpoint. + method: + type: string + description: Http method. + enum: + - GET + rel: + type: string + description: Indicates the endpoint’s relation to retrieving or filtering field values. + enum: + - values + - filter + Error: + type: object + properties: + code: + type: string + description: Error code + example: RMS-00000 + message: + type: string + description: Error message. + example: Some error message. + description: + type: string + description: Detailed error description. + example: Some error description. + traceId: + type: string + description: Trace identifier to refer at troubleshooting logs to troubleshoot the problem. + example: e0fbcfeb-3617-43c4-8dd0-7b7d38e13047 + securitySchemes: + OAuth2: + type: oauth2 + flows: + authorizationCode: + authorizationUrl: 'https://api.asgardeo.io/t/{org-name}/oauth2/authorize' + tokenUrl: 'https://api.asgardeo.io/t/{org-name}/oauth2/token' + scopes: + read: internal_rule_metadata_view diff --git a/docusaurus-asgardeo/static/apis/restapis/scim2-agents.yaml b/docusaurus-asgardeo/static/apis/restapis/scim2-agents.yaml new file mode 100644 index 0000000000..edb5c29627 --- /dev/null +++ b/docusaurus-asgardeo/static/apis/restapis/scim2-agents.yaml @@ -0,0 +1,894 @@ +openapi: 3.1.0 +info: + title: AI Agent Management API + description: | + This document specifies the REST API for **AI Agent Management** in **Asgardeo**. + The Agent Management API allows to create, retrieve, update, and delete AI agent identities, allowing agents to be managed in the same way as human users while remaining clearly distinguishable from them. + version: 1.0.0 +servers: + - url: https://api.asgardeo.io/t/{organization-name}/scim2 +security: + - OAuth2: [] + - BasicAuth: [] +paths: + /Agents: + get: + tags: + - Agents Endpoint + summary: Retrieve a list of agents + description: | + This API returns agents according to the specified pagination and attribute parameters.
      + Scope(Permission) required: `internal_agent_mgt_list` + operationId: getAgents + parameters: + - name: startIndex + in: query + description: The 1-based index of the first query result. + schema: + type: integer + format: int32 + minimum: 1 + default: 1 + - name: count + in: query + description: Specifies the desired maximum number of query results per page. + schema: + type: integer + format: int32 + minimum: 0 + default: 100 + - name: attributes + in: query + description: A multi-valued list of strings indicating the names of resource attributes to include in the response. + schema: + type: array + items: + type: string + - name: excludedAttributes + in: query + description: A multi-valued list of strings indicating the names of resource attributes to exclude in the response. + schema: + type: array + items: + type: string + responses: + 200: + description: Successful response with a list of AI agents. + content: + application/scim+json: + schema: + $ref: '#/components/schemas/AgentListResponseObject' + 400: + description: Bad Request + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorInvalidInput' + 401: + description: Unauthorized + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUnauthorized' + 403: + description: Forbidden + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorForbidden' + 500: + description: Internal Server Error + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorInternalServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X GET \ + 'https://api.asgardeo.io/t/{organization-name}/scim2/Agents' \ + -H 'Accept: application/scim+json' \ + -H 'Authorization: Bearer {access_token}' + + post: + tags: + - Agents Endpoint + summary: Create a new AI agent + description: | + This API creates an AI agent and returns the agent details along with the agent's unique ID and initial password. + Scope(Permission) required: `internal_agent_mgt_create` + operationId: createAgent + requestBody: + description: Agent object that needs to be created. + required: true + content: + application/scim+json: + schema: + $ref: '#/components/schemas/AgentCreateObject' + example: + urn:scim:wso2:agent:schema: + Description: "Intelligent Vet Assistant" + DisplayName: "Vetassist AI" + Owner: "7a6f7b26-f9ea-48ea-9012-87d6b54f4055@{organization-name}" + responses: + 201: + description: Agent created successfully. + content: + application/scim+json: + schema: + $ref: '#/components/schemas/AgentResponseObject' + example: + password: "K#B79pB%dq*v7sE!" + meta: + created: "2025-12-17T06:17:51.835814Z" + location: "https://api.asgardeo.io/t/{organization-name}/scim2/Agents/688d98c0-1c8d-49c2-9316-559a76cd9240" + lastModified: "2025-12-17T06:17:52.150201Z" + resourceType: "Agent" + schemas: + - "urn:ietf:params:scim:schemas:core:2.0:User" + - "urn:ietf:params:scim:schemas:extension:enterprise:2.0:User" + - "urn:scim:wso2:schema" + - "urn:scim:schemas:extension:custom:User" + - "urn:scim:wso2:agent:schema" + roles: + - audienceValue: "10084a8d-113f-4211-a0d5-efe36b082211" + display: "everyone" + audienceType: "organization" + value: "97e4626a-b16e-4735-9896-536bc4f4481e" + $ref: "https://api.asgardeo.io/t/{organization-name}/scim2/v2/Roles/97e4626a-b16e-4735-9896-536bc4f4481e" + audienceDisplay: "{organization-name}" + id: "688d98c0-1c8d-49c2-9316-559a76cd9240" + userName: "AGENT/688d98c0-1c8d-49c2-9316-559a76cd9240" + urn:scim:wso2:agent:schema: + Owner: "7a6f7b26-f9ea-48ea-9012-87d6b54f4055@{organization-name}" + Description: "Intelligent Vet Assistant" + DisplayName: "Vetassist AI" + urn:scim:wso2:schema: + lastPasswordUpdateTime: "1765952272085" + 400: + description: Bad Request + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorInvalidInput' + 401: + description: Unauthorized + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUnauthorized' + 403: + description: Forbidden + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorForbidden' + 404: + description: Not Found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorNotFound' + 500: + description: Internal Server Error + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorInternalServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X POST \ + 'https://api.asgardeo.io/t/{organization-name}/scim2/Agents' \ + -H 'Accept: application/scim+json' \ + -H 'Content-Type: application/scim+json' \ + -H 'Authorization: Bearer {access_token}' \ + -d '{ + "urn:scim:wso2:agent:schema": { + "Description": "Intelligent Vet Assistant", + "DisplayName": "Vetassist AI", + "Owner": "7a6f7b26-f9ea-48ea-9012-87d6b54f4055@{organization-name}" + } + }' + + /Agents/{agentId}: + get: + tags: + - Agents Endpoint + summary: Retrieve an agent by ID + description: | + This API returns the agent details for the specified agent ID. + Scope(Permission) required: `internal_agent_mgt_view` + operationId: getAgentById + parameters: + - name: agentId + in: path + description: ID of the agent to retrieve. + required: true + schema: + type: string + - name: attributes + in: query + description: A multi-valued list of strings indicating the names of resource attributes to include in the response. + schema: + type: array + items: + type: string + - name: excludedAttributes + in: query + description: A multi-valued list of strings indicating the names of resource attributes to exclude in the response. + schema: + type: array + items: + type: string + responses: + 200: + description: Successful response with agent details. + content: + application/scim+json: + schema: + $ref: '#/components/schemas/AgentResponseObject' + example: + meta: + created: "2025-12-17T06:17:51.835814Z" + location: "https://api.asgardeo.io/t/{organization-name}/scim2/Agents/ced368ab-29f5-46c1-a192-ffb678b8f747" + lastModified: "2025-12-17T06:17:52.150201Z" + resourceType: "Agent" + schemas: + - "urn:ietf:params:scim:schemas:core:2.0:User" + - "urn:ietf:params:scim:schemas:extension:enterprise:2.0:User" + - "urn:scim:wso2:schema" + - "urn:scim:schemas:extension:custom:User" + - "urn:scim:wso2:agent:schema" + roles: + - audienceValue: "10084a8d-113f-4211-a0d5-efe36b082211" + display: "everyone" + audienceType: "organization" + value: "97e4626a-b16e-4735-9896-536bc4f4481e" + $ref: "https://api.asgardeo.io/t/{organization-name}/scim2/v2/Roles/97e4626a-b16e-4735-9896-536bc4f4481e" + audienceDisplay: "{organization-name}" + id: "ced368ab-29f5-46c1-a192-ffb678b8f747" + userName: "AGENT/ced368ab-29f5-46c1-a192-ffb678b8f747" + urn:scim:wso2:agent:schema: + Owner: "7a6f7b26-f9ea-48ea-9012-87d6b54f4055@{organization-name}" + Description: "Intelligent Vet Assistant" + DisplayName: "Vetassist AI" + urn:scim:wso2:schema: + lastPasswordUpdateTime: "1765952272085" + 400: + description: Bad Request + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorInvalidInput' + 401: + description: Unauthorized + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUnauthorized' + 403: + description: Forbidden + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorForbidden' + 404: + description: Not Found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorNotFound' + 500: + description: Internal Server Error + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorInternalServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X GET \ + 'https://api.asgardeo.io/t/{organization-name}/scim2/Agents/{agentId}' \ + -H 'Accept: application/scim+json' \ + -H 'Authorization: Bearer {access_token}' + + put: + tags: + - Agents Endpoint + summary: Update an existing agent by ID (replace) + description: | + This API replaces the existing agent details with the provided agent object. + Scope(Permission) required: `internal_agent_mgt_update` + operationId: updateAgentById + parameters: + - name: agentId + in: path + description: ID of the agent to update. + required: true + schema: + type: string + requestBody: + description: Agent object that needs to be updated. + required: true + content: + application/scim+json: + schema: + $ref: '#/components/schemas/AgentUpdateObject' + example: + urn:scim:wso2:agent:schema: + Description: "Updated Description" + DisplayName: "Vetassist AI" + Owner: "7a6f7b26-f9ea-48ea-9012-87d6b54f4055@{organization-name}" + id: "ced368ab-29f5-46c1-a192-ffb678b8f747" + userName: "AGENT/ced368ab-29f5-46c1-a192-ffb678b8f747" + responses: + 200: + description: Agent updated successfully. + content: + application/scim+json: + schema: + $ref: '#/components/schemas/AgentResponseObject' + 400: + description: Bad Request + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorInvalidInput' + 401: + description: Unauthorized + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUnauthorized' + 403: + description: Forbidden + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorForbidden' + 404: + description: Not Found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorNotFound' + 500: + description: Internal Server Error + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorInternalServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X PUT \ + 'https://api.asgardeo.io/t/{organization-name}/scim2/Agents/{agentId}' \ + -H 'Accept: application/scim+json' \ + -H 'Content-Type: application/scim+json' \ + -H 'Authorization: Bearer {access_token}' \ + -d '{ + "urn:scim:wso2:agent:schema": { + "Description": "Updated Description", + "DisplayName": "Vetassist AI", + "Owner": "7a6f7b26-f9ea-48ea-9012-87d6b54f4055@{organization-name}" + }, + "id": "14a11c02-d947-482c-9084-734fa1c22c2c", + "userName": "AGENT/{agentId}" + }' + + delete: + tags: + - Agents Endpoint + summary: Delete an agent by ID + description: | + This API deletes the specified agent. + Scope(Permission) required: `internal_agent_mgt_delete` + operationId: deleteAgentById + parameters: + - name: agentId + in: path + description: ID of the agent to delete. + required: true + schema: + type: string + responses: + 204: + description: Agent deleted successfully. + 400: + description: Bad Request + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorInvalidInput' + 401: + description: Unauthorized + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUnauthorized' + 403: + description: Forbidden + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorForbidden' + 404: + description: Not Found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorNotFound' + 500: + description: Internal Server Error + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorInternalServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X DELETE \ + 'https://api.asgardeo.io/t/{organization-name}/scim2/Agents/{agentId}' \ + -H 'Accept: application/scim+json' \ + -H 'Authorization: Bearer {access_token}' + + patch: + tags: + - Agents Endpoint + summary: Partially update an agent by ID + description: | + This API applies partial modifications to the specified agent using SCIM PATCH operations. + Common use cases include: + - Updating agent description + - Deactivating an agent + - Updating agent secret/password + Scope(Permission) required: `internal_agent_mgt_update` + operationId: patchAgentById + parameters: + - name: agentId + in: path + description: ID of the agent to partially update. + required: true + schema: + type: string + requestBody: + description: Patch operations to apply to the agent. + required: true + content: + application/scim+json: + schema: + $ref: '#/components/schemas/PatchOperation' + examples: + updateDescription: + summary: Update agent description + value: + schemas: + - "urn:ietf:params:scim:api:messages:2.0:PatchOp" + Operations: + - op: "replace" + path: "urn:scim:wso2:agent:schema:Description" + value: "AI assistant specializing in veterinary diagnostics and pet care recommendations." + deactivateAgent: + summary: Deactivate an agent + value: + schemas: + - "urn:ietf:params:scim:api:messages:2.0:PatchOp" + Operations: + - op: "replace" + path: "active" + value: false + updateSecret: + summary: Update agent secret + value: + schemas: + - "urn:ietf:params:scim:api:messages:2.0:PatchOp" + Operations: + - op: "replace" + path: "password" + value: "NewSecretPassword123!" + responses: + 200: + description: Agent updated successfully. + content: + application/scim+json: + schema: + $ref: '#/components/schemas/AgentResponseObject' + 400: + description: Bad Request + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorInvalidInput' + 401: + description: Unauthorized + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUnauthorized' + 403: + description: Forbidden + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorForbidden' + 404: + description: Not Found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorNotFound' + 500: + description: Internal Server Error + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorInternalServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PATCH' \ + 'https://api.asgardeo.io/t/{organization-name}/scim2/Agents/{agentId}' \ + -H 'accept: application/scim+json' \ + -H 'Content-Type: application/scim+json' \ + -H 'Authorization: Bearer {access_token}' \ + -d '{ + "schemas": [ + "urn:ietf:params:scim:api:messages:2.0:PatchOp" + ], + "Operations": [ + { + "op": "replace", + "path": "urn:scim:wso2:agent:schema:Description", + "value": "AI assistant specializing in veterinary diagnostics and pet care recommendations." + } + ] + }' +components: + schemas: + AgentCreateObject: + type: object + description: SCIM agent resource for creation. + properties: + "urn:scim:wso2:agent:schema": + type: object + required: + - DisplayName + - Owner + properties: + Description: + type: string + description: A description for the agent. + example: "Intelligent Vet Assistant" + DisplayName: + type: string + description: A human-readable name for the agent. + example: "Vetassist AI" + Owner: + type: string + description: The ID of the owner of this agent. + example: "7a6f7b26-f9ea-48ea-9012-87d6b54f4055@{organization-name}" + required: + - "urn:scim:wso2:agent:schema" + AgentUpdateObject: + type: object + description: SCIM agent resource for update. + properties: + id: + type: string + description: A unique identifier for the SCIM resource. + example: "ced368ab-29f5-46c1-a192-ffb678b8f747" + userName: + type: string + description: Unique identifier for the agent. + example: "AGENT/ced368ab-29f5-46c1-a192-ffb678b8f747" + "urn:scim:wso2:agent:schema": + type: object + properties: + Description: + type: string + description: A description for the agent. + example: "Updated Description" + DisplayName: + type: string + description: A human-readable name for the agent. + example: "Vetassist AI" + Owner: + type: string + description: The ID of the owner of this agent. + example: "7a6f7b26-f9ea-48ea-9012-87d6b54f4055@{organization-name}" + AgentResponseObject: + type: object + description: SCIM agent resource. + properties: + schemas: + type: array + items: + type: string + description: A complex attribute that contains one or more URIs that indicate the namespaces of the SCIM schemas that define the attributes present in the resource. + example: + - "urn:ietf:params:scim:schemas:core:2.0:User" + - "urn:ietf:params:scim:schemas:extension:enterprise:2.0:User" + - "urn:scim:wso2:schema" + - "urn:scim:schemas:extension:custom:User" + - "urn:scim:wso2:agent:schema" + id: + type: string + description: A unique identifier for the SCIM resource as defined by the service provider. + readOnly: true + example: "ced368ab-29f5-46c1-a192-ffb678b8f747" + meta: + type: object + description: A complex attribute containing resource metadata. + readOnly: true + properties: + resourceType: + type: string + description: The name of the resource type. + example: "Agent" + created: + type: string + format: date-time + description: The date and time at which the resource was added to the service provider. + example: "2025-12-17T06:17:51.835814Z" + lastModified: + type: string + format: date-time + description: The date and time at which the resource was last modified in the service provider. + example: "2025-12-17T06:17:52.150201Z" + location: + type: string + description: The URI of the resource being returned. + example: "https://api.asgardeo.io/t/{organization-name}/scim2/Agents/ced368ab-29f5-46c1-a192-ffb678b8f747" + userName: + type: string + description: Unique identifier for the agent. + example: "AGENT/ced368ab-29f5-46c1-a192-ffb678b8f747" + password: + type: string + writeOnly: true + description: The agent's clear text password (only returned on creation). + example: "K#B79pB%dq*v7sE!" + roles: + type: array + description: A list of roles for the agent. + items: + $ref: '#/components/schemas/Role' + "urn:scim:wso2:schema": + type: object + properties: + lastPasswordUpdateTime: + type: string + description: The epoch timestamp when the password was last updated. + example: "1765952272085" + "urn:scim:wso2:agent:schema": + type: object + properties: + Description: + type: string + description: A description for the agent. + example: "AI assistant specializing in veterinary diagnostics and pet care recommendations." + DisplayName: + type: string + description: A human-readable name for the agent. + example: "Vetassist AI" + Owner: + type: string + description: The ID of the owner of this agent. + example: "7a6f7b26-f9ea-48ea-9012-87d6b54f4055@{organization-name}" + AgentListResponseObject: + type: object + description: A list of SCIM agents. + properties: + totalResults: + type: integer + format: int32 + description: The total number of results returned by the list operation. + example: 1 + startIndex: + type: integer + format: int32 + description: The 1-based index of the first result in the current page. + example: 1 + itemsPerPage: + type: integer + format: int32 + description: The number of results in the current page. + example: 1 + schemas: + type: array + items: + type: string + description: A complex attribute that contains one or more URIs that indicate the namespaces of the SCIM schemas that define the attributes present in the resource. + example: + - "urn:ietf:params:scim:api:messages:2.0:ListResponse" + Resources: + type: array + items: + $ref: '#/components/schemas/AgentResponseObject' + Role: + type: object + description: A complex attribute that specifies the agent's roles. + properties: + value: + type: string + description: The identifier of the role. + example: "97e4626a-b16e-4735-9896-536bc4f4481e" + $ref: + type: string + description: The URI of the role. + example: "https://api.asgardeo.io/t/{organization-name}/scim2/v2/Roles/97e4626a-b16e-4735-9896-536bc4f4481e" + display: + type: string + description: A human-readable name for the role. + example: "everyone" + audienceValue: + type: string + description: The audience value of the role. + example: "10084a8d-113f-4211-a0d5-efe36b082211" + audienceType: + type: string + description: The audience type of the role. + example: "organization" + audienceDisplay: + type: string + description: A human-readable display name for the role's audience. + example: "organization-name" + PatchOperation: + type: object + description: A single SCIM patch operation. + properties: + schemas: + type: array + items: + type: string + example: + - "urn:ietf:params:scim:api:messages:2.0:PatchOp" + Operations: + type: array + items: + type: object + properties: + op: + type: string + description: The type of operation. Valid values are 'add', 'remove', or 'replace'. + enum: + - add + - remove + - replace + path: + type: string + description: The attribute path to be modified. + example: "urn:scim:wso2:agent:schema:Description" + value: + oneOf: + - type: string + - type: object + - type: array + description: The value to be added, removed, or replaced. This can be a simple value, an object, or an array. + example: "Updated Description from Patch" + required: + - schemas + - Operations + ErrorInvalidInput: + type: object + properties: + schemas: + type: array + items: + type: string + example: + - "urn:ietf:params:scim:api:messages:2.0:Error" + scimType: + type: string + description: A SCIM detail error keyword. + example: "invalidValue" + detail: + type: string + description: A more specific error message. + example: "Invalid input provided" + status: + type: string + description: The HTTP status code. + example: "400" + ErrorUnauthorized: + type: object + properties: + schemas: + type: array + items: + type: string + example: + - "urn:ietf:params:scim:api:messages:2.0:Error" + detail: + type: string + description: A more specific error message. + example: "Authentication required" + status: + type: string + description: The HTTP status code. + example: "401" + ErrorForbidden: + type: object + properties: + schemas: + type: array + items: + type: string + example: + - "urn:ietf:params:scim:api:messages:2.0:Error" + detail: + type: string + description: A more specific error message. + example: "You don't have enough permissions to perform this operation" + status: + type: string + description: The HTTP status code. + example: "403" + ErrorNotFound: + type: object + properties: + schemas: + type: array + items: + type: string + example: + - "urn:ietf:params:scim:api:messages:2.0:Error" + detail: + type: string + description: A more specific error message. + example: "The specified resource does not exist" + status: + type: string + description: The HTTP status code. + example: "404" + ErrorConflict: + type: object + properties: + schemas: + type: array + items: + type: string + example: + - "urn:ietf:params:scim:api:messages:2.0:Error" + detail: + type: string + description: A more specific error message. + example: "The requested operation would create a duplicate resource" + status: + type: string + description: The HTTP status code. + example: "409" + ErrorInternalServerError: + type: object + properties: + schemas: + type: array + items: + type: string + example: + - "urn:ietf:params:scim:api:messages:2.0:Error" + detail: + type: string + description: A more specific error message. + example: "Unexpected error occurred during processing the request" + status: + type: string + description: The HTTP status code. + example: "500" + securitySchemes: + OAuth2: + type: oauth2 + flows: + authorizationCode: + authorizationUrl: https://api.asgardeo.io/t/{organization-name}/oauth2/authorize + tokenUrl: https://api.asgardeo.io/t/{organization-name}/oauth2/token + scopes: + internal_agent_mgt_create: Create agents + internal_agent_mgt_list: List agents + internal_agent_mgt_view: View agent details + internal_agent_mgt_update: Update agents + internal_agent_mgt_delete: Delete agents + BasicAuth: + type: http + scheme: basic diff --git a/docusaurus-asgardeo/static/apis/restapis/scim2-bulk.yaml b/docusaurus-asgardeo/static/apis/restapis/scim2-bulk.yaml new file mode 100644 index 0000000000..6299f9bf05 --- /dev/null +++ b/docusaurus-asgardeo/static/apis/restapis/scim2-bulk.yaml @@ -0,0 +1,633 @@ +openapi: 3.0.1 +info: + title: Asgardeo - SCIM 2.0 Bulk API + description: | + This document specifies **SCIM 2.0 Bulk RESTful API** for **Asgardeo**. To access the SCIM 2.0 APIs in Asgardeo, you need to first [get an access token](https://wso2.com/asgardeo/docs/apis/authentication/#get-an-access-token) from your organization. + version: "v1" +servers: + - url: 'https://api.asgardeo.io/t/{organization-name}/scim2' +tags: + - name: Bulk Endpoint + description: | + This endpoint is used to create/update/delete SCIM resources (users and/or groups) in bulk. +paths: + /Bulk: + post: + tags: + - Bulk Endpoint + summary: Create/Update/Replace/Delete SCIM Resources (Users/ Groups) in Bulk + description: | + This API is used to create/update/replace/delete SCIM resources in bulk. You need to specify different operations in the request payload corresponding to the type of bulk update:

      + - **POST** operation: Adds new resources.
      + - **PUT** operation: Replaces an existing resource.
      + - **PATCH** operation: Updates attributes of an existing resource.
      + - **DELETE** operation: Removes an existing resource.
      + - Scopes required: ``internal_bulk_resource_create`` or an [operation-wise scope](../../scim2/scim2-batch-operations/#scopepermission-required-for-batch-operations) + - Flow type: Client Credentials OAuth Flow + + operationId: createBulkUsers + requestBody: + content: + application/scim+json: + schema: + oneOf: + - $ref: '#/components/schemas/BulkUserCreateObject' + - $ref: '#/components/schemas/BulkUserUpdateObject' + - $ref: '#/components/schemas/BulkUserReplaceObject' + - $ref: '#/components/schemas/BulkUserDeleteObject' + - $ref: '#/components/schemas/BulkGroupCreateObject' + - $ref: '#/components/schemas/BulkGroupUpdateObject' + - $ref: '#/components/schemas/BulkGroupReplaceObject' + - $ref: '#/components/schemas/BulkGroupDeleteObject' + responses: + 201: + description: Valid user is created + content: + application/scim+json: + schema: + $ref: '#/components/schemas/BulkUserResponseObject' + 401: + description: Unauthorized + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUnauthorized' + 403: + description: Forbidden + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorForbidden' + 409: + description: Users already exists + content: {} + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{organization-name}/scim2/Bulk' \ + -H 'accept: application/scim+json' \ + -H 'Content-Type: application/scim+json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "failOnErrors": 1, + "schemas": [ + "urn:ietf:params:scim:api:messages:2.0:BulkRequest" + ], + "Operations": [ + { + "method": "POST", + "path": "/Users", + "bulkId": "ytrewq", + "data": { + "schemas": [ + "urn:ietf:params:scim:schemas:core:2.0:User" + ], + "userName": "DEFAULT/kim@gmail.com", + "password": "Pass@kim1" + } + } + ] + }' + x-codegen-request-body-name: body +components: + schemas: + BulkUserCreateObject: + type: object + title: create user + properties: + failOnErrors: + type: integer + example: 1 + description: The number of errors that will be accepted by Asgardeo before returning the response. + schemas: + type: array + description: This is the schema that is required for sending bulk requests + items: + type: string + example: "urn:ietf:params:scim:api:messages:2.0:BulkRequest" + Operations: + type: array + description: Array of operations. To add multiple new users, add an array of POST operations. You can include any number of operations in one bulk request. + items: + $ref: '#/components/schemas/BulkUserOb' + required: + - schemas + - Operations + BulkUserUpdateObject: + type: object + title: update user + properties: + failOnErrors: + type: integer + example: 1 + description: The number of errors that will be accepted by Asgardeo before returning the response. + schemas: + type: array + description: This is the schema that is required for sending bulk requests + items: + type: string + example: "urn:ietf:params:scim:api:messages:2.0:BulkRequest" + Operations: + type: array + description: Array of operations. To update multiple users, add an array of PATCH operations. You can include any number of operations in one bulk request. + items: + $ref: '#/components/schemas/BulkUserUpdateOb' + required: + - schemas + - Operations + BulkUserReplaceObject: + type: object + title: replace user + properties: + failOnErrors: + type: integer + example: 1 + description: The number of errors that will be accepted by Asgardeo before returning the response. + schemas: + type: array + description: This is the schema that is required for sending bulk requests + items: + type: string + example: "urn:ietf:params:scim:api:messages:2.0:BulkRequest" + Operations: + type: array + description: Array of operations. To replace multiple users, add an array of PUT operations. You can include any number of operations in one bulk request. + items: + $ref: '#/components/schemas/BulkUserReplaceOb' + required: + - schemas + - Operations + BulkUserDeleteObject: + type: object + title: delete user + properties: + failOnErrors: + type: integer + example: 1 + description: The number of errors that will be accepted by Asgardeo before returning the response. + schemas: + type: array + description: This is the schema that is required for sending bulk requests + items: + type: string + example: "urn:ietf:params:scim:api:messages:2.0:BulkRequest" + Operations: + type: array + description: Array of operations. To delete multiple users, add an array of DELETE operations. You can include any number of operations in one bulk request. + items: + $ref: '#/components/schemas/BulkUserDeleteOb' + required: + - schemas + - Operations + BulkGroupCreateObject: + type: object + title: create group + properties: + failOnErrors: + type: integer + example: 1 + description: The number of errors that will be accepted by Asgardeo before returning the response. + schemas: + type: array + description: This is the schema that is required for sending bulk requests + items: + type: string + example: "urn:ietf:params:scim:api:messages:2.0:BulkRequest" + Operations: + type: array + description: Array of operations. To add multiple new user groups, add an array of POST operations. You can include any number of operations in one bulk request. + items: + $ref: '#/components/schemas/BulkGroupCreateOb' + required: + - schemas + - Operations + BulkGroupUpdateObject: + type: object + title: update group + properties: + failOnErrors: + type: integer + example: 1 + description: The number of errors that will be accepted by Asgardeo before returning the response. + schemas: + type: array + description: This is the schema that is required for sending bulk requests + items: + type: string + example: "urn:ietf:params:scim:api:messages:2.0:BulkRequest" + Operations: + type: array + description: Array of operations. To update multiple user groups, add an array of PATCH operations. You can include any number of operations in one bulk request. + items: + $ref: '#/components/schemas/BulkGroupUpdateOb' + required: + - schemas + - Operations + BulkGroupReplaceObject: + type: object + title: replace group + properties: + failOnErrors: + type: integer + example: 1 + description: The number of errors that will be accepted by Asgardeo before returning the response. + schemas: + type: array + description: This is the schema that is required for sending bulk requests + items: + type: string + example: "urn:ietf:params:scim:api:messages:2.0:BulkRequest" + Operations: + type: array + description: Array of operations. To replace multiple user groups, add an array of PUT operations. You can include any number of operations in one bulk request. + items: + $ref: '#/components/schemas/BulkGroupReplaceOb' + required: + - schemas + - Operations + BulkGroupDeleteObject: + type: object + title: delete group + properties: + failOnErrors: + type: integer + example: 1 + description: The number of errors that will be accepted by Asgardeo before returning the response. + schemas: + type: array + description: This is the schema that is required for sending bulk requests + items: + type: string + example: "urn:ietf:params:scim:api:messages:2.0:BulkRequest" + Operations: + type: array + description: Array of operations. To delete multiple user groups, add an array of PUT operations. You can include any number of operations in one bulk request. + items: + $ref: '#/components/schemas/BulkGroupDeleteOb' + required: + - schemas + - Operations + BulkUserOb: + type: object + properties: + method: + type: string + description: The method that should be used in the operation + example: POST + path: + type: string + description: Add this path to specify that a new user is being added. + example: /Users + bulkId: + type: string + description: A unique identifier for the bulk operation. The bulkid is required for POST operations. + example: ytrewq + data: + type: object + description: Specify the details of the new user that should be added. + properties: + schemas: + type: array + description: Specify the list of SCIM2 user schemas to which the new user should be linked. + example: + - urn:ietf:params:scim:schemas:core:2.0:User + - urn:ietf:params:scim:schemas:enterprise:2.0:User + - urn:scim:wso2:schema + items: + type: string + example: urn:ietf:params:scim:schemas:core:2.0:User + userName: + type: string + description: The email address that should be set as the username. + example: DEFAULT/kim@gmail.com + password: + type: string + description: The password that is set for the user. + example: Pass@kim1 + required: + - schemas + - username + - password + required: + - method + - path + - bulkId + - data + BulkUserUpdateOb: + type: object + properties: + method: + type: string + description: The method that should be used in the operation + example: PATCH + path: + type: string + description: Add this path to specify the new user that is being updated. (Optional if op is add or replace) + example: /Users/{user_id} + bulkId: + type: integer + description: A unique identifier for the bulk operation. The bulkid is required for POST operations. + example: An integer value + data: + type: object + description: Specify the details of the new user that should be updated. + properties: + op: + type: string + description: The operation that should be applied to the existing user data. + example: + - add + - replace + - remove + path: + type: string + description: The path to the resource (user attribute) that should be updated. (Optional if op is add or replace) + example: If the name of the user is to be updated, the path should be “name”. + value: + type: string + description: The value of the parameter specified by the path. (Optional if op is add or replace) + example: If the path is “name”, the value should be the actual name. + required: + - op + - path + - value + required: + - method + - path + - data + BulkUserReplaceOb: + type: object + properties: + method: + type: string + description: The method that should be used in the operation + example: PUT + path: + type: string + description: Add this path to specify the existing user that should be replaced by the new user information that is added. + example: /Users/{user_id} + bulkId: + type: integer + description: A unique identifier for the bulk operation. The bulkid is required for POST operations. + example: An integer value + data: + type: object + description: Specify the new user details that should be used to replace the existing user specified in the path. + properties: + schemas: + type: array + description: Specify the list of SCIM2 user schemas to which the new user should be linked. + example: + - urn:ietf:params:scim:schemas:core:2.0:User + - urn:ietf:params:scim:schemas:enterprise:2.0:User + - urn:scim:wso2:schema + items: + type: string + example: urn:ietf:params:scim:schemas:core:2.0:User + userName: + type: string + description: The name of the attribute that will be replaced. + example: smith + name: + type: object + description: The name of the attribute that will be replaced. + properties: + givenName: + type: string + example: Smith + familyName: + type: string + example: Berry + required: + - schemas + - userName + - name + required: + - method + - path + - data + BulkUserDeleteOb: + type: object + properties: + method: + type: string + description: The method that should be used in the operation + example: DELETE + path: + type: string + description: Add this path to specify the existing user that should be deleted. + example: /Users/{user_id} + required: + - method + - path + BulkGroupCreateOb: + type: object + properties: + method: + type: string + description: The method that should be used in the operation + example: POST + path: + type: string + description: Add this path to specify that a new user group that should be added. + example: /Groups + bulkId: + type: integer + description: A unique identifier for the bulk operation. The bulkid is required for POST operations. + example: An integer value + data: + type: object + description: Specify the details of the new user group that should be added. + properties: + displayName: + type: string + description: The display name of the user group. + members: + type: array + description: An array of member users. + items: + type: object + properties: + display: + type: string + description: The display name of a user assigned to the group.(Required if members is used) + example: The username + value: + type: string + description: The ID of the user.(Required if members is used) + example: The user ID. + required: + - displayName + required: + - method + - path + - data + BulkGroupUpdateOb: + type: object + properties: + method: + type: string + description: The method that should be used in the operation + example: PATCH + path: + type: string + description: Add this path to specify the user group that should be updated. + example: /Groups/{group_id} + bulkId: + type: integer + description: A unique identifier for the bulk operation. The bulkid is required for POST operations. + example: An integer value + data: + type: object + description: Specify the details that should be updated for the user group specified in the path. + properties: + op: + type: string + description: The operation that should be applied to the existing user group. + example: + - add + - replace + - remove + path: + type: string + description: Specify “members” as the path.(Optional if op is add or replace) + example: members + value: + type: array + description: An array of users that belong to the group.(Optional if op is remove) + items: + type: object + properties: + display: + type: string + description: The display name of the user, who is a member.(Required if path is set to members) + example: The username + value: + type: string + description: The user ID of the member user.(Required if path is set to members) + example: The user ID + required: + - op + - path + - value + required: + - method + - path + - data + BulkGroupReplaceOb: + type: object + properties: + method: + type: string + description: The method that should be used in the operation + example: PUT + path: + type: string + description: Add this path to specify the existing user group that should be replaced by the new information that is added. + example: /Groups/{group_id} + bulkId: + type: integer + description: A unique identifier for the bulk operation. The bulkid is required for POST operations. + example: An integer value + data: + type: object + description: Specify the new group details that should be used to replace the existing user group specified in the path. + properties: + displayName: + type: string + description: The display name of the user group. + members: + type: array + description: Array of member users. + items: + type: object + properties: + display: + type: string + description: The display name of a user assigned to the group. + example: The username + value: + type: string + description: The ID of the user. + example: The user ID. + required: + - display + - value + required: + - displayName + - members + required: + - method + - path + - data + BulkGroupDeleteOb: + type: object + properties: + method: + type: string + description: The method that should be used in the operation + example: DELETE + path: + type: string + description: Add this path to specify the existing user group that should be deleted. + example: /Groups/{group_id} + required: + - method + - path + BulkUserResponseObject: + type: object + properties: + schemas: + type: array + items: + type: string + example: urn:ietf:params:scim:api:messages:2.0:BulkResponse + Operations: + $ref: '#/components/schemas/OperationObBulk' + OperationObBulk: + type: object + properties: + bulkId: + type: string + example: qwerty + method: + type: string + example: POST + location: + type: string + example: https://api.asgardeo.io/t/{org-name}/scim2/Users/81cbba1b-c259-485d-8ba4-79afb03e5bd1 + status: + type: object + properties: + code: + type: string + example: "201" + ErrorUnauthorized: + required: + - status + type: object + properties: + schemas: + type: string + example: urn:ietf:params:scim:api:messages:2.0:Error + detail: + type: string + example: "Authorization failure. Authorization information was invalid or missing from your request." + status: + type: string + example: "401" + ErrorForbidden: + required: + - status + type: object + properties: + schemas: + type: string + example: urn:ietf:params:scim:api:messages:2.0:Error + detail: + type: string + example: "Operation is not permitted. You do not have permission to make this request." + status: + type: string + example: "403" diff --git a/docusaurus-asgardeo/static/apis/restapis/scim2-groups.yaml b/docusaurus-asgardeo/static/apis/restapis/scim2-groups.yaml new file mode 100644 index 0000000000..57a3881804 --- /dev/null +++ b/docusaurus-asgardeo/static/apis/restapis/scim2-groups.yaml @@ -0,0 +1,859 @@ +openapi: 3.0.1 +info: + title: Asgardeo - SCIM 2.0 Groups API + description: | + This document specifies **SCIM 2.0 Group Management RESTful API** for **Asgardeo**. This endpoint performs actions related to all users in the organization. To access the SCIM 2.0 APIs in Asgardeo, you need to first [get an access token](https://wso2.com/asgardeo/docs/apis/authentication/#get-an-access-token) from your organization. + version: "v1" +servers: + - url: 'https://api.asgardeo.io/t/{organization-name}/scim2' +paths: + /Groups: + get: + tags: + - Groups Endpoint + summary: Filter Groups + description: "This API returns groups according to the specified filter, sort, and pagination parameters.\n\n + - Scope(Permission) required: ``internal_group_mgt_view`` \n\n + - Flow type: Client Credentials OAuth Flow" + operationId: getGroup + parameters: + - name: attributes + in: query + description: SCIM defined attributes parameter. + schema: + type: string + - name: excludedAttributes + in: query + description: SCIM defined excludedAttribute parameter. + schema: + type: string + - name: filter + in: query + description: Filter expression for filtering + schema: + type: string + - name: startIndex + in: query + description: The 1-based index of the first query result + schema: + type: integer + format: int32 + - name: count + in: query + description: Specifies the desired maximum number of query results per page. + schema: + type: integer + format: int32 + - name: domain + in: query + description: The name of the user store where filtering needs to be applied. + schema: + type: string + responses: + 200: + description: Valid groups are found / No Group found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/GroupsListResponseObject' + 401: + description: Unauthorized + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUnauthorized' + 403: + description: Forbidden + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorForbidden' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/scim2/Groups' \ + -H 'accept: application/scim+json' \ + -H 'Authorization: Bearer {bearer_token}' + post: + tags: + - Groups Endpoint + summary: Create Group + description: "This API creates a group and returns the details of the created group including its unique ID.\n\n + - Scope(Permission) required: ``internal_group_mgt_create``\n\n + - Flow type: Client Credentials OAuth Flow" + operationId: createGroup + parameters: + - name: attributes + in: query + description: SCIM defined attributes parameter. + schema: + type: string + - name: excludedAttributes + in: query + description: SCIM defined excludedAttribute parameter. + schema: + type: string + requestBody: + content: + application/scim+json: + schema: + $ref: '#/components/schemas/GroupRequestObject' + required: false + responses: + 201: + description: Valid group is created + content: + application/scim+json: + schema: + $ref: '#/components/schemas/GroupResponseObject' + 401: + description: Unauthorized + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUnauthorized' + 403: + description: Forbidden + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorForbidden' + 404: + description: Group is not found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorGroupNotAvailable' + 409: + description: Group already exist + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorGroupAlreadyAvailable' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/scim2/Groups' \ + -H 'accept: application/scim+json' \ + -H 'Authorization: Bearer {bearer_token}' + x-codegen-request-body-name: body + /Groups/.search: + post: + tags: + - Groups Endpoint + summary: Search Groups + description: "This API returns groups according to the specified filter, sort, and pagination parameters.\n\n + - Scope(Permission) required: ``internal_group_mgt_view``\n\n + - Flow type: Client Credentials OAuth Flow" + operationId: getGroupsByPost + requestBody: + content: + application/scim+json: + schema: + $ref: '#/components/schemas/GroupSearchRequestObject' + required: false + responses: + 200: + description: Valid groups are found / Valid groups are not found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/GroupSearchResponseObject' + 401: + description: Unauthorized + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUnauthorized' + 403: + description: Forbidden + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorForbidden' + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{organization-name}/scim2/Groups/.search' \ + -H 'accept: application/scim+json' \ + -H 'Content-Type: application/scim+json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "schemas": [ + "urn:ietf:params:scim:api:messages:2.0:SearchRequest" + ], + "startIndex": 1, + "filter": "displayName eq manager" + }' + x-codegen-request-body-name: body + /Groups/{id}: + get: + tags: + - Groups Endpoint + summary: Get Group by ID + description: "This API returns the group details of a particular group using its unique ID.\n\n + - Scope(Permission) required: ``internal_group_mgt_view``\n\n + - Flow type: Client Credentials OAuth Flow" + operationId: getGroup by id + parameters: + - name: id + in: path + description: Unique ID of the resource type. + required: true + schema: + type: string + - name: attributes + in: query + description: SCIM defined attributes parameter. + schema: + type: string + - name: excludedAttributes + in: query + description: SCIM defined excludedAttribute parameter. + schema: + type: string + responses: + 200: + description: Valid group is found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/GroupResponseObject' + 401: + description: Unauthorized + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUnauthorized' + 403: + description: Forbidden + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorForbidden' + 404: + description: Valid group is not found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorNoGroupAvailable' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/scim2/Groups/{group-id}' \ + -H 'accept: application/scim+json' \ + -H 'Authorization: Bearer {bearer_token}' + put: + tags: + - Groups Endpoint + summary: Update Group - PUT + description: "This API updates the group details and returns the updated group details using a PUT operation.\n\n + - Scope(Permission) required: ``internal_group_mgt_update`` \n\n + - Flow type: Client Credentials OAuth Flow" + operationId: updateGroup + parameters: + - name: id + in: path + description: Unique ID of the resource type. + required: true + schema: + type: string + - name: attributes + in: query + description: SCIM defined attributes parameter. + schema: + type: string + - name: excludedAttributes + in: query + description: SCIM defined excludedAttribute parameter. + schema: + type: string + requestBody: + content: + application/scim+json: + schema: + $ref: '#/components/schemas/GroupPutRequestObject' + required: false + responses: + 200: + description: Group is updated + content: + application/scim+json: + schema: + $ref: '#/components/schemas/GroupPutResponseObject' + 400: + description: Invalid Input + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorInvalidInput' + 401: + description: Unauthorized + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUnauthorized' + 403: + description: Forbidden + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorForbidden' + 404: + description: Valid group is not found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorNoGroupAvailable' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PUT' \ + 'https://api.asgardeo.io/t/{organization-name}/scim2/Groups/{group-id}' \ + -H 'accept: application/scim+json' \ + -H 'Content-Type: application/scim+json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "displayName": "manager", + "members": [ + { + "value": "409ca90b-2ba6-4474-9a45-2cf7376e6e43", + "display": "kris" + } + ] + }' + x-codegen-request-body-name: body + delete: + tags: + - Groups Endpoint + summary: Delete Group + description: "This API deletes a particular group using its unique ID.\n\n + - Scope(Permission) required: ``internal_group_mgt_delete``\n\n + - Flow type: Client Credentials OAuth Flow" + operationId: deleteGroup + parameters: + - name: id + in: path + description: Unique ID of the resource type. + required: true + schema: + type: string + responses: + 204: + description: Group is deleted + content: {} + 401: + description: Unauthorized + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUnauthorized' + 403: + description: Forbidden + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorForbidden' + 404: + description: Valid group is not found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorNoGroupAvailable' + x-codeSamples: + - lang: Curl + source: | + curl -X 'DELETE' \ + 'https://api.asgardeo.io/t/{organization-name}/scim2/Groups/{group-id}' \ + -H 'accept: */*' \ + -H 'Authorization: Bearer {bearer_token}' + patch: + tags: + - Groups Endpoint + summary: Update Group - PATCH + description: "This API updates the group details and returns the updated group details using a PATCH operation.\n\n + - Scope(Permission) required: ``internal_group_mgt_update``\n\n + - Flow type: Client Credentials OAuth Flow" + operationId: patchGroup + parameters: + - name: id + in: path + description: Unique id of the resource type. + required: true + schema: + type: string + - name: attributes + in: query + description: SCIM defined attributes parameter. + schema: + type: string + - name: excludedAttributes + in: query + description: SCIM defined excludedAttribute parameter. + schema: + type: string + requestBody: + content: + application/scim+json: + schema: + $ref: '#/components/schemas/PatchGroupOperationRequestObject' + required: false + responses: + 200: + description: Group is updated + content: + application/scim+json: + schema: + $ref: '#/components/schemas/PatchGroupOperationResponseObject' + 401: + description: Unauthorized + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUnauthorized' + 403: + description: Forbidden + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorForbidden' + 404: + description: Valid group is not found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorNoGroupAvailable' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PATCH' \ + 'https://api.asgardeo.io/t/{organization-name}/scim2/Groups/{group-id}' \ + -H 'accept: application/scim+json' \ + -H 'Content-Type: application/scim+json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "schemas": [ + "urn:ietf:params:scim:api:messages:2.0:PatchOp" + ], + "Operations": [ + { + "op": "add", + "value": { + "members": [ + { + "display": "kris", + "value": "409ca90b-2ba6-4474-9a45-2cf7376e6e43" + } + ] + } + } + ] + }' + x-codegen-request-body-name: body +components: + schemas: + GroupsListResponseObject: + type: object + properties: + totalResults: + type: integer + example: 3 + startIndex: + type: integer + example: 1 + itemsPerPage: + type: integer + example: 3 + schemas: + type: array + items: + type: string + example: urn:ietf:params:scim:api:messages:2.0:ListResponse + Resources: + type: array + items: + $ref: '#/components/schemas/groupOb' + groupOb: + type: object + properties: + displayName: + type: string + example: DEFAULT/manager + meta: + type: object + properties: + created: + type: string + example: 2019-08-26T14:27:36 + location: + type: string + example: https://api.asgardeo.io/t/{org-name}/scim2/Groups/7bac6a86-1f21-4937-9fb1-5be4a93ef469 + lastModified: + type: string + example: 2019-08-26T14:27:36 + members: + type: array + items: + type: object + properties: + $ref: + type: string + example: https://api.asgardeo.io/t/{org-name}/scim2/Users/3a12bae9-4386-44be-befd-caf349297f45 + display: + type: string + example: kim + value: + type: string + example: 008bba85-451d-414b-87de-c03b5a1f4217 + roles: + type: array + items: + type: object + properties: + $ref: + type: string + example: https://api.asgardeo.io/t/{org-name}/scim2/Roles/4645709c-ea8c-4495-8590-e1fa0efe3de0 + display: + type: string + example: loginRole + value: + type: string + example: 4645709c-ea8c-4495-8590-e1fa0efe3de0 + id: + type: string + example: 7bac6a86-1f21-4937-9fb1-5be4a93ef469 + GroupRequestObject: + required: + - displayName + - schemas + type: object + properties: + schemas: + type: array + items: + type: string + example: urn:ietf:params:scim:schemas:core:2.0:Group + displayName: + type: string + example: DEFAULT/manager + members: + type: array + items: + type: object + properties: {} + example: + value: 008bba85-451d-414b-87de-c03b5a1f4217 + display: kim + GroupResponseObject: + type: object + properties: + displayName: + type: string + example: DEFAULT/manager + meta: + type: object + properties: + created: + type: string + example: 2019-08-26T14:27:36 + location: + type: string + example: https://api.asgardeo.io/t/{org-name}/scim2/Groups/7bac6a86-1f21-4937-9fb1-5be4a93ef469 + lastModified: + type: string + example: 2019-08-26T14:27:36 + resourceType: + type: string + example: Group + schemas: + type: array + items: + type: string + example: urn:ietf:params:scim:schemas:core:2.0:Group + id: + type: string + example: 7bac6a86-1f21-4937-9fb1-5be4a93ef469 + members: + description: The members of the group. Note that if the group is from a remote user store, a limited number of members will be returned. You can use filters to query remaining users. For example - `emails+eq+user@gmail.com+and+groups+eq+remote_group_01` + type: array + items: + type: object + properties: + $ref: + type: string + example: https://api.asgardeo.io/t/{org-name}/scim2/Users/3a12bae9-4386-44be-befd-caf349297f45 + display: + type: string + example: kim + value: + type: string + example: 008bba85-451d-414b-87de-c03b5a1f4217 + roles: + type: array + items: + type: object + properties: + $ref: + type: string + example: https://api.asgardeo.io/t/{org-name}/scim2/Roles/4645709c-ea8c-4495-8590-e1fa0efe3de0 + display: + type: string + example: loginRole + value: + type: string + example: 4645709c-ea8c-4495-8590-e1fa0efe3de0 + GroupSearchRequestObject: + type: object + properties: + schemas: + type: object + properties: {} + example: + - urn:ietf:params:scim:api:messages:2.0:SearchRequest + startIndex: + type: integer + example: 1 + filter: + type: string + example: displayName eq manager + GroupSearchResponseObject: + type: object + properties: + totalResults: + type: integer + example: 1 + startIndex: + type: integer + example: 1 + itemsPerPage: + type: integer + example: 3 + schemas: + type: array + items: + type: string + example: urn:ietf:params:scim:api:messages:2.0:ListResponse + Resources: + type: array + items: + $ref: '#/components/schemas/groupOb' + GroupPutResponseObject: + type: object + properties: + displayName: + type: string + example: DEFAULT/manager + meta: + type: object + properties: + created: + type: string + example: 2019-08-26T14:27:36 + location: + type: string + example: https://api.asgardeo.io/t/{org-name}/scim2/Groups/7bac6a86-1f21-4937-9fb1-5be4a93ef469 + lastModified: + type: string + example: 2019-08-26T14:27:36 + resourceType: + type: string + example: Group + schemas: + type: array + items: + type: string + example: urn:ietf:params:scim:schemas:core:2.0:Group + id: + type: string + example: 7bac6a86-1f21-4937-9fb1-5be4a93ef469 + members: + type: array + items: + type: object + properties: {} + example: + display: kris + value: 409ca90b-2ba6-4474-9a45-2cf7376e6e43 + GroupPutRequestObject: + type: object + properties: + displayName: + type: string + example: manager + members: + type: array + items: + type: object + properties: {} + example: + value: 409ca90b-2ba6-4474-9a45-2cf7376e6e43 + display: kris + PatchGroupOperationRequestObject: + type: object + properties: + schemas: + type: array + items: + type: string + example: urn:ietf:params:scim:api:messages:2.0:PatchOp + Operations: + type: array + items: + $ref: '#/components/schemas/GroupItemObj' + GroupItemObj: + type: object + properties: + op: + type: string + enum: + - add + - remove + - replace + value: + type: object + properties: + members: + type: array + items: + type: object + properties: {} + example: + display: kris + value: 409ca90b-2ba6-4474-9a45-2cf7376e6e43 + PatchGroupOperationResponseObject: + type: object + properties: + displayName: + type: string + example: DEFAULT/manager + meta: + type: object + properties: + created: + type: string + example: 2019-08-26T14:27:36 + location: + type: string + example: https://api.asgardeo.io/t/{org-name}/scim2/Groups/7bac6a86-1f21-4937-9fb1-5be4a93ef469 + lastModified: + type: string + example: 2019-08-26T14:27:36 + resourceType: + type: string + example: Group + schemas: + type: object + properties: {} + example: + - urn:ietf:params:scim:schemas:core:2.0:Group + id: + type: string + example: 7bac6a86-1f21-4937-9fb1-5be4a93ef469 + members: + type: array + items: + type: object + properties: {} + example: + - display: kris + value: 409ca90b-2ba6-4474-9a45-2cf7376e6e43 + - display: kim + value: 007bfc66-e4f0-4d53-9dfd-0c4a77b33257 + ErrorGroupAlreadyAvailable: + required: + - detail + - status + type: object + properties: + status: + type: string + example: "409" + schemas: + type: string + example: urn:ietf:params:scim:api:messages:2.0:Error + detail: + type: string + example: 'Group with name: DEFAULT/manager already exists in the system.' + ErrorGroupNotAvailable: + required: + - detail + - status + type: object + properties: + status: + type: string + example: "404" + schemas: + type: string + example: urn:ietf:params:scim:api:messages:2.0:Error + detail: + type: string + example: 'No Group with the id : 89a2a363-c90f-47e9-afae-949d026dad16 in + the user store.' + ErrorNoGroupAvailable: + required: + - detail + - status + type: object + properties: + status: + type: string + example: "404" + schemas: + type: array + items: + type: string + example: urn:ietf:params:scim:api:messages:2.0:Error + detail: + type: string + example: Group not found in the user store. + ErrorUnauthorized: + required: + - status + type: object + properties: + schemas: + type: string + example: urn:ietf:params:scim:api:messages:2.0:Error + detail: + type: string + example: "Authorization failure. Authorization information was invalid or missing from your request." + status: + type: string + example: "401" + ErrorForbidden: + required: + - status + type: object + properties: + schemas: + type: string + example: urn:ietf:params:scim:api:messages:2.0:Error + detail: + type: string + example: "Operation is not permitted. You do not have permission to make this request." + status: + type: string + example: "403" + ErrorInvalidInput: + required: + - detail + - status + type: object + properties: + status: + type: string + example: "400" + schemas: + type: string + example: urn:ietf:params:scim:api:messages:2.0:Error + scimType: + type: string + example: invalidSyntax + detail: + type: string + example: Request is unparsable, syntactically incorrect, or violates schema. diff --git a/docusaurus-asgardeo/static/apis/restapis/scim2-me.yaml b/docusaurus-asgardeo/static/apis/restapis/scim2-me.yaml new file mode 100644 index 0000000000..d350b559e6 --- /dev/null +++ b/docusaurus-asgardeo/static/apis/restapis/scim2-me.yaml @@ -0,0 +1,693 @@ +openapi: 3.0.1 +info: + title: SCIM 2.0 Me API + description: | + This document specifies **SCIM 2.0 Me RESTful API** for **Asgardeo**. + version: "v1" +servers: + - url: 'https://api.asgardeo.io/t/{organization-name}/scim2' +tags: + - name: Me Endpoint + description: This endpoint performs actions on the logged in user. +paths: + /Me: + get: + tags: + - Me Endpoint + summary: Get Me + description: "This API returns the user details of the currently authenticated user.\n\n + - Scope(Permission) required: ``internal_login`` \n\n + - Flow type: Authorization Code OAuth Flow" + parameters: + - name: attributes + in: query + description: SCIM defined `attributes` parameter. + schema: + type: string + - name: excludedAttributes + in: query + description: SCIM defined ``excludedAttribute`` parameter. + schema: + type: string + responses: + 200: + description: Valid user is found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/UserResponseObject' + 401: + description: Unauthorized + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUnauthorized' + 404: + description: Valid User is not found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUserNotAvailable' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/scim2/Me' \ + -H 'accept: application/scim+json' \ + -H 'Authorization: Bearer {bearer_token}' + put: + tags: + - Me Endpoint + summary: Update Me + description: "This API uses a PUT operation to update user details.\n\n + - Scope(Permission) required:``internal_login``\n\n + - Flow type: Authorization Code OAuth Flow" + operationId: updateUserMe + parameters: + - name: attributes + in: query + description: SCIM defined attributes parameter. + schema: + type: string + - name: excludedAttributes + in: query + description: SCIM defined excludedAttribute parameter. + schema: + type: string + requestBody: + content: + application/scim+json: + schema: + $ref: '#/components/schemas/UserUpdateObject' + required: true + responses: + 200: + description: User is updated + content: + application/scim+json: + schema: + $ref: '#/components/schemas/UserResponseObject' + 401: + description: Unauthorized + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUnauthorized' + 404: + description: Valid user is not found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUserNotAvailable' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PUT' \ + 'https://api.asgardeo.io/t/{organization-name}/scim2/Me' \ + -H 'accept: application/scim+json' \ + -H 'Content-Type: application/scim+json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "schemas": [], + "name": { + "givenName": "Kim", + "familyName": "Berry" + }, + "userName": "DEFAULT/kim@gmail.com", + "emails": [ + { + "value": "kim@gmail.com", + "primary": true + } + ], + "urn:ietf:params:scim:schemas:extension:enterprise:2.0:User": { + "manager": { + "value": "Taylor" + } + } + }' + patch: + tags: + - Me Endpoint + summary: Update Me - PATCH + description: "This API uses a PATCH operation to update user details.\n\n + - Scope(Permission) required: ``internal_login`` \n\n + - Flow type: Authorization Code OAuth Flow" + operationId: patchUserMe + parameters: + - name: attributes + in: query + description: SCIM defined attributes parameter. + schema: + type: string + - name: excludedAttributes + in: query + description: SCIM defined excludedAttribute parameter. + schema: + type: string + requestBody: + content: + application/scim+json: + schema: + $ref: '#/components/schemas/PatchOperationInput' + required: false + responses: + 200: + description: User is updated + content: + application/scim+json: + schema: + $ref: '#/components/schemas/PatchOperationResponseOutput' + 401: + description: Unauthorized + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUnauthorized' + 404: + description: Valid user is not found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUserNotAvailable' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PATCH' \ + 'https://api.asgardeo.io/t/{organization-name}/scim2/Me' \ + -H 'accept: application/scim+json' \ + -H 'Content-Type: application/scim+json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "schemas": [ + "urn:ietf:params:scim:api:messages:2.0:PatchOp" + ], + "Operations": [ + { + "op": "add", + "value": { + "nickName": "shaggy" + } + } + ] + }' + x-codegen-request-body-name: body +components: + schemas: + UserObject: + title: Set a password for the user + required: + - password + type: object + properties: + schemas: + type: object + properties: {} + example: [] + name: + type: object + properties: + givenName: + type: string + description: The `givenName` you specify will be entered for the First Name attribute in the user's profile. + example: Kim + familyName: + type: string + description: The `familyName` you specify will be entered for the Last Name attribute in the user's profile. + example: Berry + userName: + type: string + description: By default, the username should be the email address and it will be stored in the `DEFAULT` user store. However, if username validation is changed to `Alphanumeric` in your Asgardeo organization, you need to specify an alphanumeric value (a-z, A-Z, 0-9) as the username instead of the email. + example: DEFAULT/kim@gmail.com + password: + type: string + description: Use this parameter to set a password for the user account. The user will be able to reset this password later. When setting the password, be sure to follow the password-validation rules configured for your organization. + example: aBcd!23# + emails: + type: array + description: This email will be entered for the Email attribute in the user's profile. + example: + - value: kim@gmail.com + primary: true + items: + type: object + properties: {} + urn:ietf:params:scim:schemas:extension:enterprise:2.0:User: + type: object + properties: + manager: + type: object + properties: + value: + type: string + example: Taylor + urn:scim:wso2:schema: + type: object + properties: + verifyEmail: + type: boolean + description: When the administrator sets the password for the new user account, this parameter specifies if the new user should confirm the new account through email. If this parameter is set to `true`, an email is sent to the user's email address requesting confirmation. + example: true + UserObjectPassInvite: + title: Invite the user to set their own password + type: object + properties: + schemas: + type: object + properties: {} + example: [] + name: + type: object + properties: + givenName: + type: string + description: The `givenName` you specify will be entered for the First Name attribute in the user's profile. + example: Kim + familyName: + type: string + description: The `familyName` you specify will be entered for the Last Name attribute in the user's profile. + example: Berry + userName: + type: string + description: By default, the username should be the email address and it will be stored in the `DEFAULT` user store. However, if username validation is changed to `Alphanumeric` in your Asgardeo organization, you need to specify an alphanumeric value (a-z, A-Z, 0-9) as the username instead of the email. + example: DEFAULT/kim@gmail.com + emails: + type: array + description: This email will be entered for the Email attribute in the user's profile. + example: + - value: kim@gmail.com + primary: true + items: + type: object + properties: {} + urn:ietf:params:scim:schemas:extension:enterprise:2.0:User: + type: object + properties: + manager: + type: object + properties: + value: + type: string + example: Taylor + urn:scim:wso2:schema: + type: object + properties: + askPassword: + type: boolean + description: If this parameter is set to `true`, users will be allowed configure their own password. An email is sent to the specified email address, which will have instructions for the user to set the password and confirm the new user account. + example: true + UserResponseObject: + required: + - meta + type: object + properties: + meta: + type: object + properties: + created: + type: string + example: 2018-08-17T10:34:29Z + location: + type: string + example: https://api.asgardeo.io/t/{org-name}/scim2/Users/008bba85-451d-414b-87de-c03b5a1f4217 + lastModified: + type: string + example: 2018-08-17T10:34:29Z + resourceType: + type: string + example: User + schemas: + type: object + properties: {} + example: + - urn:ietf:params:scim:schemas:core:2.0:User + - urn:ietf:params:scim:schemas:extension:enterprise:2.0:User + username: + type: string + example: DEFAULT/kim@gmail.com + id: + type: string + example: 008bba85-451d-414b-87de-c03b5a1f4217 + name: + type: object + properties: + givenName: + type: string + example: Kim + familyName: + type: string + example: Berry + emails: + type: array + example: + - kim@gmail.com + items: + type: object + properties: {} + urn:ietf:params:scim:schemas:extension:enterprise:2.0:User: + type: object + properties: + manager: + type: object + properties: + value: + type: string + example: Taylor + roles: + type: object + properties: {} + example: + - type: default + value: Internal/everyone + UserUpdateObject: + type: object + properties: + schemas: + type: object + properties: {} + example: [] + name: + type: object + properties: + givenName: + type: string + example: Kim + familyName: + type: string + example: Berry + userName: + type: string + example: DEFAULT/kim@gmail.com + emails: + type: array + example: + - value: kim@gmail.com + primary: true + items: + type: object + properties: {} + urn:ietf:params:scim:schemas:extension:enterprise:2.0:User: + type: object + properties: + manager: + type: object + properties: + value: + type: string + example: Taylor + PatchOperationInput: + type: object + properties: + schemas: + type: array + items: + type: object + example: urn:ietf:params:scim:api:messages:2.0:PatchOp + Operations: + type: array + items: + $ref: '#/components/schemas/OperationMeItem' + OperationMeItem: + type: object + properties: + op: + type: string + enum: + - add + - remove + - replace + value: + type: object + properties: + nickName: + type: string + example: shaggy + PatchOperationResponseOutput: + required: + - meta + type: object + properties: + meta: + type: object + properties: + created: + type: string + example: 2018-08-17T10:34:29Z + location: + type: string + example: https://api.asgardeo.io/t/{org-name}/scim2/Users/008bba85-451d-414b-87de-c03b5a1f4217 + lastModified: + type: string + example: 2018-08-17T10:34:29Z + resourceType: + type: string + example: User + schemas: + type: array + items: + type: string + example: "" + username: + type: string + example: kim + id: + type: string + example: 008bba85-451d-414b-87de-c03b5a1f4217 + name: + type: object + properties: + givenName: + type: string + example: Kim + familyName: + type: string + example: Berry + emails: + type: array + example: + - kim@gmail.com + items: + type: object + properties: {} + urn:ietf:params:scim:schemas:extension:enterprise:2.0:User: + type: object + properties: + manager: + type: object + properties: + value: + type: string + example: Taylor + roles: + type: array + items: + type: object + properties: + $ref: + type: string + example: https://api.asgardeo.io/t/{org-name}/scim2/Roles/4645709c-ea8c-4495-8590-e1fa0efe3de0 + display: + type: string + example: loginRole + value: + type: string + example: 4645709c-ea8c-4495-8590-e1fa0efe3de0 + nickName: + type: string + example: shaggy + UserObjectListResponseObject: + type: object + properties: + totalResults: + type: integer + example: 1 + startIndex: + type: integer + example: 1 + itemsPerPage: + type: integer + example: 1 + schemas: + type: object + properties: {} + example: + - urn:ietf:params:scim:api:messages:2.0:ListResponse + Resources: + type: array + items: + $ref: '#/components/schemas/UserResponseObject' + UserSearchRequestObject: + type: object + example: + schemas: + - urn:ietf:params:scim:api:messages:2.0:SearchRequest + attributes: + - name.familyName + - userName + filter: userName sw ki and name.familyName co err + domain: DEFAULT + startIndex: 1 + count: 10 + SPConfigResponse: + type: object + example: + patch: + supported: true + filter: + maxResults: 200 + supported: true + documentationUri: http://example.com/help/scim.html + authenticationSchemes: + - name: OAuth Bearer Token + description: Authentication scheme using the OAuth Bearer Token Standard + specUri: http://www.rfc-editor.org/info/rfc6750 + type: oauthbearertoken + primary: true + - name: HTTP Basic + description: Authentication scheme using the HTTP Basic Standard + specUri: http://www.rfc-editor.org/info/rfc2617 + type: httpbasic + primary: false + schemas: + - urn:ietf:params:scim:schemas:core:2.0:ServiceProviderConfig + etag: + supported: false + sort: + supported: false + bulk: + maxPayloadSize: 1048576 + maxOperations: 1000 + supported: true + changePassword: + supported: false + ErrorInvalidInput: + required: + - detail + - status + type: object + properties: + status: + type: string + example: "400" + schemas: + type: string + example: urn:ietf:params:scim:api:messages:2.0:Error + scimType: + type: string + example: invalidSyntax + detail: + type: string + example: Request is unparsable, syntactically incorrect, or violates schema. + ErrorUnauthorized: + required: + - status + type: object + properties: + schemas: + type: string + example: urn:ietf:params:scim:api:messages:2.0:Error + detail: + type: string + example: "Authorization failure. Authorization information was invalid or missing from your request." + status: + type: string + example: "401" + ErrorNotAcceptable: + required: + - status + type: object + properties: + status: + type: string + example: "406" + schemas: + type: string + example: urn:ietf:params:scim:api:messages:2.0:Error + scimType: + type: string + example: Not Acceptable + ErrorForbidden: + required: + - status + type: object + properties: + schemas: + type: string + example: urn:ietf:params:scim:api:messages:2.0:Error + detail: + type: string + example: "Operation is not permitted. You do not have permission to make this request." + status: + type: string + example: "403" + ErrorUserNotAvailable: + required: + - detail + - status + type: object + properties: + status: + type: string + example: "404" + schemas: + type: string + example: urn:ietf:params:scim:api:messages:2.0:Error + detail: + type: string + example: 'No user with the id : 008bba85-451d-414b-87de-c03b5a1f4217 in + the user store.' + ErrorSchemaNotFound: + required: + - detail + - status + type: object + properties: + status: + type: string + example: "404" + schemas: + type: string + example: urn:ietf:params:scim:api:messages:2.0:Error + detail: + type: string + example: Schema not found. + ErrorInternalServerError: + required: + - detail + - status + type: object + properties: + status: + type: string + example: "500" + schemas: + type: string + example: urn:ietf:params:scim:api:messages:2.0:Error + detail: + type: string + example: Internal Server Error. + securitySchemes: + OAuth2: + type: oauth2 + description: "You can use the following OAuth grant types to securely access the respective API endpoints. + \n\n **Authorization Code OAuth Flow** + \n\n Authorization URL: 'https://api.asgardeo.io/t/{org-name}/oauth2/authorize' + \n\n This flow type is used for the `me` endpoint of SCIM2 APIs. You can use the following scope for this endpoints. + \n\n - ```internal_login```: Grant permission for an authenticated user for self management. + \n\n**Client Credentials OAuth Flow** + \n\n Token URL: https://api.asgardeo.io/t/{org-name}/oauth2/token + \n\n This flow type is used for the following endpoints: + \n\n - `users` endpoint + \n\n - `group` endpoint + \n\n - `bulk` endpoint + \n\n - `resource type` endpoint + \n\n - `service provider config` endpoint + \n\n You can use the following scopes for each of the endpoints. + \n\n - ```internal_user_mgt_list```: Grant permissions to read user records. + \n\n - ```internal_user_mgt_create```: Grant permissions to create new users. + \n\n - ```internal_user_mgt_update```: Grant permissions to update existing users. + \n\n - ```internal_user_mgt_delete```: Grant permissions to delete users. + \n\n - ```internal_group_mgt_view```: Grant permissions to read group records. + \n\n - ```internal_group_mgt_create```: Grant permissions to create new group records. + \n\n - ```internal_group_mgt_update```: Grant permissions to update existing group records. + \n\n - ```internal_group_mgt_delete```: Grant permissions to delete group records." diff --git a/docusaurus-asgardeo/static/apis/restapis/scim2-resource-types.yaml b/docusaurus-asgardeo/static/apis/restapis/scim2-resource-types.yaml new file mode 100644 index 0000000000..e8a6ba643c --- /dev/null +++ b/docusaurus-asgardeo/static/apis/restapis/scim2-resource-types.yaml @@ -0,0 +1,125 @@ +openapi: 3.0.1 +info: + title: SCIM 2.0 Resource Types Retrieval API + description: | + This document specifies **SCIM 2.0 Resource types RESTful API** for **Asgardeo**. + version: "v1" +servers: + - url: 'https://api.asgardeo.io/t/{organization-name}/scim2' +tags: + - name: Resource Types Endpoint + description: This API lists and returns metadata about resource types. +paths: + /ResourceTypes: + get: + tags: + - Resource Types Endpoint + summary: Get Resource Types + description: "This API lists and returns metadata about resource types.\n\n + No Scope(Permission) required." + operationId: getResourceType + responses: + 200: + description: Schema is found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ResourceTypeResponse' + 401: + description: Unauthorized + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUnauthorized' + 404: + description: Schema not found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorSchemaNotFound' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/scim2/ResourceTypes' \ + -H 'accept: application/scim+json' \ + -H 'Authorization: Bearer {bearer_token}' +components: + schemas: + ResourceTypeResponse: + type: object + properties: + schemas: + type: array + items: + type: string + example: urn:ietf:params:scim:schemas:core:2.0:ResourceType + resourceType: + type: array + items: + $ref: '#/components/schemas/UserObResourceType' + UserObResourceType: + type: object + properties: + schema: + type: string + example: urn:ietf:params:scim:schemas:core:2.0:User + endpoint: + type: string + example: /Users + meta: + type: object + properties: + location: + type: string + example: https://api.asgardeo.io/t/{org-name}/scim2/ResourceType/User + resourceType: + type: string + example: ResourceType + name: + type: string + example: User + description: + type: string + example: User Account + schemaExtensions: + type: object + properties: + schema: + type: string + example: urn:ietf:params:scim:schemas:extension:enterprise:2.0:User + required: + type: boolean + example: false + id: + type: string + example: User + ErrorUnauthorized: + required: + - status + type: object + properties: + schemas: + type: string + example: urn:ietf:params:scim:api:messages:2.0:Error + detail: + type: string + example: "Authorization failure. Authorization information was invalid or missing from your request." + status: + type: string + example: "401" + ErrorSchemaNotFound: + required: + - detail + - status + type: object + properties: + status: + type: string + example: "404" + schemas: + type: string + example: urn:ietf:params:scim:api:messages:2.0:Error + detail: + type: string + example: Schema not found. diff --git a/docusaurus-asgardeo/static/apis/restapis/scim2-schemas.yaml b/docusaurus-asgardeo/static/apis/restapis/scim2-schemas.yaml new file mode 100644 index 0000000000..058cdabf15 --- /dev/null +++ b/docusaurus-asgardeo/static/apis/restapis/scim2-schemas.yaml @@ -0,0 +1,356 @@ +openapi: 3.0.1 +info: + title: SCIM 2.0 Schemas Retrieval API + description: | + This document specifies **SCIM 2.0 Schemas RESTful API** for **Asgardeo**. + version: "v1" +servers: + - url: 'https://api.asgardeo.io/t/{organization-name}/scim2' +tags: + - name: Schemas Endpoint + description: This API lists and returns metadata about SCIM 2.0 schemas. +paths: + /Schemas: + get: + tags: + - Schemas Endpoint + summary: Get All Schemas + description: "This API returns all supported SCIM 2.0 schema definitions.\n\n + No additional scopes or permissions required. Authentication is required." + operationId: getSchemas + responses: + 200: + description: Schemas are found + content: + application/scim+json: + schema: + type: array + items: + $ref: '#/components/schemas/SchemaObject' + 401: + description: Unauthorized + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUnauthorized' + 404: + description: Schema not found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorSchemaNotFound' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/scim2/Schemas' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + + '/Schemas/{id}': + get: + tags: + - Schemas Endpoint + summary: Get Schema by ID + description: "This API returns the SCIM 2.0 schema definition identified by the given id.\n\n + No additional scopes or permissions required. Authentication is required." + operationId: getSchemaById + parameters: + - name: id + in: path + description: Unique ID of the schema (e.g., urn:ietf:params:scim:schemas:core:2.0:User). + required: true + schema: + type: string + responses: + 200: + description: Schema is found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/SchemaObject' + 401: + description: Unauthorized + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUnauthorized' + 404: + description: Schema not found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorSchemaNotFound' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/scim2/Schemas/{id}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + +components: + schemas: + SchemaObject: + type: object + properties: + name: + type: string + description: The name of the schema. + example: "User" + description: + type: string + description: The description of the schema. + example: "User Account" + attributes: + type: array + description: The list of attributes defined in the schema. + items: + $ref: '#/components/schemas/SchemaAttribute' + id: + type: string + description: The unique URI of the schema. + example: "urn:ietf:params:scim:schemas:core:2.0:User" + + SchemaAttribute: + type: object + properties: + name: + type: string + description: The attribute's name. + example: "userName" + type: + type: string + description: The attribute's data type. + enum: + - STRING + - COMPLEX + - BOOLEAN + - DECIMAL + - INTEGER + - DATE_TIME + - DATE + - BINARY + - REFERENCE + example: "STRING" + multiValued: + type: boolean + description: Whether the attribute is multi-valued. + example: false + description: + type: string + description: The attribute's human-readable description. + example: "Username" + required: + type: boolean + description: Whether the attribute is required. + example: false + caseExact: + type: boolean + description: Whether the string attribute is case sensitive. + example: false + mutability: + type: string + description: Indicates whether the attribute is mutable. + enum: + - READ_ONLY + - READ_WRITE + - IMMUTABLE + - WRITE_ONLY + example: "READ_WRITE" + returned: + type: string + description: Indicates when an attribute is returned in a response. + enum: + - ALWAYS + - NEVER + - DEFAULT + - REQUEST + example: "DEFAULT" + uniqueness: + type: string + description: Indicates how unique a value must be. + enum: + - NONE + example: "NONE" + displayName: + type: string + description: The display name of the attribute. + example: "Username" + displayOrder: + type: integer + description: The display order of the attribute. + example: 1 + supportedByDefault: + type: boolean + description: Whether the attribute is supported by default. + example: true + sharedProfileValueResolvingMethod: + type: string + description: The method used to resolve shared profile values. + example: "FromOrigin" + regEx: + type: string + description: The regular expression for validating the attribute value. + example: "^([a-zA-Z0-9_\\.\\-])+\\@(([a-zA-Z0-9\\-])+\\.)+([a-zA-Z0-9]{2,10})+$" + subAttributes: + type: array + description: The sub-attributes of a COMPLEX attribute. + items: + $ref: '#/components/schemas/SchemaSubAttribute' + profiles: + type: object + description: Profile-specific configurations for the attribute. + properties: + console: + type: object + properties: + supportedByDefault: + type: boolean + example: true + inputFormat: + type: object + description: The input format configuration for the attribute. + properties: + inputType: + type: string + example: "text_input" + excludedUserStores: + type: string + description: Comma-separated list of excluded user stores. + example: "" + + SchemaSubAttribute: + type: object + properties: + name: + type: string + description: The sub-attribute's name. + example: "familyName" + type: + type: string + description: The sub-attribute's data type. + enum: + - STRING + - COMPLEX + - BOOLEAN + - DECIMAL + - INTEGER + - DATE_TIME + - DATE + - BINARY + - REFERENCE + example: "STRING" + multiValued: + type: boolean + description: Whether the sub-attribute is multi-valued. + example: false + description: + type: string + description: The sub-attribute's human-readable description. + example: "Last Name" + required: + type: boolean + description: Whether the sub-attribute is required. + example: false + caseExact: + type: boolean + description: Whether the string sub-attribute is case sensitive. + example: false + mutability: + type: string + description: Indicates whether the sub-attribute is mutable. + enum: + - READ_ONLY + - READ_WRITE + - IMMUTABLE + - WRITE_ONLY + example: "READ_WRITE" + returned: + type: string + description: Indicates when a sub-attribute is returned in a response. + enum: + - ALWAYS + - NEVER + - DEFAULT + - REQUEST + example: "DEFAULT" + uniqueness: + type: string + description: Indicates how unique a value must be. + enum: + - NONE + example: "NONE" + displayName: + type: string + description: The display name of the sub-attribute. + example: "Last Name" + displayOrder: + type: integer + description: The display order of the sub-attribute. + example: 3 + supportedByDefault: + type: boolean + description: Whether the sub-attribute is supported by default. + example: true + sharedProfileValueResolvingMethod: + type: string + description: The method used to resolve shared profile values. + example: "FromOrigin" + regEx: + type: string + description: The regular expression for validating the sub-attribute value. + profiles: + type: object + description: Profile-specific configurations for the sub-attribute. + properties: + console: + type: object + properties: + supportedByDefault: + type: boolean + example: true + inputFormat: + type: object + description: The input format configuration for the sub-attribute. + properties: + inputType: + type: string + example: "text_input" + excludedUserStores: + type: string + description: Comma-separated list of excluded user stores. + example: "" + + ErrorUnauthorized: + required: + - status + - schemas + type: object + properties: + schemas: + type: string + example: urn:ietf:params:scim:api:messages:2.0:Error + detail: + type: string + example: "Authorization failure. Authorization information was invalid or missing from your request." + status: + type: string + example: "401" + + ErrorSchemaNotFound: + required: + - detail + - status + - schemas + type: object + properties: + status: + type: string + example: "404" + schemas: + type: string + example: urn:ietf:params:scim:api:messages:2.0:Error + detail: + type: string + example: Schema not found. diff --git a/docusaurus-asgardeo/static/apis/restapis/scim2-sp-configs.yaml b/docusaurus-asgardeo/static/apis/restapis/scim2-sp-configs.yaml new file mode 100644 index 0000000000..2f9619dae5 --- /dev/null +++ b/docusaurus-asgardeo/static/apis/restapis/scim2-sp-configs.yaml @@ -0,0 +1,106 @@ +openapi: 3.0.1 +info: + title: Asgardeo - SCIM 2.0 Service Provider Configs API + description: | + This document specifies **SCIM 2.0 Service provider configuration RESTful API** for **Asgardeo**. + version: "v1" +servers: + - url: 'https://api.asgardeo.io/t/{organization-name}/scim2' +paths: + /ServiceProviderConfig: + get: + tags: + - Service Provider Config Endpoint + summary: Get Service Provider Config + description: "This API returns the service provider's configuration details.\n\n + No Scope(Permission) required." + operationId: getServiceProviderConfig + responses: + 200: + description: Schema is found + content: + application/json: + schema: + $ref: '#/components/schemas/SPConfigResponse' + 401: + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorUnauthorized' + 404: + description: Schema not found + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorSchemaNotFound' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/scim2/ServiceProviderConfig' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' +components: + schemas: + SPConfigResponse: + type: object + example: + patch: + supported: true + filter: + maxResults: 200 + supported: true + documentationUri: http://example.com/help/scim.html + authenticationSchemes: + - name: OAuth Bearer Token + description: Authentication scheme using the OAuth Bearer Token Standard + specUri: http://www.rfc-editor.org/info/rfc6750 + type: oauthbearertoken + primary: true + - name: HTTP Basic + description: Authentication scheme using the HTTP Basic Standard + specUri: http://www.rfc-editor.org/info/rfc2617 + type: httpbasic + primary: false + schemas: + - urn:ietf:params:scim:schemas:core:2.0:ServiceProviderConfig + etag: + supported: false + sort: + supported: false + bulk: + maxPayloadSize: 1048576 + maxOperations: 1000 + supported: true + changePassword: + supported: false + ErrorUnauthorized: + required: + - status + type: object + properties: + schemas: + type: string + example: urn:ietf:params:scim:api:messages:2.0:Error + detail: + type: string + example: "Authorization failure. Authorization information was invalid or missing from your request." + status: + type: string + example: "401" + ErrorSchemaNotFound: + required: + - detail + - status + type: object + properties: + status: + type: string + example: "404" + schemas: + type: string + example: urn:ietf:params:scim:api:messages:2.0:Error + detail: + type: string + example: Schema not found. diff --git a/docusaurus-asgardeo/static/apis/restapis/scim2-users.yaml b/docusaurus-asgardeo/static/apis/restapis/scim2-users.yaml new file mode 100644 index 0000000000..3fff9df7d3 --- /dev/null +++ b/docusaurus-asgardeo/static/apis/restapis/scim2-users.yaml @@ -0,0 +1,852 @@ +openapi: 3.0.1 +info: + title: Asgardeo - SCIM 2.0 Users API + description: | + This document specifies **SCIM 2.0 User Management RESTful API** for **Asgardeo**. This endpoint performs actions related to all users in the organization. To access the SCIM 2.0 APIs in Asgardeo, you need to first [get an access token](https://wso2.com/asgardeo/docs/apis/authentication/#get-an-access-token) from your organization. + version: "v1" +servers: + - url: 'https://api.asgardeo.io/t/{organization-name}/scim2' +paths: + /Users: + get: + tags: + - Users Endpoint + summary: Filter Users + description: "This API returns users according to the filter, sort and pagination parameters. Pagination is not supported across user stores and LDAP multi-attribute group filtering. However, filtering is supported across multiple user stores.\n\n + - Scope(Permission) required: ``internal_user_mgt_list``\n\n + - Flow type: Client Credentials OAuth Flow" + operationId: getUser + parameters: + - name: attributes + in: query + description: SCIM defined attributes parameter. + schema: + type: string + - name: excludedAttributes + in: query + description: SCIM defined excludedAttribute parameter. + schema: + type: string + - name: filter + in: query + description: The expression used for filtering. Supported filters are ‘Ew’, ‘Eq’, ‘Co’, ‘Sw’, ‘Ne’ and ‘and’. + schema: + type: string + - name: startIndex + in: query + description: The 1-based index of the first query result + schema: + type: integer + format: int32 + - name: count + in: query + description: Specifies the desired maximum number of query results per page. + schema: + type: integer + format: int32 + - name: domain + in: query + description: The name of the user store where filtering needs to be applied. + schema: + type: string + responses: + 200: + description: Valid users are found / Valid users are not found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/UserObjectListResponseObject' + 401: + description: Unauthorized + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUnauthorized' + 403: + description: Forbidden + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorForbidden' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/scim2/Users' \ + -H 'accept: application/scim+json' \ + -H 'Authorization: Bearer {bearer_token}' + post: + tags: + - Users Endpoint + summary: Create User + description: "This API creates a user and returns the user details along with\ + \ the user's unique ID.\n\n\ + You can create a user in two ways:\n\ + 1. **Set a password for the user**: Include the `password` parameter in the request body to set an initial password for the user.\n\ + 2. **Invite the user to set their own password**: Set the `askPassword` parameter to `true` in the `urn:scim:wso2:schema` extension. An email will be sent to the user with instructions to set their password and confirm their account.\n\n + \nScope(Permission) required:`internal_user_mgt_create`\n \n" + operationId: createUser + parameters: + - name: attributes + in: query + description: SCIM defined attributes parameter. + schema: + type: string + - name: excludedAttributes + in: query + description: SCIM defined excludedAttribute parameter. + schema: + type: string + requestBody: + content: + application/scim+json: + schema: + oneOf: + - $ref: '#/components/schemas/UserObject' + - $ref: '#/components/schemas/UserObjectPassInvite' + required: false + responses: + 201: + description: User is created. + content: + application/scim+json: + schema: + $ref: '#/components/schemas/UserResponseObject' + 400: + description: Invalid Input + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorInvalidInput' + 401: + description: Unauthorized + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUnauthorized' + 403: + description: Forbidden + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorForbidden' + 500: + description: Internal Server Error + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorInternalServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{organization-name}/scim2/Users' \ + -H 'accept: application/scim+json' \ + -H 'Content-Type: application/scim+json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "schemas": [], + "name": { + "givenName": "Kim", + "familyName": "Berry" + }, + "userName": "DEFAULT/kim@gmail.com", + "password": "aBcd!23#", + "emails": [ + { + "value": "kim@gmail.com", + "primary": true + } + ], + "urn:ietf:params:scim:schemas:extension:enterprise:2.0:User": { + "manager": { + "value": "Taylor" + } + }, + "urn:scim:wso2:schema": { + "verifyEmail": true + } + }' + x-codegen-request-body-name: body + /Users/.search: + post: + tags: + - Users Endpoint + summary: Search Users + description: "This API returns users according to the filter, sort and pagination parameters.\n\n + - Scope(Permission) required: ``internal_user_mgt_list``\n\n + - Flow type: Client Credentials OAuth Flow" + operationId: getUsersByPost + requestBody: + content: + application/scim+json: + schema: + $ref: '#/components/schemas/UserSearchRequestObject' + required: false + responses: + 200: + description: Valid users are found / Valid users are not found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/UserObjectListResponseObject' + 401: + description: Unauthorized + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUnauthorized' + 403: + description: Forbidden + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorForbidden' + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{organization-name}/scim2/Users/.search' \ + -H 'accept: application/scim+json' \ + -H 'Content-Type: application/scim+json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "schemas": [ + "urn:ietf:params:scim:api:messages:2.0:SearchRequest" + ], + "attributes": [ + "name.familyName", + "userName" + ], + "filter": "userName sw ki and name.familyName co err", + "domain": "PRIMARY", + "startIndex": 1, + "count": 10 + }' + x-codegen-request-body-name: body + /Users/{id}: + get: + tags: + - Users Endpoint + summary: Get User by ID + description: "Return user details if a user found.\n\n + - Scope(Permission) required: ``internal_user_mgt_view``\n\n + - Flow type: Client Credentials OAuth Flow" + operationId: getUser by id + parameters: + - name: id + in: path + description: Unique ID of the resource type. + required: true + schema: + type: string + - name: attributes + in: query + description: SCIM defined attributes parameter. + schema: + type: string + - name: excludedAttributes + in: query + description: SCIM defined excludedAttribute parameter. + schema: + type: string + responses: + 200: + description: Valid user is found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/UserResponseObject' + 401: + description: Unauthorized + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUnauthorized' + 403: + description: Forbidden + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorForbidden' + 404: + description: Valid user is not found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUserNotAvailable' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/scim2/Users/{user-id}' \ + -H 'accept: application/scim+json' \ + -H 'Authorization: Bearer {bearer_token}' + put: + tags: + - Users Endpoint + summary: Update User - PUT + description: "This API updates user details and return the updated user details using a PUT operation.\n\n + - Scope(Permission) required: ``internal_user_mgt_update``\n\n + - Flow type: Client Credentials OAuth Flow" + operationId: updateUser + parameters: + - name: id + in: path + description: Unique ID of the resource type. + required: true + schema: + type: string + - name: attributes + in: query + description: SCIM defined attributes parameter. + schema: + type: string + - name: excludedAttributes + in: query + description: SCIM defined excludedAttribute parameter. + schema: + type: string + requestBody: + content: + application/scim+json: + schema: + $ref: '#/components/schemas/UserUpdateObject' + required: false + responses: + 200: + description: Valid user is found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/UserResponseObject' + 401: + description: Unauthorized + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUnauthorized' + 403: + description: Forbidden + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorForbidden' + 404: + description: Valid user is not found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUserNotAvailable' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PUT' \ + 'https://api.asgardeo.io/t/{organization-name}/scim2/Users/{user-id}' \ + -H 'accept: application/scim+json' \ + -H 'Content-Type: application/scim+json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "schemas": [], + "name": { + "givenName": "Kim", + "familyName": "Berry" + }, + "userName": "DEFAULT/kim@gmail.com", + "emails": [ + { + "value": "kim@gmail.com", + "primary": true + } + ], + "urn:ietf:params:scim:schemas:extension:enterprise:2.0:User": { + "manager": { + "value": "Taylor" + } + } + }' + x-codegen-request-body-name: body + delete: + tags: + - Users Endpoint + summary: Delete User by ID + description: "This API deletes a user using the user's unique ID.\n\n + - Scope(Permission) required: ``internal_user_mgt_delete``\n\n + - Flow type: Client Credentials OAuth Flow" + operationId: deleteUser + parameters: + - name: id + in: path + description: Unique ID of the user that you want to delete. + required: true + schema: + type: string + responses: + 204: + description: User is deleted + content: {} + 401: + description: Unauthorized + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUnauthorized' + 403: + description: Forbidden + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorForbidden' + 404: + description: Valid user is not found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUserNotAvailable' + x-codeSamples: + - lang: Curl + source: | + curl -X 'DELETE' \ + 'https://api.asgardeo.io/t/{organization-name}/scim2/Users/{user-id}' \ + -H 'accept: */*' \ + -H 'Authorization: Bearer {bearer_token}' + patch: + tags: + - Users Endpoint + summary: Update User - PATCH + description: "This API updates user details and returns the updated user details using a PATCH operation.\n\n + - Scope(Permission) required: ``internal_user_mgt_update``\n\n + - Supported Operations:``add``, ``replace``, ``remove``\n\n + - Flow type: Client Credentials OAuth Flow" + operationId: patchUser + parameters: + - name: id + in: path + description: Unique id of the resource type. + required: true + schema: + type: string + - name: attributes + in: query + description: SCIM defined attributes parameter. + schema: + type: string + - name: excludedAttributes + in: query + description: SCIM defined excludedAttribute parameter. + schema: + type: string + requestBody: + content: + application/scim+json: + schema: + $ref: '#/components/schemas/PatchOperationInput' + required: false + responses: + 200: + description: Valid user is found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/UserResponseObject' + 401: + description: Unauthorized + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUnauthorized' + 403: + description: Forbidden + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorForbidden' + 404: + description: Valid user is not found + content: + application/scim+json: + schema: + $ref: '#/components/schemas/ErrorUserNotAvailable' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PATCH' \ + 'https://api.asgardeo.io/t/{organization-name}/scim2/Users/{user-id}' \ + -H 'accept: application/scim+json' \ + -H 'Content-Type: application/scim+json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "schemas": [ + "urn:ietf:params:scim:api:messages:2.0:PatchOp" + ], + "Operations": [ + { + "op": "add", + "value": { + "nickName": "shaggy" + } + } + ] + }' + x-codegen-request-body-name: body +components: + schemas: + UserObject: + title: Set a password for the user + required: + - password + type: object + properties: + schemas: + type: object + properties: {} + example: [] + name: + type: object + properties: + givenName: + type: string + description: The `givenName` you specify will be entered for the First Name attribute in the user's profile. + example: Kim + familyName: + type: string + description: The `familyName` you specify will be entered for the Last Name attribute in the user's profile. + example: Berry + userName: + type: string + description: By default, the username should be the email address and it will be stored in the `DEFAULT` user store. However, if username validation is changed to `Alphanumeric` in your Asgardeo organization, you need to specify an alphanumeric value (a-z, A-Z, 0-9) as the username instead of the email. + example: DEFAULT/kim@gmail.com + password: + type: string + description: Use this parameter to set a password for the user account. The user will be able to reset this password later. When setting the password, be sure to follow the password-validation rules configured for your organization. + example: aBcd!23# + emails: + type: array + description: This email will be entered for the Email attribute in the user's profile. + example: + - value: kim@gmail.com + primary: true + items: + type: object + properties: {} + urn:ietf:params:scim:schemas:extension:enterprise:2.0:User: + type: object + properties: + manager: + type: object + properties: + value: + type: string + example: Taylor + urn:scim:wso2:schema: + type: object + properties: + verifyEmail: + type: boolean + description: When the administrator sets the password for the new user account, this parameter specifies if the new user should confirm the new account through email. If this parameter is set to `true`, an email is sent to the user's email address requesting confirmation. + example: true + UserObjectPassInvite: + title: Invite the user to set their own password + type: object + properties: + schemas: + type: object + properties: {} + example: [] + name: + type: object + properties: + givenName: + type: string + description: The `givenName` you specify will be entered for the First Name attribute in the user's profile. + example: Kim + familyName: + type: string + description: The `familyName` you specify will be entered for the Last Name attribute in the user's profile. + example: Berry + userName: + type: string + description: By default, the username should be the email address and it will be stored in the `DEFAULT` user store. However, if username validation is changed to `Alphanumeric` in your Asgardeo organization, you need to specify an alphanumeric value (a-z, A-Z, 0-9) as the username instead of the email. + example: DEFAULT/kim@gmail.com + emails: + type: array + description: This email will be entered for the Email attribute in the user's profile. + example: + - value: kim@gmail.com + primary: true + items: + type: object + properties: {} + urn:ietf:params:scim:schemas:extension:enterprise:2.0:User: + type: object + properties: + manager: + type: object + properties: + value: + type: string + example: Taylor + urn:scim:wso2:schema: + type: object + required: + - askPassword + properties: + askPassword: + type: boolean + description: If this parameter is set to `true`, users will be allowed configure their own password. An email is sent to the specified email address, which will have instructions for the user to set the password and confirm the new user account. + example: true + UserResponseObject: + required: + - meta + type: object + properties: + meta: + type: object + properties: + created: + type: string + example: 2018-08-17T10:34:29Z + location: + type: string + example: https://api.asgardeo.io/t/{org-name}/scim2/Users/008bba85-451d-414b-87de-c03b5a1f4217 + lastModified: + type: string + example: 2018-08-17T10:34:29Z + resourceType: + type: string + example: User + schemas: + type: object + properties: {} + example: + - urn:ietf:params:scim:schemas:core:2.0:User + - urn:ietf:params:scim:schemas:extension:enterprise:2.0:User + username: + type: string + example: DEFAULT/kim@gmail.com + id: + type: string + example: 008bba85-451d-414b-87de-c03b5a1f4217 + name: + type: object + properties: + givenName: + type: string + example: Kim + familyName: + type: string + example: Berry + emails: + type: array + example: + - kim@gmail.com + items: + type: object + properties: {} + urn:ietf:params:scim:schemas:extension:enterprise:2.0:User: + type: object + properties: + manager: + type: object + properties: + value: + type: string + example: Taylor + roles: + type: object + properties: {} + example: + - type: default + value: Internal/everyone + UserObjectListResponseObject: + type: object + properties: + totalResults: + type: integer + example: 1 + startIndex: + type: integer + example: 1 + itemsPerPage: + type: integer + example: 1 + schemas: + type: object + properties: {} + example: + - urn:ietf:params:scim:api:messages:2.0:ListResponse + Resources: + type: array + items: + $ref: '#/components/schemas/UserResponseObject' + UserSearchRequestObject: + type: object + properties: + schemas: + type: array + example: + - urn:ietf:params:scim:api:messages:2.0:SearchRequest + attributes: + type: array + description: SCIM defined attributes parameter. + example: + - name.familyName + - userName + filter: + type: string + description: The expression used for filtering. Supported filters are ew, eq, co, sw, and and. + example: userName sw ki and name.familyName co err + domain: + type: string + description: The name of the user store where filtering needs to be applied. + example: DEFAULT + startIndex: + type: integer + format: int32 + description: The 1-based index of the first query result + example: 1 + count: + type: integer + format: int32 + description: Specifies the desired maximum number of query results per page.
      (For organizations created on or after November 19, 2024, a threshold value of 100 will be applied to the count parameter. To fetch more users, use pagination.) + example: 10 + UserUpdateObject: + type: object + properties: + schemas: + type: object + properties: {} + example: [] + name: + type: object + properties: + givenName: + type: string + example: Kim + familyName: + type: string + example: Berry + userName: + type: string + example: DEFAULT/kim@gmail.com + emails: + type: array + example: + - value: kim@gmail.com + primary: true + items: + type: object + properties: {} + urn:ietf:params:scim:schemas:extension:enterprise:2.0:User: + type: object + properties: + manager: + type: object + properties: + value: + type: string + example: Taylor + PatchOperationInput: + type: object + properties: + schemas: + type: array + items: + type: object + example: urn:ietf:params:scim:api:messages:2.0:PatchOp + Operations: + type: array + items: + $ref: '#/components/schemas/OperationMeItem' + OperationMeItem: + type: object + properties: + op: + type: string + enum: + - add + - remove + - replace + value: + type: object + properties: + nickName: + type: string + example: shaggy + ErrorUnauthorized: + required: + - status + type: object + properties: + schemas: + type: string + example: urn:ietf:params:scim:api:messages:2.0:Error + detail: + type: string + example: "Authorization failure. Authorization information was invalid or missing from your request." + status: + type: string + example: "401" + ErrorForbidden: + required: + - status + type: object + properties: + schemas: + type: string + example: urn:ietf:params:scim:api:messages:2.0:Error + detail: + type: string + example: "Operation is not permitted. You do not have permission to make this request." + status: + type: string + example: "403" + ErrorInvalidInput: + required: + - detail + - status + type: object + properties: + status: + type: string + example: "400" + schemas: + type: string + example: urn:ietf:params:scim:api:messages:2.0:Error + scimType: + type: string + example: invalidSyntax + detail: + type: string + example: Request is unparsable, syntactically incorrect, or violates schema. + ErrorInternalServerError: + required: + - detail + - status + type: object + properties: + status: + type: string + example: "500" + schemas: + type: string + example: urn:ietf:params:scim:api:messages:2.0:Error + detail: + type: string + example: Internal Server Error. + ErrorUserNotAvailable: + required: + - detail + - status + type: object + properties: + status: + type: string + example: "404" + schemas: + type: string + example: urn:ietf:params:scim:api:messages:2.0:Error + detail: + type: string + example: 'No user with the id : 008bba85-451d-414b-87de-c03b5a1f4217 in + the user store.' \ No newline at end of file diff --git a/docusaurus-asgardeo/static/apis/restapis/session.yaml b/docusaurus-asgardeo/static/apis/restapis/session.yaml new file mode 100644 index 0000000000..a5069c00cb --- /dev/null +++ b/docusaurus-asgardeo/static/apis/restapis/session.yaml @@ -0,0 +1,467 @@ +openapi: 3.0.1 +info: + title: Asgardeo - User Session Management API + description: "This is the RESTful API for managing user sessions in Asgardeo. + \n To access the session management APIs in Asgardeo, you need to first [get an access token](https://wso2.com/asgardeo/docs/apis/authentication/#get-an-access-token) from your organization." + version: v1 +servers: +- url: https://api.asgardeo.io/t/{organization-name}/api/users/v1 +security: +- OAuth2: [] +tags: +- name: me + description: Session management operations for the authenticated user. +- name: admin + description: | + Operations available for privileged users, to be invoked on behalf of another user. +paths: + /me/sessions: + get: + tags: + - me + summary: Get active sessions + description: "A user can have multiple active sessions. This endpoint is used to retrieve information of all the active sessions of the authenticated user.\n\n + Scope required:``internal_login``" + operationId: getSessionsOfLoggedInUser + responses: + 200: + description: Successfully retrieved session information + content: + application/json: + schema: + $ref: '#/components/schemas/Sessions' + example: + userId: 81fae417-13f6-4db6-9501-7ce128608cb5 + sessions: + - applications: + - id: 298c5fd8-01ac-4ada-bc10-1ce37f32140b + subject: admin + appName: travelocity-requestpath + appId: "4" + - id: 27385fd8-01ac-4ada-bc10-1ce37363h40b + subject: admin + appName: avis-basic + appId: "5" + userAgent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:15.0) Gecko/20100101 + Firefox/15.0.1 + ip: 127.0.0.1 + loginTime: "1565586399249" + lastAccessTime: "1565586435955" + id: 30e775bcc2c858ff88584b38b017d6c703a6657f38320804a071ff82fce1a0fe + 401: + description: Unauthorized + content: {} + 403: + description: Resource Forbidden + content: {} + 404: + description: Resource Not Found + content: {} + 500: + description: Internal Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/users/v1/me/sessions' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + delete: + tags: + - me + summary: Terminate all sessions + description: "A user has multiple active sessions. This endpoint is used to terminate all the active sessions of the authenticated user.\n\n + Scope required: ``internal_login``" + operationId: terminateSessionsByLoggedInUser + responses: + 204: + description: No Content + content: {} + 400: + description: Invalid input request + content: + '*/*': + schema: + $ref: '#/components/schemas/Error' + 401: + description: Unauthorized + content: {} + 403: + description: Resource Forbidden + content: {} + 500: + description: Internal Server Error + content: + '*/*': + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'DELETE' \ + 'https://api.asgardeo.io/t/{organization-name}/api/users/v1/me/sessions' \ + -H 'accept: */*' \ + -H 'Authorization: Bearer {bearer_token}' + /me/sessions/{session-id}: + delete: + tags: + - me + summary: Terminate a session + description: "A user has multiple active sessions. This API terminates a specific session of the authenticated user identified by the `session-id`.\n\n + Scope required: ``internal_login`` " + operationId: terminateSessionByLoggedInUser + parameters: + - name: session-id + in: path + description: ID of the session. + required: true + schema: + type: string + responses: + 204: + description: No Content + content: {} + 400: + description: Invalid input request + content: + '*/*': + schema: + $ref: '#/components/schemas/Error' + 401: + description: Unauthorized + content: {} + 403: + description: Resource Forbidden + content: {} + 500: + description: Internal Server Error + content: + '*/*': + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'DELETE' \ + 'https://api.asgardeo.io/t/{organization-name}/api/users/v1/me/sessions/{session-id}' \ + -H 'accept: */*' \ + -H 'Authorization: Bearer {bearer_token}' + /{user-id}/sessions: + get: + tags: + - admin + summary: Get active sessions + description: "Retrieves information related to the active sessions of a user + identified by the `user-id`. \n\n + Scope required: ``internal_session_view``" + operationId: getSessionsByUserId + parameters: + - name: user-id + in: path + description: ID of the user. + required: true + schema: + type: string + responses: + 200: + description: Successfully retrieved session information. + content: + application/json: + schema: + $ref: '#/components/schemas/Sessions' + 400: + description: Invalid input request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 401: + description: Unauthorized + content: {} + 403: + description: Resource Forbidden + content: {} + 404: + description: Resource Not Found + content: {} + 500: + description: Internal Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/users/v1/{user-id}/sessions' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + delete: + tags: + - admin + summary: Terminate all sessions + description: "Delete all the sessions of a user identified by the `user-id`.\n\n + Scope required: ``internal_session_delete``" + operationId: terminateSessionsByUserId + parameters: + - name: user-id + in: path + description: ID of the user. + required: true + schema: + type: string + responses: + 204: + description: No Content + content: {} + 400: + description: Invalid input request + content: + '*/*': + schema: + $ref: '#/components/schemas/Error' + 401: + description: Unauthorized + content: {} + 500: + description: Internal Server Error + content: + '*/*': + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'DELETE' \ + 'https://api.asgardeo.io/t/{organization-name}/api/users/v1/{user-id}/sessions' \ + -H 'accept: */*' \ + -H 'Authorization: Bearer {bearer_token}' + /{user-id}/sessions/{session-id}: + delete: + tags: + - admin + summary: Terminate a session + description: "Terminate a specific session of a user identified by the `session-id`.\n\n + Scope required: ``internal_session_delete`` " + operationId: terminateSessionBySessionId + parameters: + - name: user-id + in: path + description: ID of the user. + required: true + schema: + type: string + - name: session-id + in: path + description: ID of the session. + required: true + schema: + type: string + responses: + 204: + description: No Content + content: {} + 400: + description: Invalid input request + content: + '*/*': + schema: + $ref: '#/components/schemas/Error' + 401: + description: Unauthorized + content: {} + 500: + description: Internal Server Error + content: + '*/*': + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'DELETE' \ + 'https://api.asgardeo.io/t/{organization-name}/api/users/v1/{user-id}/sessions/{session-id}' \ + -H 'accept: */*' \ + -H 'Authorization: Bearer {bearer_token}' +components: + schemas: + Application: + required: + - appId + - appName + - id + - subject + type: object + properties: + id: + type: string + description: Unique ID of the application. + example: 298c5fd8-01ac-4ada-bc10-1ce37f32140b + subject: + type: string + description: Username of the logged in user for the application. + example: apiuser01 + appName: + type: string + description: Name of the application. + example: sampleApp + appId: + type: string + description: ID of the application. + example: "012" + Session: + type: object + properties: + applications: + type: array + description: List of applications in the session. + items: + $ref: '#/components/schemas/Application' + userAgent: + type: string + description: User agent of the session. + example: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:15.0) Gecko/20100101 + Firefox/15.0.1 + ip: + type: string + description: IP address of the session. + example: 172.95.192.63 + loginTime: + type: string + description: Login time of the session. + example: "1560412617" + lastAccessTime: + type: string + description: Last access time of the session. + example: "1560416196" + id: + type: string + description: ID of the session. + example: 8d9806d1-4efc-483e-a96a-a0fa77d4328b + Sessions: + type: object + properties: + userId: + type: string + example: "00000001" + sessions: + type: array + description: List of active sessions. + items: + $ref: '#/components/schemas/Session' + Error: + required: + - code + - message + type: object + properties: + code: + type: string + example: AAA-00000 + message: + type: string + example: Some Error Message + description: + type: string + example: Some Error Description + traceId: + type: string + example: e0fbcfeb-3617-43c4-8dd0-7b7d38e13047 + responses: + Forbidden: + description: Resource Forbidden + content: {} + InvalidInput: + description: Invalid input request + content: + '*/*': + schema: + $ref: '#/components/schemas/Error' + NoContent: + description: No Content + content: {} + NotFound: + description: Resource Not Found + content: {} + NotImplemented: + description: Not Implemented + content: + '*/*': + schema: + $ref: '#/components/schemas/Error' + OK: + description: OK + content: {} + ServerError: + description: Internal Server Error + content: + '*/*': + schema: + $ref: '#/components/schemas/Error' + Unauthorized: + description: Unauthorized + content: {} + parameters: + limitQueryParam: + name: limit + in: query + description: | + Maximum number of records to return. + _This parameter is not supported yet._ + schema: + type: integer + format: int32 + offsetQueryParam: + name: offset + in: query + description: | + Number of records to skip for pagination. + _This parameter is not supported yet._ + schema: + type: integer + format: int32 + filterQueryParam: + name: filter + in: query + description: | + Condition to filter the retrival of records. + _This parameter is not supported yet._ + schema: + type: string + sortQueryParam: + name: sort + in: query + description: | + Define the order in which the retrieved records should be sorted. + _This parameter is not supported yet._ + schema: + type: string + userIdPathParam: + name: user-id + in: path + description: ID of the user. + required: true + schema: + type: string + sessionIdPathParam: + name: session-id + in: path + description: ID of the session. + required: true + schema: + type: string + securitySchemes: + OAuth2: + type: oauth2 + flows: + clientCredentials: + tokenUrl: https://api.asgardeo.io/t/{org-name}/oauth2/token + scopes: + internal_login: Grant permission for an authenticated user for self session management. + internal_session_view: Grant permissions to list seeion info. + internal_session_delete: Grant permissions to delete sessions. \ No newline at end of file diff --git a/docusaurus-asgardeo/static/apis/restapis/totp.yaml b/docusaurus-asgardeo/static/apis/restapis/totp.yaml new file mode 100644 index 0000000000..6161a0148f --- /dev/null +++ b/docusaurus-asgardeo/static/apis/restapis/totp.yaml @@ -0,0 +1,226 @@ +openapi: 3.0.0 + +info: + description: | + This is the RESTful API for a user to manage TOTP QR URLs/secrets in Asgardeo. + version: "v1" + title: "Asgardeo - TOTP API Definition" +servers: +- url: https://api.asgardeo.io/t/{organization-name}/api/users/v1 + +security: + - OAuth2: [] + +tags: +- name: me + description: Operations for the authenticated user. + +paths: + /me/totp: + post: + description: + "This API is used to perform following actions.\n\n +
    • INIT- Generate the TOTP QR code URL for the authenticated user.
    • \n +
    • REFRESH - Refresh the TOTP secret key of the authenticated user.
    • \n +
    • VALIDATE - Validate the user entered verification code.
    • \n\n Scope required: ``internal_login``" + summary: | + Generate, refresh and validate the QR + parameters: + - name: request + in: path + description: Actions supported by the API. Actions can be INIT, VALIDATE or REFRESH + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/UserRequest' + responses: + 200: + description: TOTP secret successfully refreshed + 201: + description: Created + content: + application/json: + schema: + $ref: '#/components/schemas/TOTPResponse' + 400: + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 401: + description: Unauthorized + 403: + description: Resource Forbidden + 409: + description: Conflict + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + 500: + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{organization-name}/api/users/v1/me/totp' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "action": "INIT, REFRESH, VALIDATE", + "verificationCode": 0 + }' + + tags: + - me + get: + tags: + - me + summary: Retrieve the QR Code URL + description: + "This API is used to retrieve the QR code URL of the authenticated user.\n\n Scope required:``internal_login``" + responses: + 200: + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/TOTPResponse' + 401: + description: Unauthorized + 403: + description: Resource Forbidden + 500: + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/users/v1/me/totp' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + delete: + tags: + - me + summary: Reset TOTP credentials + description: + "This API is used to delete the TOTP credentials of the authenticated user.\n\n Scope required:``internal_login``" + responses: + 200: + description: Credentials deleted successfully + 401: + description: Unauthorized + 403: + description: Resource Forbidden + 500: + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'DELETE' \ + 'https://api.asgardeo.io/t/{organization-name}/api/users/v1/me/totp' \ + -H 'accept: */*' \ + -H 'Authorization: Bearer {bearer_token}' + /me/totp/secret: + get: + tags: + - me + summary: Retrieve the TOTP secret + description: + "This API is used to retrieve the TOTP secret of the authenticated user.\n\n Scope required:``internal_login``" + responses: + 200: + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/TOTPSecretResponse' + 401: + description: Unauthorized + 403: + description: Resource Forbidden + 500: + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/users/v1/me/totp/secret' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' +components: + schemas: + Error: + type: object + required: + - code + - message + properties: + code: + type: string + example: "some_error_code" + message: + type: string + example: "Some Error Message" + description: + type: string + example: "Some Error Description" + traceId: + type: string + example: "Some Correlation for Error Instance" + + UserRequest: + type: object + required: [action] + properties: + action: + type: string + example: INIT, REFRESH, VALIDATE + enum: [INIT, REFRESH, VALIDATE] + verificationCode: + type: integer + example: Verification code that need to be verified by the server + + TOTPResponse: + type: object + properties: + qrCodeUrl: + type: string + description: QR Code URL for the authenticated user + isValid: + type: boolean + description: Secret key of the authenticated user + + TOTPSecretResponse: + type: object + properties: + secret: + type: string + description: Refreshed TOTP secret key of the authenticated user + + securitySchemes: + OAuth2: + type: oauth2 + description: "You can use the following OAuth grant type to securely access the respective API endpoints. + \n\n **Authorization Code OAuth Flow** + \n\n Authorization URL: 'https://api.asgardeo.io/t/{org-name}/oauth2/authorize' + \n\n This flow type is used for the ```me``` endpoint of TOTP APIs. You can use the following scope for this endpoints. + \n\n - ```internal_login```: Grant permission for an authenticated user for self management." \ No newline at end of file diff --git a/docusaurus-asgardeo/static/apis/restapis/user-account-recovery.yaml b/docusaurus-asgardeo/static/apis/restapis/user-account-recovery.yaml new file mode 100644 index 0000000000..6e569e394f --- /dev/null +++ b/docusaurus-asgardeo/static/apis/restapis/user-account-recovery.yaml @@ -0,0 +1,1402 @@ +openapi: 3.0.0 +info: + version: "v2" + title: User Account Recovery API + description: > + This document specifies **User initiated Username and Password Recovery related RESTful API** for Asgardeo. +paths: + /recovery/username/init: + post: + tags: + - Username Recovery + summary: Initiate Username Recovery + operationId: initiateUsernameRecovery + description: | + - This API is used to initiate username recovery by user. The API will + return available recovery information for username recovery with + notifications. + + - Use the returned __recoveryCode__ and the __channelId__ with + __username recover api__ to confirm the the username recovery and to + receive recovery notifications via the channel specified by the user. + + Scope(Permission) required: `internal_user_recovery_create` + responses: + '200': + description: >- + User is successfully identified for the given claims and returning + available notification channels for the user. + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/AccountRecoveryType' + examples: + response: + value: + - mode: recoverWithNotifications + channelInfo: + recoveryCode: 1234-55678-5668-2345 + channels: + - id: 1 + type: EMAIL + value: wso2***********.com + preferred: true + - id: 2 + type: SMS + value: '**********123' + preferred: false + links: + - rel: next + href: /api/users/v2/recovery/username/recover + type: POST + '400': + description: Bad Request. The request cannot be processed by the server. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + examples: + response: + value: + code: UAR-10001 + message: bad_request + description: bad request + traceId: 23456fghj678vb78 + '403': + description: Username recovery is not enabled. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + examples: + response: + value: + code: UNR-10003 + message: Forbidden + description: Username recovery is not enabled + traceId: 23456fghj678vb78 + '404': + description: >- + No user found for the given set of claims or no recovery channels + are available for the user. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + examples: + response: + value: + code: UAR-10002 + message: Not found + description: No user found + traceId: 23456fghj678vb78 + '409': + description: Multiple users found for the given claims. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + examples: + response: + value: + code: UAR-10008 + message: Conflict + description: Multiple users found for given claims + traceId: 23456fghj678vb78 + '500': + description: Server Error. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + examples: + response: + value: + code: UNR-15001 + message: Internal Error + description: Internal Error + traceId: 23456fghj678vb78 + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{organization-name}/api/users/v2/recovery/username/init' \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "claims": [ + { + "uri": "http://wso2.org/claims/givenname", + "value": "user1" + } + ], + "properties": [ + { + "key": "key", + "value": "value" + } + ] + }' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/InitRequest' + description: >- + Request to initate username recovery process. The request should + contain the claims to identify the user. User claims are `REQUIRED`. + required: true + /recovery/username/recover: + post: + tags: + - Username Recovery + summary: Get Recovery Information + operationId: recoverUsername + description: | + - This API is used to confirm username recovery and send username + recovery information to the user who matches the recovery code via the + channel specified by the channel Id. + - __NOTE__: If the notification channel is __EXTERNAL__, the API will return the username of the user. + + Scope(Permission) required: `internal_user_recovery_create` + responses: + '200': + description: >- + Username is successfully recovered and the __notification channel__ + is `EXTERNAL`. + content: + application/json: + schema: + $ref: '#/components/schemas/UsernameRecoveryNotifyResponse' + examples: + response: + value: + code: UNR-02002 + message: Username recovery information sent externally + notificationChannel: EXTERNAL + username: PRIMARY/sominda1@carbon.super + '202': + description: Username is successfully recovered. + content: + application/json: + schema: + $ref: '#/components/schemas/UsernameRecoveryNotifyResponse' + examples: + response: + value: + code: UNR-02001 + message: >- + Username recovery information sent via user preferred + notification channel + notificationChannel: EMAIL + '400': + description: Bad Request. Request cannot be processed by the server. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + examples: + response: + value: + code: UNR-10001 + message: bad_request + description: bad request + traceId: 23456fghj678vb78 + '404': + description: Recovery code is not found. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + examples: + response: + value: + code: UNR-10001 + message: not_found + description: recovery code not found + traceId: 23456fghj678vb78 + '406': + description: | + - Recovery code given in the request is not valid or expired. + - Channel id is not valid + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + examples: + response: + value: + code: UNR-10001 + message: not acceptable + description: 'invalid error code : 1234-2345-12345-123456' + traceId: 23456fghj678vb78 + '500': + description: Server Error. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + examples: + response: + value: + code: UNR-15001 + message: Internal Error + description: Internal Error + traceId: 23456fghj678vb78 + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{organization-name}/api/users/v2/recovery/username/recover' \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "recoveryCode": "1234-5678-2455-3433", + "channelId": "1", + "properties": [ + { + "key": "key", + "value": "value" + } + ] + }' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/RecoveryRequest' + description: > + - Request to confirm username recovery and receive recovery + notifications. + + - `recoveryCode` and `channelId` are `REQUIRED`. + + - __NOTE__ `channelId` should always be __larger than 0__. + required: true + /recovery/password/init: + post: + tags: + - Password Recovery + summary: | + Initiate password recovery + operationId: initiatePasswordRecovery + description: | + - This API is used to initiate password recovery by user. The API will + return recovery information for password recovery with challenge + questions and password recovery with notifications. + + - `mode` __recoverWithNotifications__ contains recovery flow confirmation code, available communication channels and a recovery code for password recovery with notifications. + The next API call will be returned in the response. + + - If `password recovery with notifications` is not enabled, the response + will not contain __recoverWithNotifications__ mode. + + - __recoverWithChallengeQuestions__ contains the next API call to begin + the recovery process via challenge questions. + + - If `password recovery with challenge questions` is not enabled, the + response will not contain __recoverWithChallengeQuestions__ mode. + + Scope(Permission) required: `internal_user_recovery_create` + responses: + '200': + description: >- + User is successfully identified for the given claims and returning + available notification channels for the user. + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/AccountRecoveryType' + examples: + response: + value: + - mode: recoverWithNotifications + flowConfirmationCode: 1234-1234-1234-1234 + channelInfo: + recoveryCode: 1234-55678-5668-2345 + channels: + - id: 1 + type: EMAIL + value: wso2***********.com + preferred: false + - id: 2 + type: SMS + value: '**********123' + preferred: true + links: + - rel: next + href: /api/users/v2/recovery/password/recovery + type: POST + - mode: recoverWithChallengeQuestions + links: + - rel: next + href: >- + /t/carbon.super/api/identity/recovery/v0.9/security-question?username=sominda + type: GET + '400': + description: Bad Request. The request cannot be processed by the server. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + examples: + response: + value: + code: UAR-10001 + message: bad_request + description: bad request + traceId: 23456fghj678vb78 + '404': + description: >- + No user found for the given set of claims or no recovery channels + are available for the user. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + examples: + response: + value: + code: UAR-10002 + message: Not found + description: No user found + traceId: 23456fghj678vb78 + '409': + description: Multiple users found for the given claims. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + examples: + response: + value: + code: UAR-10008 + message: Conflict + description: Multiple users found for given claims + traceId: 23456fghj678vb78 + '500': + description: Server Error. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + examples: + response: + value: + code: UAR-15001 + message: Internal Error + description: Internal Error + traceId: 23456fghj678vb78 + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{organization-name}/api/users/v2/recovery/password/init' \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "claims": [ + { + "uri": "http://wso2.org/claims/givenname", + "value": "user1" + } + ], + "properties": [ + { + "key": "key", + "value": "value" + } + ] + }' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/InitRequest' + description: >- + Request to initiate password recovery process. The request should + contain the claims to identify the user. User claims are `REQUIRED`. + required: true + /recovery/password/recover: + post: + tags: + - Password Recovery + summary: | + Get Recovery Information + operationId: recoverPassword + description: | + - This API is used to send recovery information to the user who matches + the recovery code via the channel specified by the channel Id. The API will return the recovery flow confirmation code. + + - NOTE: If the notification channel is EXTERNAL, the API will return a + confirmationCode. + + - Use the returned confirmation code with __password recovery confirm + API__ to verify the password recovery process. + + - The API will return the next API call. + + Scope(Permission) required: `internal_user_recovery_create` + responses: + '200': + description: > + - Password recovery initiated via `EXTERNAL` channel. API will + return a `confirmationCode` to confirm password recovery. + + - Use the confirmation code with __password recovery confirm API__ + to confirm the password recovery. + content: + application/json: + schema: + $ref: '#/components/schemas/PasswordRecoveryExternalNotifyResponse' + examples: + response: + value: + code: PWR-02002 + message: Password recovery information sent externally + flowConfirmationCode: 1234-1234-1234-1234 + notificationChannel: EXTERNAL + confirmationCode: 12345-45678-6789098-8765 + resendCode: 12345-45678-6789098-8765 + links: + - rel: next + href: api/users/v2/recovery/password/confirm + type: POST + - rel: resend + href: api/users/v2/recovery/password/resend + type: POST + '202': + description: > + - Password recovery initiated via internal channels. API will send a + `confirmationCode`/`otp` to the channel specified by the user. + + - Use the confirmation code/OTP with __password recovery confirm API__ + to confirm the password recovery. + content: + application/json: + schema: + $ref: '#/components/schemas/PasswordRecoveryInternalNotifyResponse' + examples: + response: + value: + code: PWR-02002 + message: Password recovery information sent externally + flowConfirmationCode: 1234-1234-1234-1234 + notificationChannel: EMAIL + resendCode: 12345-45678-6789098-8765 + links: + - rel: next + href: api/users/v2/recovery/password/confirm + type: POST + - rel: resend + href: api/users/v2/recovery/password/resend + type: POST + '400': + description: Bad Request. Request cannot be processed by the server. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + examples: + response: + value: + code: PWR-10001 + message: bad_request + description: bad request + traceId: 23456fghj678vb78 + '403': + description: Password recovery is not enabled. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + examples: + response: + value: + code: PWR-10004 + message: Forbidden + description: Password recovery is not enabled + traceId: 23456fghj678vb78 + '404': + description: Recovery code is not found. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + examples: + response: + value: + code: PWR-10001 + message: not_found + description: recovery code not found + traceId: 23456fghj678vb78 + '406': + description: | + - Recovery code given in the request is not valid or expired. + - Channel id is not valid + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + examples: + response: + value: + code: PWR-10003 + message: not acceptable + description: 'invalid error code : 1234-2345-12345-123456' + traceId: 23456fghj678vb78 + '500': + description: Server Error. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + examples: + response: + value: + code: PWR-15001 + message: Internal Error + description: Internal Error + traceId: 23456fghj678vb78 + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{organization-name}/api/users/v2/recovery/password/recover' \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "recoveryCode": "1234-5678-2455-3433", + "channelId": "1", + "properties": [ + { + "key": "key", + "value": "value" + } + ] + }' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/RecoveryRequest' + description: | + - Request to receive recovery notifications. + - `recoveryCode` and `channelId` are `REQUIRED`. + - __NOTE__ `channelId` should always be __larger than 0__. + required: true + /recovery/password/resend: + post: + tags: + - Password Recovery + summary: | + Resend password recovery confirmation details + operationId: resendConfirmation + description: | + - This API is used to resend a confirmation code/OTP to the user via a user + preferred channel defined at password recovery. + + - NOTE: The API cannot be used when the notification channel is + external. + + - The API will return the next API calls. + + Scope(Permission) required: `internal_user_recovery_create` + responses: + '200': + description: > + - API will return a new `confirmationCode`. + + - Use the confirmation code with __password recovery confirm API__ + to confirm the password recovery. + content: + application/json: + schema: + $ref: '#/components/schemas/ResendConfirmationCodeExternalResponse' + examples: + response: + value: + code: PWR-02002 + message: successful_request + flowConfirmationCode: 1234-1234-1234-1234 + notificationChannel: EXTERNAL + confirmationCode: 1234-12345-234-123456 + resendCode: 1234-12345-234-123456 + links: + - rel: next + href: api/users/v2/recovery/password/recover + type: POST + - rel: resend + href: api/users/v2/recovery/password/resend + type: POST + '202': + description: > + - API will send a `confirmationCode`/`otp` to the channel specified by the + user. + + - Use the confirmation code/OTP with __password recovery confirm API__ + to confirm the password recovery. + content: + application/json: + schema: + $ref: '#/components/schemas/ResendConfirmationCodeInternalResponse' + examples: + response: + value: + code: PWR-02002 + message: successful_request + flowConfirmationCode: 1234-1234-1234-1234 + notificationChannel: EMAIL + resendCode: 1234-12345-234-123456 + links: + - rel: next + href: api/user/v2/recovery/password/recover + type: POST + - rel: resend + href: api/users/v2/recovery/password/resend + type: POST + '400': + description: Bad Request. Request cannot be processed by the server. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + examples: + response: + value: + code: UAR-10001 + message: bad_request + description: bad request + traceId: 23456fghj678vb78 + '404': + description: Resend code is not found. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + examples: + response: + value: + code: UAR-10001 + message: not_found + description: recovery code not found + traceId: 23456fghj678vb78 + '406': + description: Resend code given in the request is not valid or expired. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + examples: + response: + value: + code: UAR-10003 + message: not acceptable + description: 'invalid error code : 1234-2345-12345-123456' + traceId: 23456fghj678vb78 + '500': + description: Server Error. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + examples: + response: + value: + code: UAR-15001 + message: Internal Error + description: Internal Error + traceId: 23456fghj678vb78 + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{organization-name}/api/users/v2/recovery/password/resend' \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "resendCode": "1234-2ws34-1234", + "properties": [ + { + "key": "key", + "value": "value" + } + ] + }' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ResendConfirmationRequest' + description: > + - Request to resend the `confirmationCode`/`otp` to the user via a user + preferred channel. + + - Can send additional properties. + required: true + /recovery/password/confirm: + post: + tags: + - Password Recovery + summary: | + Confirm password recovery + operationId: confirmRecovery + description: | + - This API is used to validate the __confirmationCode__/__otp__ given at + password recovery. + + - Use the returned __reset code__ with the __password reset API__ to + reset the password. + + - The API will return the next API call. + + Scope(Permission) required: `internal_user_recovery_create` + responses: + '200': + description: | + - Password reset confirmed. + - `resetCode` is returned. + content: + application/json: + schema: + $ref: '#/components/schemas/ResetCodeResponse' + examples: + response: + value: + resetCode: 2806aed9-fe7c-4b47-a91f-0aa897fac9a2 + links: + - rel: next + href: >- + /t/carbon.super/api/users/v2/recovery/password/reset + type: POST + '400': + description: Bad Request. Request cannot be processed by the server. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + examples: + response: + value: + code: PWR-10001 + message: bad_request + description: bad request + traceId: 23456fghj678vb78 + '404': + description: Confirmation code is not found. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + examples: + response: + value: + code: PWR-10001 + message: not_found + description: recovery code not found + traceId: 23456fghj678vb78 + '406': + description: | + Confirmation code given in the request is not valid or expired. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + examples: + response: + value: + code: PWR-10001 + message: not acceptable + description: 'invalid error code : 1234-2345-12345-123456' + traceId: 23456fghj678vb78 + '500': + description: Server Error. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + examples: + response: + value: + code: PWR-15001 + message: Internal Error + description: Internal Error + traceId: 23456fghj678vb78 + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{organization-name}/api/users/v2/recovery/password/confirm' \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "confirmationCode": "1234-2ws34-12345", + "otp": "wi8Ivm", + "properties": [ + { + "key": "key", + "value": "value" + } + ] + }' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ConfirmRequest' + description: | + - Request to confirm the password recovery. + - `confirmationCode` is `REQUIRED`. + - `otp` is required only for OTP based password recovery. The __flowConfirmationCode__ returned from the password recovery request should be set as the `confirmationCode` for OTP based recovery. + required: true + /recovery/password/reset: + post: + tags: + - Password Recovery + summary: | + Reset password + operationId: resetPassword + description: | + This API is used to reset the password of the user who matches the flowConfirmationCode given by the recover API and the resetCode given by the confirmation API. + + Scope(Permission) required: `internal_user_recovery_create` + responses: + '200': + description: Successful password reset. + content: + application/json: + schema: + $ref: '#/components/schemas/PasswordResetResponse' + examples: + response: + value: + code: PWR-02005 + message: Successful password reset + '400': + description: Bad Request. Request cannot be processed by the server. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + examples: + response: + value: + code: PWR-10001 + message: bad_request + description: bad request + traceId: 23456fghj678vb78 + '404': + description: Reset code is not found. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + examples: + response: + value: + code: PWR-10001 + message: not_found + description: recovery code not found + traceId: 23456fghj678vb78 + '406': + description: Reset code given in the request is not valid or expired. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + examples: + response: + value: + code: PWR-10001 + message: not acceptable + description: 'invalid error code : 1234-2345-12345-123456' + traceId: 23456fghj678vb78 + '412': + description: Password policy violation. + content: + application/json: + schema: + $ref: '#/components/schemas/RetryErrorResponse' + examples: + response: + value: + code: PWR-10001 + message: bad_request + description: password policy violation + traceId: 23456fghj678vb78 + resetCode: 1234-12345-sdf-34567567 + links: [ + { + "rel": "next", + "href": "/t/carbon.super/api/users/v2/recovery/password/reset", + "type": "POST" + } + ] + '500': + description: Server Error. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + examples: + response: + value: + code: PWR-15001 + message: Internal Error + description: Internal Error + traceId: 23456fghj678vb78 + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{organization-name}/api/users/v2/recovery/password/reset' \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "resetCode": "string", + "flowConfirmationCode": "string", + "password": "string", + "properties": [ + { + "key": "key", + "value": "value" + } + ] + }' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ResetRequest' + description: | + - Request to reset the password. + - `resetCode`, `flowConfirmationCode` and `password` are required. + required: true +servers: + - url: 'https://api.asgardeo.io/t/{organization-name}/api/users/v2' + +components: + schemas: + InitRequest: + type: object + description: Request to initiate an account recovery + properties: + claims: + type: array + description: User claims to identify the user as UserClaim objects + items: + $ref: '#/components/schemas/UserClaim' + properties: + type: array + description: (OPTIONAL) Additional META properties + items: + $ref: '#/components/schemas/Property' + required: + - claims + RecoveryRequest: + type: object + description: >- + Request to start the recovery for the user who matches the recovery code + via the given channelID + properties: + recoveryCode: + type: string + description: Recovery code for the user + example: 1234-5678-2455-3433 + channelId: + type: string + description: >- + Id of the notification channel that user prefers to get recovery + notifications. + example: '1' + properties: + type: array + description: (OPTIONAL) Additional META properties + items: + $ref: '#/components/schemas/Property' + required: + - recoveryCode + - channelId + ResendConfirmationRequest: + type: object + description: Request to resend the confirmation code in password recovery + properties: + resendCode: + type: string + description: Resend code returned by the password recovery API + example: 1234-2ws34-1234 + properties: + type: array + description: (OPTIONAL) Additional META properties + items: + $ref: '#/components/schemas/Property' + ConfirmRequest: + type: object + description: Request to confirm password recovery + required: + - confirmationCode + properties: + confirmationCode: + type: string + description: Confirmation code of the recovery flow + example: 1234-2ws34-12345 + otp: + type: string + description: OTP sent to the user + example: wi8Ivm + properties: + type: array + description: (OPTIONAL) Additional META properties + items: + $ref: '#/components/schemas/Property' + ResetRequest: + type: object + description: Object to reset the password of a user + required: + - resetCode + - password + properties: + resetCode: + type: string + description: resetCode given by the confirm API + flowConfirmationCode: + type: string + description: Confirmation code of the recovery flow + password: + type: string + description: New password given by the user + properties: + type: array + description: (OPTIONAL) Additional META properties + items: + $ref: '#/components/schemas/Property' + PasswordRecoveryInternalNotifyResponse: + type: object + properties: + code: + type: string + description: Success status code + example: PWR-02002 + message: + type: string + description: Success status message + example: successful_request + flowConfirmationCode: + type: string + description: Recovery flow confirmation code + example: 1234-1234-1234-1234 + notificationChannel: + type: string + description: Channel that is used to send recovery information + example: EMAIL + resendCode: + type: string + description: >- + Code to resend the confirmation code to the user via user + selected channel + example: 1234-123456-12345-12345 + links: + type: array + description: Contains available api calls + items: + $ref: '#/components/schemas/APICall' + PasswordRecoveryExternalNotifyResponse: + type: object + properties: + code: + type: string + description: Success status code + example: PWR-02002 + message: + type: string + description: Success status message + example: successful_request + flowConfirmationCode: + type: string + description: Recovery flow confirmation code + example: 1234-1234-1234-1234 + notificationChannel: + type: string + description: Channel that is used to send recovery information + example: EXTERNAL + confirmationCode: + type: string + description: > + - Confirmation code for password recovery when the notifications are + externally managed. + + - The confirmation code will be returned only if the notification + channel is _EXTERNAL_. Use this code with password confirm API to + get a password reset code. + example: 12345-45678-6789098-8765 + resendCode: + type: string + description: >- + Code to get a new confirmation code. + example: 1234-123456-12345-12345 + links: + type: array + description: Contains available api calls + items: + $ref: '#/components/schemas/APICall' + UsernameRecoveryNotifyResponse: + type: object + description: API response for successful username recovery + properties: + code: + type: string + description: Success status code + example: UNR-02001 + message: + type: string + description: Success status message + example: successful_request + notificationChannel: + type: string + description: Channel which the recovery information is sent to the user + example: EXTERNAL + username: + type: string + example: user1 + description: > + - Username of the user + + - Username will be returned _ONLY IF_ the notification channel is + `EXTERNAL` + required: + - code + - message + - notificationChannel + - username + ResetCodeResponse: + properties: + resetCode: + type: string + description: Password reset code to reset the password + example: 1234-55678-5668-2345 + links: + type: array + description: Contains available api calls + items: + $ref: '#/components/schemas/APICall' + PasswordResetResponse: + type: object + description: API response for a successful password reset + properties: + code: + type: string + description: Operation code + example: PWR-02001 + message: + type: string + description: Message regarding the operation. + example: successful_request + ResendConfirmationCodeExternalResponse: + type: object + description: Object encapsulate the details regarding resend confirmation code + properties: + code: + type: string + description: Success status code + example: PWR-02002 + message: + type: string + description: Success status message + example: successful_request + flowConfirmationCode: + type: string + description: Recovery flow confirmation code + example: 1234-1234-1234-1234 + notificationChannel: + type: string + description: Channel that is used to send recovery information + example: EMAIL + confirmationCode: + type: string + description: Confirmation code to confirm the password recovery + example: 1234-12345-234-123456 + resendCode: + type: string + description: Resend code to resend the confirmation code + example: 1234-12345-234-123456 + links: + type: array + description: Contains available api calls + items: + $ref: '#/components/schemas/APICall' + ResendConfirmationCodeInternalResponse: + type: object + description: Object encapsulate the details regarding resend confirmation code + properties: + code: + type: string + description: Success status code + example: PWR-02002 + message: + type: string + description: Success status message + example: successful_request + flowConfirmationCode: + type: string + description: Recovery flow confirmation code + example: 1234-1234-1234-1234 + notificationChannel: + type: string + description: Channel that is used to send recovery information + example: EMAIL + resendCode: + type: string + description: Resend code to resend the confirmation code + example: 1234-12345-234-123456 + links: + type: array + description: Contains available api calls + items: + $ref: '#/components/schemas/APICall' + RetryErrorResponse: + type: object + properties: + code: + type: string + description: Error code corresponding to the error + example: PWR-10004 + message: + type: string + description: Error message + example: Retry + description: + type: string + description: Error description + example: Password policy violation + traceId: + type: string + description: Some Correlation for Error Instance + example: 2345dfgh678h789bhjk + resetCode: + type: string + description: Password reset code used in the request + example: 1234-34567-3456-2345678 + links: + type: array + description: Contains available api calls + items: + $ref: '#/components/schemas/APICall' + ErrorResponse: + type: object + properties: + code: + type: string + description: Error code corresponding to the error + example: UAR-10001 + message: + type: string + description: Error message + example: invalid_request + description: + type: string + description: Description about the error + example: Invalid claim uri + traceId: + type: string + description: Some Correlation for Error Instance + example: 2345dfgh678h789bhjk + AccountRecoveryType: + type: object + description: Object that encapsulates details of the account recovery channel + properties: + mode: + type: string + example: recoverWithNotifications + flowConfirmationCode: + type: string + example: 1234-1234-1234-1234 + channelInfo: + $ref: '#/components/schemas/RecoveryChannelInformation' + links: + type: array + description: Contains available api calls + items: + $ref: '#/components/schemas/APICall' + RecoveryChannelInformation: + description: Response with the recovery ID and the available recovery channels + properties: + recoveryCode: + type: string + description: Code to recovery the user account + example: 1234-55678-5668-2345 + channels: + type: array + description: Available recovery channels for the user + items: + $ref: '#/components/schemas/RecoveryChannel' + RecoveryChannel: + type: object + description: Object with notification channel attributes + properties: + id: + type: string + description: Id given to the channel + example: '1' + type: + type: string + description: Type of the chanel + example: EMAIL + value: + type: string + description: Masked channel value + example: wso2***********.com + preferred: + type: boolean + description: Whether the channel is a user preferred channel + example: true + UserClaim: + type: object + description: Object that holds a user claim and the corresponding value + properties: + uri: + type: string + description: Claim uri + example: 'http://wso2.org/claims/givenname' + value: + type: string + description: Value for the claim + example: user1 + Property: + type: object + description: 'object that holds a property as a key, value pair' + properties: + key: + type: string + description: Unique identifier as the key of the property + example: key + value: + type: string + description: Value of the property + example: value + APICall: + type: object + description: Object that holds next API call details + properties: + rel: + type: string + description: Next API call + example: next + href: + type: string + description: Next API url + example: /api/users/recovery/v2/ + type: + type: string + description: HTTP method type + example: POST \ No newline at end of file diff --git a/docusaurus-asgardeo/static/apis/restapis/user-identity-verification.yaml b/docusaurus-asgardeo/static/apis/restapis/user-identity-verification.yaml new file mode 100644 index 0000000000..df94a55357 --- /dev/null +++ b/docusaurus-asgardeo/static/apis/restapis/user-identity-verification.yaml @@ -0,0 +1,299 @@ +openapi: 3.0.3 +info: + title: Identity Verification API + description: |- + This is the RESTful API for users to manage their identity verification information stored in Asgardeo. +servers: + - url: 'https://api.asgardeo.io/t/{organization-name}/api/users/v1' +security: + - OAuth2: [] + - BasicAuth: [] +paths: + /me/idv/verify: + post: + tags: + - Me - Identity Verification + summary: Verify an Identity + description: > + This API provides the capability to verify a user with the configured verification required attributes.
      + Scope(Permission) required: `internal_login` + operationId: meVerifyIdentity + requestBody: + description: Verify an identity + content: + application/json: + schema: + $ref: '#/components/schemas/verifyRequest' + required: true + responses: + '201': + description: Accepted + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/verificationPostResponse' + '200': + description: Successful operation + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/verificationPostResponse' + '400': + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /me/idv/claims: + get: + tags: + - Me - Identity Verification + summary: Get the identity verification claims of a user + description: > + This API provides the capability to retrieve the verification details of a user. +
      Scope(Permission) required: `internal_login` + operationId: meGetIdVClaims + parameters: + - $ref: '#/components/parameters/idVPQueryParam' + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/verificationClaimResponse' + '400': + description: Invalid status value + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + /me/idv/claims/{claim-id}: + get: + tags: + - Me - Identity Verification + summary: Get identity verification claim + description: > + This API provides the capability to retrieve a identity verification claim of a user. +
      Scope(Permission) required: `internal_login` + operationId: meGetIdVClaim + parameters: + - name: claim-id + in: path + description: Claim that needs to retrieve verification metadata + required: true + schema: + type: string + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/verificationClaimResponse' + '400': + description: Invalid status value + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + +components: + parameters: + limitQueryParam: + in: query + name: limit + required: false + description: | + Maximum number of records to return. + schema: + type: integer + format: int32 + offsetQueryParam: + in: query + name: offset + required: false + description: | + Number of records to skip for pagination. + schema: + type: integer + format: int32 + idVPQueryParam: + in: query + name: idVProviderId + required: false + description: | + Id of the identity verification provider. + schema: + type: string + schemas: + Error: + type: object + properties: + code: + type: string + example: AAA-00000 + message: + type: string + example: Some Error Message + description: + type: string + example: Some Error Description + traceId: + type: string + example: e0fbcfeb-****-****-8dd0-7b7d38e13047 + verificationPostResponse: + type: object + properties: + idVProviderId: + type: string + example: "d75b8685-****-****-a555-80a3eecb5af2" + claims: + type: array + items: + $ref: '#/components/schemas/verificationClaimResponse' + verificationClaimResponse: + type: object + properties: + id: + type: string + example: aHR0cDovL3******************cy91c2VybmFtZQ + readOnly: true + uri: + type: string + example: 'http://wso2.org/claims/dob' + isVerified: + type: boolean + example: true + idVProviderId: + type: string + example: '2159375-****-****-a456-5566424414527' + claimMetadata: + $ref: '#/components/schemas/claimMetadata' + verificationClaimRequest: + type: object + properties: + uri: + type: string + example: 'http://wso2.org/claims/dob' + isVerified: + type: boolean + example: true + idVProviderId: + type: string + example: '2159375-****-****-a456-5566424414527' + claimMetadata: + $ref: '#/components/schemas/claimMetadata' + verificationClaimUpdateRequest: + type: object + properties: + isVerified: + type: boolean + example: true + claimMetadata: + $ref: '#/components/schemas/claimMetadata' + required: + - isVerified + - claimMetadata + claimMetadata: + type: object + additionalProperties: true + example: '{"source": "Provider", "trackingId": "123e4567-****-****-a456-556642440000" }' + verificationClaimPostRequest: + type: array + items: + $ref: '#/components/schemas/verificationClaimRequest' + verificationClaimPostResponse: + type: array + items: + $ref: '#/components/schemas/verificationClaimResponse' + verifyRequest: + type: object + properties: + idVProviderId: + type: string + example: "d75b8685-383a-4320-a555-80a3eecb5af2" + claims: + type: array + items: + type: string + example: + - http://wso2.org/claims/dob + - http://wso2.org/claims/country + properties: + type: array + items: + $ref: '#/components/schemas/ProviderProperty' + required: + - identityVerificationProvider + - properties + ProviderProperty: + type: object + properties: + key: + type: string + example: status + value: + type: string + example: "INITIATED" + securitySchemes: + BasicAuth: + type: http + scheme: basic + OAuth2: + type: oauth2 + flows: + authorizationCode: + authorizationUrl: 'https://localhost:9443/oauth2/authorize' + tokenUrl: 'https://localhost:9443/oauth2/token' + scopes: {} diff --git a/docusaurus-asgardeo/static/apis/restapis/user-organization.yaml b/docusaurus-asgardeo/static/apis/restapis/user-organization.yaml new file mode 100644 index 0000000000..e3367da37d --- /dev/null +++ b/docusaurus-asgardeo/static/apis/restapis/user-organization.yaml @@ -0,0 +1,339 @@ +openapi: 3.0.0 +info: + version: "v1" + title: 'Asgardeo - User Organization Management API Definition' + description: | + This document specifies an **User Organization Management RESTful API** for **Asgardeo**. + + This API provides the capability to retrieve the resident organization of the authenticated user. + license: + name: Apache 2.0 + url: https://www.apache.org/licenses/LICENSE-2.0.html +servers: + - url: 'https://api.asgardeo.io/t/{root-organization-name}/api/users/v1/me/organizations' + variables: + root-organization-name: + default: {root-organization-name} +security: + - OAuth2: [] + +tags: + - name: me + description: Operations for the authenticated user + +paths: + /: + get: + tags: + - me + summary: + This API is used to search and retrieve child organizations which are authorized for the user. + description: + Retrieve authorized organizations which matches the defined search criteria, if any. + + Scope(Permission) required: `internal_login` + parameters: + - $ref: '#/components/parameters/filterQueryParam' + - $ref: '#/components/parameters/limitQueryParam' + - $ref: '#/components/parameters/afterQueryParam' + - $ref: '#/components/parameters/beforeQueryParam' + - $ref: '#/components/parameters/recursiveQueryParam' + - $ref: '#/components/parameters/authorizedAppNameQueryParam' + responses: + '200': + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationsResponse' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '500': + $ref: '#/components/responses/ServerError' + '501': + $ref: '#/components/responses/NotImplemented' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{root-organization-name}/api/users/v1/me/organizations' \ + -H 'Authorization: Bearer {access_token}' \ + -H 'Content-Type: application/json' + /root: + get: + tags: + - me + summary: | + Get the root organization of the authenticated user + description: | + This API provides the capability to retrieve the root organization of the authenticated user. + + Scope(Permission) required: `internal_login` + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/RootOrganizationResponse' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{root-organization-name}/api/users/v1/me/organizations/root' \ + -H 'Authorization: Bearer {access_token}' \ + -H 'Content-Type: application/json' + /root/descendants: + get: + tags: + - me + summary: | + Get the descendant organizations of the authenticated user's resident organization + description: | + This API provides the capability to retrieve + the descendant organizations of the authenticated user's resident organizations. The response includes + the organization's id and name from the resident organization to the accessed child organization. + + Scope(Permission) required: `internal_login` + responses: + '200': + description: Successful Response + content: + application/json: + schema: + $ref: '#/components/schemas/RootDescendantsOrganizationResponse' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{root-organization-name}/api/users/v1/me/organizations/root/descendants' \ + -H 'Authorization: Bearer {access_token}' \ + -H 'Content-Type: application/json' + +components: + parameters: + filterQueryParam: + in: query + name: filter + required: false + description: + Condition to filter the retrieval of records. + schema: + type: string + limitQueryParam: + in: query + name: limit + required: false + description: + Maximum number of records to be returned. (Should be greater than 0) + schema: + type: integer + format: int32 + minimum: 0 + beforeQueryParam: + in: query + name: before + required: false + description: + Points to the previous range of data that can be retrieved. + schema: + type: string + afterQueryParam: + in: query + name: after + required: false + description: + Points to the next range of data to be returned. + schema: + type: string + recursiveQueryParam: + in: query + name: recursive + required: false + description: + Determines whether a recursive search should happen. + schema: + type: boolean + default: false + authorizedAppNameQueryParam: + in: query + name: authorizedAppName + required: false + description: + Retrieves the organizations that are authorized for the user through the role bound to the application. + schema: + type: string + schemas: + RootOrganizationResponse: + type: object + required: + - id + - name + properties: + id: + type: string + example: '77084a9d-113f-8281-a0d3-efe34b083213' + name: + type: string + example: 'ABC Builders' + + OrganizationsResponse: + type: object + properties: + links: + type: array + items: + $ref: '#/components/schemas/Link' + example: + [ + { + "href": "/t/{root-organization-name}/api/users/v1/me/organizations?limit=10&filter=name+co+der&next=MjAyMS0xMi0yMSAwNToxODozMS4wMDQzNDg=", + "rel": "next", + }, { + "href": "/t/{root-organization-name}/api/users/v1/me/organizations?limit=10&filter=name+co+der&before=MjAyMS0xMi0yMSAwNToxODozMS4wMDQzNDg=", + "rel": "previous", + } + ] + organizations: + type: array + items: + $ref: '#/components/schemas/Organization' + Link: + type: object + properties: + href: + type: string + format: uri + description: Endpoint that will return the next or previous page of data. + rel: + type: string + description: Describes whether the provided link is to access the next or previous page of data. + readOnly: true + Organization: + type: object + required: + - id + - name + - status + - version + - ref + properties: + id: + type: string + example: 'b4526d91-a8bf-43d2-8b14-c548cf73065b' + name: + type: string + example: 'ABC Builders' + status: + type: string + enum: [ ACTIVE, DISABLED ] + example: ACTIVE + version: + type: string + example: 'v1.0.0' + ref: + type: string + example: '/t/{root-organization-name}/api/server/v1/organizations/b4526d91-a8bf-43d2-8b14-c548cf73065b' + + BasicOrganizationObject: + type: object + required: + - id + - name + properties: + id: + type: string + example: '77084a9d-113f-8281-a0d3-efe34b083213' + name: + type: string + example: 'ABC Builders' + + RootDescendantsOrganizationResponse: + type: array + items: + $ref: '#/components/schemas/BasicOrganizationObject' + + Error: + type: object + required: + - code + - message + properties: + code: + type: string + example: UOM-00000 + description: An error code. + message: + type: string + example: Some Error Message + description: An error message. + description: + type: string + example: Some Error Description + description: An error description. + traceId: + type: string + example: e0fbcfeb-3617-43c4-8dd0-7b7d38e13047 + description: An error trace identifier. + + #-------------------------------------------------------- + # Descriptions of error responses. + #-------------------------------------------------------- + responses: + BadRequest: + description: Invalid input in the request. + content: + 'application/json': + schema: + $ref: '#/components/schemas/Error' + NotFound: + description: Resource is not found. + content: + 'application/json': + schema: + $ref: '#/components/schemas/Error' + Unauthorized: + description: Authentication information is missing or invalid. + Forbidden: + description: Access forbidden. + ServerError: + description: Internal server error. + content: + 'application/json': + schema: + $ref: '#/components/schemas/Error' + NotImplemented: + description: Not Implemented. + content: + 'application/json': + schema: + $ref: '#/components/schemas/Error' + + #----------------------------------------------------- + # Applicable authentication mechanisms. + #----------------------------------------------------- + securitySchemes: + OAuth2: + type: oauth2 + flows: + authorizationCode: + authorizationUrl: 'https://api.asgardeo.io/t/{root-organization-name}/oauth2/authorize' + tokenUrl: 'https://api.asgardeo.io/t/{root-organization-name}/oauth2/token' + scopes: {} diff --git a/docusaurus-asgardeo/static/apis/restapis/user-password.yaml b/docusaurus-asgardeo/static/apis/restapis/user-password.yaml new file mode 100644 index 0000000000..7d15d44b07 --- /dev/null +++ b/docusaurus-asgardeo/static/apis/restapis/user-password.yaml @@ -0,0 +1,163 @@ +openapi: 3.0.0 +info: + version: "v1" + title: Asgardeo - Self Password Update API + description: | + This is the RESTful API for self-password updates in Asgardeo, allowing authenticated users to change their own passwords. + + Scope(Permission) required: `internal_user_password_update` + +

      ⚠️ Mandatory Configuration

      +

      To enable this API, you must authorize the following API resource within your application settings in the Asgardeo Console:

      +
        +
      • API Resource: /api/users/v1/me/change-password
      • +
      • Authorization Policy: Set to No Authorization Policy
      • +
      • Required Scope: internal_user_password_update
      • +
      +

      Once these settings are applied, any user who authenticates through the application and requests the internal_user_password_update scope will be granted permission automatically. Applications that have not configured this specific API resource and policy will be unable to support self-password updates via this API.

      +
      +security: + - OAuth2: + - internal_user_password_update +tags: + - name: me + description: Operations for the authenticated user. +servers: + - url: 'https://api.asgardeo.io/t/{organization-name}/api/users/v1' + +paths: + /me/change-password: + post: + tags: + - me + summary: Change user password + description: | + This API is used to change the password of the authenticated user. + + Scope(Permission) required: `internal_user_password_update` + operationId: changePassword + requestBody: + description: Password change request. + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/PasswordChangeRequest' + responses: + '204': + $ref: '#/components/responses/Success' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '500': + $ref: '#/components/responses/ServerError' + +components: + schemas: + #----------------------------------------------------- + # Password Change Request object + #----------------------------------------------------- + PasswordChangeRequest: + type: object + required: + - currentPassword + - newPassword + properties: + currentPassword: + type: string + description: Current password of the user. + example: "CurrentPassword123" + newPassword: + type: string + description: New password to set for the user. + example: "NewPassword456" + + #----------------------------------------------------- + # Error object + #----------------------------------------------------- + Error: + type: object + required: + - code + - message + properties: + code: + type: string + example: "PWD-10001" + message: + type: string + example: "Invalid current password" + description: + type: string + example: "The current password provided is incorrect." + traceId: + type: string + example: "e0fbcfeb-3617-43c4-8dd0-7b7d38e13047" + + #----------------------------------------------------- + # Descriptions of common responses + #----------------------------------------------------- + responses: + Success: + description: Password successfully changed + BadRequest: + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + examples: + InvalidCurrentPassword: + $ref: '#/components/examples/InvalidCurrentPassword' + PasswordPolicyViolation: + $ref: '#/components/examples/PasswordPolicyViolation' + Unauthorized: + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + Forbidden: + description: Forbidden + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + ServerError: + description: Internal Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + + #----------------------------------------------------- + # Examples + #----------------------------------------------------- + examples: + InvalidCurrentPassword: + summary: Wrong current password + value: + code: "PWD-10001" + message: "Invalid current password" + description: "The current password provided is incorrect." + traceId: "e0fbcfeb-3617-43c4-8dd0-7b7d38e13047" + PasswordPolicyViolation: + summary: New password too weak + value: + code: "PWD-10003" + message: "Password policy violation" + description: "The minimum length of password should be 8." + traceId: "e0fbcfeb-3617-43c4-8dd0-7b7d38e13047" + + securitySchemes: + OAuth2: + type: oauth2 + flows: + authorizationCode: + authorizationUrl: 'https://api.asgardeo.io/t/{organization-name}/oauth2/authorize' + tokenUrl: 'https://api.asgardeo.io/t/{organization-name}/oauth2/token' + scopes: + internal_user_password_update: Allows the authenticated user to update their own password. diff --git a/docusaurus-asgardeo/static/apis/restapis/user-store.yaml b/docusaurus-asgardeo/static/apis/restapis/user-store.yaml new file mode 100644 index 0000000000..6cdcb9db5f --- /dev/null +++ b/docusaurus-asgardeo/static/apis/restapis/user-store.yaml @@ -0,0 +1,1187 @@ +openapi: 3.0.0 +info: + description: > + This document specifies the **Userstore Management RESTful API** for Asgardeo. + version: "v1" + title: UserStore Management Rest API + +security: + - OAuth2: [] +paths: + /userstores: + post: + tags: + - User Store + summary: Add a secondary user store. + operationId: addUserStore + description: | + This API provides the capability to add a secondary user store. + + **NOTE:** + + To retrieve the available user store classes/types, use the **api/server/v1/userstores/meta/types** API. + + When creating a user store, it will be **disabled by default**. To enable the user store, include the `disabled` property set to `false` in the properties of the payload. + + Scope(Permission) required: `internal_userstore_create` + responses: + '201': + description: Successful response + headers: + Location: + description: >- + Location of the newly created secondary user store. userstore id is generated as base-64-url-encoded(domain-name) value. + schema: + type: string + content: + application/json: + schema: + $ref: '#/components/schemas/UserStoreResponse' + '400': + $ref: '#/components/responses/InvalidInput' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '409': + $ref: '#/components/responses/Conflict' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/userstores' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -H 'Content-Type: application/json' \ + -d '{ + "typeId": "VW5pcXVlSURKREJDVXNlclN0b3JlTWFuYWdlcg", + "description": "Some description about the user store.", + "name": "JDBC-SECONDARY", + "properties": [ + { + "name": "some property name", + "value": "some property value" + } + ] + }' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/UserStoreReq' + description: Secondary user store to add. + get: + tags: + - User Store + summary: Retrieve the list of secondary user stores + operationId: getSecondaryUserStores + description: | + This API provides the capability to list the configured secondary user stores.
      + + Scope(Permission) required: `internal_userstore_view` + parameters: + - $ref: '#/components/parameters/limitQueryParam' + - $ref: '#/components/parameters/offsetQueryParam' + - $ref: '#/components/parameters/filterQueryParam' + - $ref: '#/components/parameters/sortQueryParam' + - $ref: '#/components/parameters/requiredAttributesQueryParam' + responses: + '200': + description: Successful response. + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/UserStoreListResponse' + '401': + $ref: '#/components/responses/Unauthorized' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + '501': + $ref: '#/components/responses/NotImplemented' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/userstores' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + /userstores/import: + post: + tags: + - User Store + summary: | + Import a secondary user store from a file + description: | + This API provides the capability to import a user store from + the configurations provided as a `YAML`, `JSON` or `XML` file.
      + + Scope(Permission) required: `internal_userstore_create` + operationId: importUserStoreFromFile + requestBody: + content: + multipart/form-data: + schema: + $ref: '#/components/schemas/FileUpload' + description: This represents the user store to be created. + responses: + '201': + description: Successful response + headers: + Location: + description: >- + Location of the newly created secondary userstore. userstore id is generated as base-64-url-encoded(domain-name) value. + schema: + type: string + '400': + $ref: '#/components/responses/InvalidInput' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '409': + $ref: '#/components/responses/Conflict' + '500': + $ref: '#/components/responses/ServerError' + x-codeSample: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/userstores/import' \ + -H 'accept: */*' \ + -H 'Content-Type: multipart/form-data' \ + -F 'file=@file-name.xml;type=text/xml' + /userstores/primary: + get: + tags: + - User Store + summary: >- + Retrieve the configurations of primary user store + operationId: getPrimaryUserStore + description: | + This API provides the capability to retrieve the configurations of the primary user store.
      + + Scope(Permission) required: `internal_userstore_view` + responses: + '200': + description: Successful response. + content: + application/json: + schema: + $ref: '#/components/schemas/UserStoreConfigurationsRes' + '401': + $ref: '#/components/responses/Unauthorized' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/userstores/primary' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + /userstores/{userstore-domain-id}: + get: + tags: + - User Store + summary: >- + Retrieve the configurations of secondary user store based on its domain id + operationId: getUserStoreByDomainId + description: | + This API provides the capability to retrieve the configurations of + a secondary user store based on its domain id.
      + + Scope(Permission) required: `internal_userstore_view` + parameters: + - $ref: '#/components/parameters/domainNamePathParam' + responses: + '200': + description: Successful response. + content: + application/json: + schema: + $ref: '#/components/schemas/UserStoreConfigurationsRes' + '401': + $ref: '#/components/responses/Unauthorized' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/userstores/{userstore-domain-id}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + delete: + tags: + - User Store + summary: Delete a secondary user store + operationId: deleteUserStore + description: | + This API provides the capability to delete a secondary user store based on + matching to the given user store domain id.
      + + Scope(Permission) required: `internal_userstore_delete` + parameters: + - $ref: '#/components/parameters/domainNamePathParam' + responses: + '204': + $ref: '#/components/responses/NoContent' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X 'DELETE' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/userstores/{userstore-domain-id}' \ + -H 'accept: */*' \ + -H 'Authorization: Bearer {bearer_token}' + put: + tags: + - User Store + summary: Update a user store by its domain id + operationId: updateUserStore + description: | + This API provides the capability to edit a user store based on its + domain id
      + + Scope(Permission) required: `internal_userstore_update` + parameters: + - in: path + name: userstore-domain-id + required: true + description: Current domain id of the user store + schema: + type: string + example: SkRCQy1TRUNPTkRBUlk + responses: + '200': + description: Successful response. + content: + application/json: + schema: + $ref: '#/components/schemas/UserStoreResponse' + '400': + $ref: '#/components/responses/InvalidInput' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PUT' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/userstores/{userstore-domain-id}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -H 'Content-Type: application/json' \ + -d '{ + "typeId": "VW5pcXVlSURKREJDVXNlclN0b3JlTWFuYWdlcg", + "description": "Some description about the user store.", + "name": "JDBC-SECONDARY", + "properties": [ + { + "name": "some property name", + "value": "some property value" + } + ] + }' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/UserStoreReq' + # But not allowing to change the typeName and name in the PUT request. + description: >- + The secondary user store values which are needed to be edited for a + given domain id. + patch: + tags: + - User Store + summary: Patch the secondary user store by it's domain id + operationId: patchUserStore + description: | + This API provides the capability to update the secondary user store's + property using patch request by using its domain id. + + Scope(Permission) required: `internal_userstore_update` + parameters: + - $ref: '#/components/parameters/domainNamePathParam' + responses: + '200': + description: Successful response. + content: + application/json: + schema: + $ref: '#/components/schemas/UserStoreResponse' + '400': + $ref: '#/components/responses/InvalidInput' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PATCH' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/userstores/userstore-domain-id' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -H 'Content-Type: application/json' \ + -d '[ + { + "operation": "REPLACE", + "path": "/properties/Disabled", + "value": "true" + } + ]' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchRequest' + required: true + /userstores/{userstore-domain-id}/export: + get: + tags: + - User Store + summary: | + Export a secondary user store by its domain id + description: | + This API provides the capability to retrieve the configurations of a + secondary user store based on its domain id as an `XML`, `YAML`, or `JSON` file.
      + + Scope(Permission) required: `internal_userstore_view` + operationId: exportUserStoreToFile + parameters: + - name: userstore-domain-id + in: path + description: ID of the user store domain. + required: true + schema: + type: string + example: SkRCQy1TRUNPTkRBUlk + - $ref: '#/components/parameters/fileTypeHeaderParam' + responses: + '200': + description: Successful response. + content: + application/json: + schema: + type: string + example: 'Sample userstore configuration in the requested format' + application/yaml: + schema: + type: string + example: 'Sample userstore configuration in the requested format' + application/xml: + schema: + type: string + example: 'Sample userstore configuration in the requested format' + application/octet-stream: + schema: + type: string + example: 'Sample userstore configuration in the requested format' + '400': + $ref: '#/components/responses/InvalidInput' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '409': + $ref: '#/components/responses/Conflict' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/userstores/{domain-id}/export' \ + -H 'accept: application/json' + /userstores/{userstore-domain-id}/import: + put: + tags: + - User Store + summary: | + Update an existing user store by importing configs from a file + description: | + This API provides the capability to update an existing user store by importing + user store configurations provided as a YAML, JSON or XML file.
      + + Scope(Permission) required: `internal_userstore_update` + operationId: updateUserStoreFromFile + parameters: + - name: userstore-domain-id + in: path + description: ID of the user store. + required: true + schema: + type: string + requestBody: + content: + multipart/form-data: + schema: + $ref: '#/components/schemas/FileUpload' + description: This represents the user store to be updated. + responses: + '200': + description: Successfully Updated. + headers: + Location: + description: >- + Location of the updated userstore. userstore id is generated as base-64-url-encoded(domain-name) value. + schema: + type: string + '400': + $ref: '#/components/responses/InvalidInput' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PUT' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/userstores/{userstore-domain-id}/import' \ + -H 'accept: */*' \ + -H 'Content-Type: multipart/form-data' \ + -F 'file=@file-name.xml;type=text/xml' + /userstores/{userstore-domain-id}/attribute-mappings: + patch: + tags: + - User Store + summary: Update the secondary user store attribute mappings by it's domain id. + operationId: updateAttributeMappings + description: | + This API provides the capability to update the secondary user store's attribute mappings using patch request by using its domain id.
      + + Scope(Permission) required: `internal_userstore_update` + parameters: + - $ref: '#/components/parameters/domainNamePathParam' + responses: + '200': + $ref: '#/components/responses/OK' + '400': + $ref: '#/components/responses/InvalidInput' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/AttributeMappingsReq' + required: true + x-codeSamples: + - lang: Curl + source: | + curl --location --request PATCH 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/userstores/{userstore-domain-id}/attribute-mappings' \ + -H 'Content-Type: application/json' \ + -H 'Accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '[ + { + "claimURI": "http://wso2.org/claims/username", + "mappedAttribute": "username" + } + ]' + /userstores/meta/types: + get: + tags: + - Meta + summary: Retrieve the available user store classes/types + operationId: getAvailableUserStoreTypes + description: | + This API provides the capability to retrieve the available user store + types
      + + Scope(Permission) required: `internal_userstore_view` + responses: + '200': + description: Successful Response. + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/AvailableUserStoreClassesRes' + '401': + $ref: '#/components/responses/Unauthorized' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/userstores/meta/types' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + /userstores/meta/types/{type-id}: + get: + tags: + - Meta + summary: >- + Retrieve the properties of secondary user store of a given user store type + operationId: getUserStoreManagerProperties + description: | + This API provides the capability to retrieve the properties of secondary + user store of a given class name.
      + + Scope(Permission) required: `internal_userstore_view` + parameters: + - in: path + name: type-id + required: true + description: Id of the user store type + schema: + type: string + responses: + '200': + description: Successful response. + content: + application/json: + schema: + $ref: '#/components/schemas/MetaUserStoreType' + '400': + $ref: '#/components/responses/InvalidInput' + '401': + $ref: '#/components/responses/Unauthorized' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + '501': + $ref: '#/components/responses/NotImplemented' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/userstores/meta/types/{user-store-type-id}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + '/userstores/meta/types/{type-id}/attributes': + get: + tags: + - Meta + summary: >- + Retrieve the meta attributes of a user store of a given user store type. + operationId: getUserStoreAttributeMappings + description: | + This API provides the capability to retrieve the attribute mappings + of a given user store type.
      + + Scope(Permission) required: `internal_userstore_view` + parameters: + - in: path + name: type-id + required: true + description: Id of the user store type + schema: + type: string + - $ref: '#/components/parameters/includeIdentityClaimsQueryParam' + responses: + '200': + description: Successful Response. + content: + application/json: + schema: + $ref: '#/components/schemas/UserStoreAttributeMappingResponse' + '400': + $ref: '#/components/responses/InvalidInput' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/userstores/meta/types/{user-store-type-id}/attributes' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + /userstores/test-connection: + post: + tags: + - User Store + summary: Test the connection to the datasource used by a JDBC user store manager. + operationId: testRDBMSConnection + description: | + This API provides the capability to test the connection to the + datasource used by a JDBC user store manager.
      + + Scope(Permission) required: `internal_userstore_view` + responses: + '200': + description: Successful response. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectionEstablishedResponse' + '400': + $ref: '#/components/responses/InvalidInput' + '401': + $ref: '#/components/responses/Unauthorized' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X 'POST' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/userstores/test-connection' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -H 'Content-Type: application/json' \ + -d '{ + "driverName": "com.mysql.jdbc.Driver", + "connectionURL": "jdbc:mysql://192.168.48.154:3306/test", + "username": "root", + "connectionPassword": "root" + }' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/RDBMSConnectionReq' + description: >- + RDBMS connection properties used to connect to the datasource used by a + JDBC user store manager. +servers: + - url: 'https://api.asgardeo.io/t/{organization-name}Aq2w3/api/server/v1' +components: + parameters: + domainNamePathParam: + name: userstore-domain-id + in: path + required: true + description: The unique name of the user store domain + schema: + type: string + example: SkRCQy1TRUNPTkRBUlk + includeIdentityClaimsQueryParam: + in: query + name: includeIdentityClaimMappings + required: false + description: Whether to include the identity claim mappings with user store attributes. + example: true + schema: + type: boolean + limitQueryParam: + in: query + name: limit + required: false + description: maximum number of records to return + schema: + type: integer + format: int32 + offsetQueryParam: + in: query + name: offset + required: false + description: number of records to skip for pagination + schema: + type: integer + format: int32 + filterQueryParam: + in: query + name: filter + required: false + description: Condition to filter the retrieval of records. + schema: + type: string + sortQueryParam: + in: query + name: sort + required: false + description: Define the order of how the retrieved records should be sorted. + schema: + type: string + requiredAttributesQueryParam: + in: query + name: requiredAttributes + required: false + description: Define set of user store attributes (as comma separated) to be returned. + schema: + type: string + fileTypeHeaderParam: + in: header + name: Accept + required: false + description: | + Content type of the file. + schema: + type: string + default: application/yaml + enum: + - application/json + - application/xml + - application/yaml + - application/x-yaml + - text/yaml + - text/xml + - text/json + responses: + NotFound: + description: The specified resource is not found. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + Unauthorized: + description: Unauthorized. + ServerError: + description: Internal Server Error. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + NotImplemented: + description: Not Implemented. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + InvalidInput: + description: Invalid input request. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + Conflict: + description: Element Already Exists. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + Deleted: + description: Item Deleted + Created: + description: User Store Created. + OK: + description: OK. + Success: + description: Connection Established. + NoContent: + description: No Content. + Forbidden: + description: Resource Forbidden. + securitySchemes: + OAuth2: + type: oauth2 + flows: + authorizationCode: + authorizationUrl: 'https://api.asgardeo.io/t/{organization-name}/oauth/authorize' + tokenUrl: 'https://api.asgardeo.io/t/{organization-name}/oauth/token' + scopes: + read: Grants read access + write: Grants write access + admin: Grants read and write access to administrative information + schemas: + UserStoreReq: + type: object + required: + - typeId + - description + - name + - properties + description: Secondary user store request. + properties: + typeId: + type: string + description: The id of the user store manager class type. + example: VW5pcXVlSURKREJDVXNlclN0b3JlTWFuYWdlcg + description: + type: string + description: Description of the user store. + example: Some description about the user store. + name: + type: string + description: This is a unique name that identifies the user store. + example: JDBC-SECONDARY + properties: + type: array + description: >- + Various properties related to the user store such as connection URL, + connection password etc. + items: + $ref: '#/components/schemas/Property' + claimAttributeMappings: + type: array + description: Claim attribute mappings. + items: + $ref: '#/components/schemas/ClaimAttributeMapping' + PatchRequest: + type: array + items: + $ref: '#/components/schemas/PatchDocument' + ConnectionEstablishedResponse: + type: object + properties: + connection: + type: boolean + example: true + PatchDocument: + description: A JSONPatch document as defined by RFC 6902 + required: + - operation + - path + properties: + operation: + type: string + description: The operation to be performed + enum: + - ADD + - REMOVE + - REPLACE + example: REPLACE + path: + type: string + description: A JSON-Pointer + example: /properties/Disabled + value: + type: string + description: The value to be used within the operations + example: 'true' + RDBMSConnectionReq: + required: + - driverName + - connectionURL + - username + - connectionPassword + description: RDBMS Connection Request. + properties: + domain: + type: string + description: User store domain name. + example: PRIMARY + driverName: + type: string + description: Driver Name. + example: com.mysql.jdbc.Driver + connectionURL: + type: string + description: The Connection URL. + example: 'jdbc:mysql://192.168.48.154:3306/test' + username: + type: string + description: The username. + example: root + connectionPassword: + type: string + description: The password. + example: root + ClaimAttributeMapping: + type: object + required: + - claimURI + - mappedAttribute + properties: + claimURI: + type: string + description: A unique URI specific to the claim. + example: "http://wso2.org/claims/username" + mappedAttribute: + type: string + description: Userstore attribute to be mapped to. + example: "username" + AttributeMappingsReq: + type: array + description: Array of ClaimURI attribute mappings. + items: + $ref: '#/components/schemas/ClaimAttributeMapping' + Error: + type: object + required: + - code + - message + properties: + code: + type: string + example: AAA-00000 + message: + type: string + example: Some Error Message + description: + type: string + example: Some Error Description + Property: + type: object + required: + - name + - value + properties: + name: + type: string + example: some property name + value: + type: string + example: some property value + UserStoreListResponse: + type: object + properties: + id: + type: string + example: SkRCQy1TRUNPTkRBUlk + description: base64 url encoded value of domain name + name: + type: string + example: JDBC-SECONDARY + description: Domain name of the secondary user store. + enabled: + type: boolean + example: true + description: Enabled status of the userstore. + description: + type: string + example: Some description of the user store + isLocal: + type: boolean + example: true + description: Whether the user store is local or not. + self: + type: string + example: /t/{organization-name}/api/server/v1/userstores/SkRCQy1TRUNPTkRBUlk + description: Location of the created/updated resource. + typeName: + type: string + example: UniqueIDJDBCUserStoreManager + description: User store type name. + properties: + type: array + description: Requested configured user store property for the set + items: + $ref: '#/components/schemas/AddUserStorePropertiesRes' + MetaUserStoreType: + type: object + properties: + typeName: + type: string + example: UniqueIDJDBCUserStoreManager + typeId: + type: string + example: b3JnLndzbzIuY2FyYm9uLnVzZXIuY29yZS5qZGJjLkpEQkNVc2VyU3RvcmVNYW5hZ2Vy + className: + type: string + example: org.wso2.carbon.user.core.jdbc.UniqueIDJDBCUserStoreManager + isLocal: + type: boolean + example: true + description: Whether the user store is local or not. + properties: + $ref: '#/components/schemas/UserStorePropertiesRes' + UserStoreResponse: + type: object + properties: + id: + type: string + example: SkRCQy1TRUNPTkRBUlk= + description: base64 url encoded value of domain name + name: + type: string + example: JDBC-SECONDARY + description: domain name of the secondary user store + typeName: + type: string + example: UniqueIDJDBCUserStoreManager + typeId: + type: string + example: VW5pcXVlSURKREJDVXNlclN0b3JlTWFuYWdlcg + description: + type: string + example: Some description of the user store + properties: + type: array + description: Configured user store proper for the set. + items: + $ref: '#/components/schemas/AddUserStorePropertiesRes' + claimAttributeMappings: + type: array + description: Configured user store claim attribute mappings + items: + $ref: '#/components/schemas/ClaimAttributeMapping' + AvailableUserStoreClassesRes: + type: object + description: Available User Store Classes Response. + properties: + typeId: + type: string + example: VW5pcXVlSURKREJDVXNlclN0b3JlTWFuYWdlcg + typeName: + type: string + example: UniqueIDJDBCUserStoreManager + className: + type: string + example: org.wso2.carbon.user.core.jdbc.UniqueIDJDBCUserStoreManager + isLocal: + type: boolean + example: true + description: Whether the user store is local or not. + self: + type: string + example: /t/{organization-name}/api/server/v1/userstores/meta/types/VW5pcXVlSURKREJDVXNlclN0b3JlTWFuYWdlcg + UserStoreConfigurationsRes: + type: object + description: Available User Store Configurations Response. + properties: + typeName: + type: string + example: UniqueIDJDBCUserStoreManager + typeId: + type: string + example: VW5pcXVlSURKREJDVXNlclN0b3JlTWFuYWdlcg + name: + type: string + example: JDBC-SECONDARY + description: + type: string + example: Some description of the user store + className: + type: string + example: org.wso2.carbon.user.core.jdbc.UniqueIDJDBCUserStoreManager + isLocal: + type: boolean + example: true + description: Whether the user store is local or not. + properties: + type: array + description: Configured user store property for the set + items: + $ref: '#/components/schemas/AddUserStorePropertiesRes' + claimAttributeMappings: + type: array + description: Requested configured user store claim attribute mappings. + items: + $ref: '#/components/schemas/ClaimAttributeMapping' + AddUserStorePropertiesRes: + type: object + description: Available User Store Properties. + required: + - name + - value + properties: + name: + type: string + example: ConnectionName + value: + type: string + example: 'CN=,DC=' + UserStorePropertiesRes: + properties: + Mandatory: + type: array + items: + $ref: '#/components/schemas/PropertiesRes' + Optional: + type: array + items: + $ref: '#/components/schemas/PropertiesRes' + Advanced: + type: array + items: + $ref: '#/components/schemas/PropertiesRes' + PropertiesRes: + type: object + properties: + name: + type: string + example: Some Mandatory Property Name + defaultValue: + type: string + example: Some Mandatory Property Value + description: + type: string + example: Description of the property + attributes: + type: array + items: + $ref: '#/components/schemas/Attribute' + Attribute: + type: object + properties: + name: + type: string + example: category + value: + type: string + example: basic + UserStoreAttributeMappingResponse: + type: object + properties: + typeName: + type: string + description: Type name of the user store. + example: org.wso2.carbon.user.core.ldap.UniqueIDActiveDirectoryUserStoreManager + typeId: + type: string + description: Type id of the user store. + example: b3JnLndzbzIuY2FyYm9uLnVzZXIuY29yZS5qZGJjLkpEQkNVc2VyU3RvcmVNYW5hZ2Vy + isLocal: + type: boolean + description: Whether the user store is local or not. + example: true + attributeMappings: + type: array + description: User store attribute mappings. + items: + $ref: '#/components/schemas/UserStoreAttributeResponse' + UserStoreAttributeResponse: + type: object + properties: + claimId: + type: string + description: Claim id of the attribute. + example: bzIuY2FyYm9uLnVzZXIuY29yZS5qZG + claimURI: + type: string + description: Claim URI of the attribute. + example: http://wso2.org/claims/givenname + mappedAttribute: + type: string + description: Mapped attribute name. + example: givenName + displayName: + type: string + description: Display name of the attribute. + example: First Name + FileUpload: + type: object + properties: + file: + type: string + format: binary + description: File uploaded during import. diff --git a/docusaurus-asgardeo/static/apis/restapis/validation.yaml b/docusaurus-asgardeo/static/apis/restapis/validation.yaml new file mode 100644 index 0000000000..68c916364d --- /dev/null +++ b/docusaurus-asgardeo/static/apis/restapis/validation.yaml @@ -0,0 +1,443 @@ +openapi: 3.0.0 +info: + version: "v1" + title: Asgardeo - Validation API + description: + "This is the RESTful API for managing input validation configuration for an organization in WSO2 Asgardeo. + This API allows retrieving and updating the input validation configurations." +servers: + - url: 'https://api.asgardeo.io/t/{organization-name}/api/server/v1' +security: + - OAuth2: [] +paths: + /validation-rules: + get: + tags: + - Validation Rules + description: Get validation rules for user inputs (e.g., password). + operationId: Get Validation Rules + responses: + '200': + $ref: '#/components/responses/Success' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/validation-rules' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + put: + tags: + - Validation Rules + description: | + Update validation rules for user inputs. + + Scopes required: `internal_config_mgt_update` + operationId: Update Validation Rules + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationConfiguration' + examples: + Rules: + value: + - field: password/username + rules: + - validator: LengthValidator + properties: + - key: min.length + value: 5 + - key: max.length + value: 15 + Regex: + value: + - field: password/username + regEx: + - validator: JavaRegExValidator + properties: + - key: java.regex + value: (?=.*[A-Z]) + description: Represents the validation criteria. + required: true + responses: + '200': + $ref: '#/components/responses/Success' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PUT' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/validation-rules' \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '[ + { + "field": "password/username", + "rules": [ + { + "validator": "LengthValidator", + "properties": [ + { + "key": "min.length", + "value": 5 + }, + { + "key": "max.length", + "value": 15 + } + ] + } + ] + } + ]' + /validation-rules/{field}: + get: + tags: + - Validation Rules for a specific field + description: Get validation rules for a particular field of user inputs (e.g., password). + operationId: Get Validation Rules for a field + parameters: + - name: field + in: path + description: name of the field + required: true + style: simple + explode: false + schema: + type: string + responses: + '200': + $ref: '#/components/responses/SuccessForField' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/validation-rules/{field-name}' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' + put: + tags: + - Validation Rules for a specific field + description: | + Update validation rules of a particular field of user inputs. + + Scopes required: `internal_config_mgt_update` + operationId: Update validation rules for a user inputs field + parameters: + - name: field + in: path + description: name of the field + required: true + style: simple + explode: false + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ValidationConfigModelForField' + example: + rules: + - validator: LengthValidator + properties: + - key: min.length + value: 5 + - key: max.length + value: 15 + description: Represents the validation criteria. + required: true + responses: + '200': + $ref: '#/components/responses/SuccessForField' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X 'PUT' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/validation-rules/field-name' \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer {bearer_token}' \ + -d '{ + "rules": [ + { + "validator": "LengthValidator", + "properties": [ + { + "key": "min.length", + "value": 5 + }, + { + "key": "max.length", + "value": 15 + } + ] + } + ] + }' + /validation-rules/validators: + get: + tags: + - Validators + description: Retrieve all available validators that can be configured. + operationId: Get available Validators + responses: + '200': + description: Configurations successfully updated. + content: + 'application/json': + schema: + type: array + items: + $ref: '#/components/schemas/ValidatorModel' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '500': + $ref: '#/components/responses/ServerError' + x-codeSamples: + - lang: Curl + source: | + curl -X 'GET' \ + 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/validation-rules/validators' \ + -H 'accept: application/json' \ + -H 'Authorization: Bearer {bearer_token}' +components: + schemas: + ValidatorModel: + type: object + properties: + type: + type: string + enum: + - RULE + - REGEX + name: + type: string + example: LengthValidator + properties: + type: array + items: + $ref: '#/components/schemas/PropertyModel' + PropertyModel: + type: object + properties: + name: + type: string + example: min.length + description: Name of the validator property. + description: + type: string + example: Minimum length required + description: Description for the validator property. + displayName: + type: string + example: Minimum limit + description: Display name for the validator property. + type: + type: string + example: int + description: Type of the validator property value. + displayOrder: + type: integer + example: 1 + description: Display the order of the validator property. + ValidationConfiguration: + type: array + items: + $ref: '#/components/schemas/ValidationConfigModel' + ValidationConfigModel: + type: object + required: + - field + properties: + field: + type: string + example: password + rules: + type: array + items: + $ref: '#/components/schemas/RuleModel' + regEx: + type: array + items: + $ref: '#/components/schemas/RuleModel' + ValidationConfigModelForField: + type: object + properties: + rules: + type: array + items: + $ref: '#/components/schemas/RuleModel' + regEx: + type: array + items: + $ref: '#/components/schemas/RuleModel' + RuleModel: + type: object + required: + - validator + - properties + properties: + validator: + type: string + example: lengthValidator + description: Name of the validator. + properties: + type: array + items: + $ref: '#/components/schemas/MappingModel' + MappingModel: + type: object + required: + - key + - value + properties: + key: + type: string + description: Name of the validator property. + value: + type: string + description: Value of the validator property. + Error: + type: object + required: + - code + - message + properties: + code: + type: string + example: VR-60001 + message: + type: string + example: Some Error Message + description: + type: string + example: Some Error Description + NotFoundError: + type: object + required: + - code + - message + properties: + code: + type: string + example: IVM-60002 + message: + type: string + example: Field is not found. + description: + type: string + example: Invalid or unsupported field is provided. + responses: + Unauthorized: + description: Unauthorized + Forbidden: + description: Resource Forbidden + ServerError: + description: Internal Server Error + content: + 'application/json': + schema: + $ref: '#/components/schemas/Error' + BadRequest: + description: Invalid Input Request + content: + 'application/json': + schema: + $ref: '#/components/schemas/Error' + NotFound: + description: Invalid or unsupported field is provided. + content: + 'application/json': + schema: + $ref: '#/components/schemas/NotFoundError' + Success: + description: Configurations successfully updated. + content: + 'application/json': + schema: + $ref: '#/components/schemas/ValidationConfiguration' + examples: + Rules: + value: + - field: password/username + rules: + - validator: LengthValidator + properties: + - key: min.length + value: 5 + - key: max.length + value: 15 + Regex: + value: + - field: password/username + regEx: + - validator: JavaRegExValidator + properties: + - key: java.regex + value: (?=.*[A-Z]) + SuccessForField: + description: Successfully updated configurations for the field. + content: + 'application/json': + schema: + $ref: '#/components/schemas/ValidationConfigModel' + example: + field: password/username + rules: + - validator: LengthValidator + properties: + - key: min.length + value: 5 + - key: max.length + value: 15 + securitySchemes: + OAuth2: + type: oauth2 + flows: + clientCredentials: + tokenUrl: 'https://api.asgardeo.io/t/{org-name}/oauth2/token' + scopes: + internal_config_mgt_update: Grants permission to update validation configurations + \ No newline at end of file diff --git a/docusaurus-asgardeo/static/apis/restapis/vc-templates.yaml b/docusaurus-asgardeo/static/apis/restapis/vc-templates.yaml new file mode 100644 index 0000000000..0a761ddc14 --- /dev/null +++ b/docusaurus-asgardeo/static/apis/restapis/vc-templates.yaml @@ -0,0 +1,495 @@ +openapi: 3.0.0 +info: + title: "Asgardeo Verifiable Credential Template Management API" + version: "v1" + description: "Admin API for managing verifiable credential templates in Asgardeo." + contact: + name: WSO2 + url: 'https://wso2.com/asgardeo/' + email: architecture@wso2.org + license: + name: Apache 2.0 + url: 'http://www.apache.org/licenses/LICENSE-2.0.html' + +security: + - OAuth2: [] + +servers: + - url: 'https://api.asgardeo.io/t/{organization-name}/api/server/v1' + +paths: + /vc-templates: + get: + tags: ["VC Templates"] + summary: "List templates" + operationId: "listVCTemplates" + parameters: + - $ref: '#/components/parameters/before' + - $ref: '#/components/parameters/after' + - $ref: '#/components/parameters/filter' + - $ref: '#/components/parameters/limit' + - $ref: '#/components/parameters/attributes' + responses: + "200": + description: "Array of templates" + content: + application/json: + schema: + $ref: "#/components/schemas/VCTemplateList" + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + post: + tags: ["VC Templates"] + summary: "Add new template" + operationId: "addVCTemplate" + requestBody: + required: true + content: + application/json: + schema: { $ref: "#/components/schemas/VCTemplateCreationModel" } + examples: + createEmployeeBadge: + value: + identifier: "EmployeeBadge" + displayName: "EmployeeBadge" + format: "jwt_vc_json" + claims: + - name: "given_name" + type: "LOCAL" + claimUri: "http://wso2.org/claims/givenname" + - name: "email" + type: "LOCAL" + claimUri: "http://wso2.org/claims/emailaddress" + expiresIn: 31536000 + responses: + '201': + description: "Created" + headers: + Location: + schema: { type: string } + example: "/api/server/v1/vc-templates/7e5f9d2a-6b5e-4df6-9b87-8a3d1a4a0c31" + content: + application/json: + schema: { $ref: "#/components/schemas/VCTemplate" } + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + + /vc-templates/{template-id}: + parameters: + - in: path + name: template-id + required: true + schema: { type: string} + description: "Server-generated UUID of the template." + get: + tags: ["VC Templates"] + summary: "Get template" + operationId: "getVCTemplate" + responses: + "200": + description: "Template" + content: + application/json: + schema: { $ref: "#/components/schemas/VCTemplate" } + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + put: + tags: ["VC Templates"] + summary: "Update template" + operationId: "updateVCTemplate" + requestBody: + required: true + content: + application/json: + schema: { $ref: "#/components/schemas/VCTemplateUpdateModel" } + responses: + "200": + description: "Updated" + content: + application/json: + schema: { $ref: "#/components/schemas/VCTemplate" } + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + delete: + tags: ["VC Templates"] + summary: "Delete template" + operationId: "deleteVCTemplate" + responses: + '204': + description: Template Deleted + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + + /vc-templates/{template-id}/offer: + parameters: + - in: path + name: template-id + required: true + schema: { type: string } + description: "Server-generated UUID of the template." + post: + tags: ["VC Templates"] + summary: "Generate or regenerate credential offer" + description: "Creates a new credential offer." + operationId: "generateVCCredentialOffer" + responses: + '200': + description: "Offer generated or regenerated successfully" + content: + application/json: + schema: + $ref: '#/components/schemas/VCTemplate' + '404': + description: "Template not found" + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + delete: + tags: ["VC Templates"] + summary: "Revoke credential offer" + description: "Revokes and deletes the existing credential offer." + operationId: "revokeVCCredentialOffer" + responses: + '200': + description: "Offer revoked successfully" + content: + application/json: + schema: + $ref: '#/components/schemas/VCTemplate' + '404': + description: "Template or offer not found" + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + +components: + securitySchemes: + BasicAuth: + type: http + scheme: basic + OAuth2: + type: oauth2 + flows: + authorizationCode: + authorizationUrl: 'https://api.asgardeo.io/t/{organization-name}/oauth2/authorize' + tokenUrl: 'https://api.asgardeo.io/t/{organization-name}/oauth2/token' + scopes: {} + + schemas: + VCTemplate: + type: object + required: + - id + - identifier + - displayName + - format + - claims + - expiresIn + properties: + id: + type: string + example: "7e5f9d2a-6b5e-4df6-9b87-8a3d1a4a0c31" + identifier: + type: string + description: "Stable key; human/machine readable." + example: "EmployeeBadge" + displayName: + type: string + description: "Display name of the template" + example: "EmployeeBadge" + description: + type: string + description: "Description name of the template" + example: "EmployeeBadge" + format: + type: string + example: jwt_vc_json + claims: + type: array + items: + $ref: '#/components/schemas/Claim' + expiresIn: + type: integer + example: 31536000 + offerId: + type: string + nullable: true + description: "Backend-generated UUID for the credential offer. Null if no offer has been generated." + example: "a1b2c3d4-e5f6-7890-abcd-ef1234567890" + VCTemplateCreationModel: + type: object + required: + - identifier + - format + - claims + - expiresIn + properties: + identifier: + type: string + displayName: + type: string + description: "Display name of the template" + description: + type: string + description: "Description name of the template" + example: "EmployeeBadge" + format: + type: string + claims: + type: array + items: + $ref: '#/components/schemas/Claim' + expiresIn: + type: integer + minimum: 60 + VCTemplateList: + type: object + properties: + totalResults: + type: integer + example: 1 + links: + type: array + items: + $ref: '#/components/schemas/PaginationLink' + VCTemplates: + type: array + items: + $ref: '#/components/schemas/VCTemplateListItem' + VCTemplateListItem: + type: object + required: + - id + - identifier + - displayName + properties: + id: + type: string + example: "7e5f9d2a-6b5e-4df6-9b87-8a3d1a4a0c31" + identifier: + type: string + description: "Stable key; human/machine readable." + example: "EmployeeBadge" + displayName: + type: string + description: "Published as `credential_template_id` in issuer metadata. Defaults to `identifier` if omitted." + example: "EmployeeBadge" + VCTemplateUpdateModel: + type: object + description: "Fields allowed to change after creation." + properties: + displayName: + type: string + description: "If not provided, server sets to `identifier`." + format: + type: string + claims: + type: array + items: + $ref: '#/components/schemas/Claim' + expiresIn: + type: integer + minimum: 60 + Claim: + type: object + required: + - name + - type + - claimUri + properties: + name: + type: string + description: "The claim name as it appears in the issued VC." + example: "given_name" + type: + type: string + example: "LOCAL" + claimUri: + type: string + description: > + The claim reference used for resolution. For LOCAL, this is the WSO2 IS + claim URI. + example: "http://wso2.org/claims/givenname" + PaginationLink: + type: object + properties: + rel: + type: string + example: before + href: + type: string + example: /api/server/v1/vc-templates?after=NDoy + Error: + type: object + properties: + code: + type: string + example: Some error code. + message: + type: string + example: Some error message. + description: + type: string + example: Some error description. + traceId: + type: string + example: e0fbcfeb-3617-43c4-8dd0-7b7d38e13047 + + parameters: + before: + name: before + in: query + required: false + description: | + Base64 encoded cursor value for backward pagination. + schema: + type: string + example: Ng== + + after: + name: after + in: query + required: false + description: | + Base64 encoded cursor value for forward pagination. + schema: + type: string + example: Ng== + + filter: + name: filter + in: query + required: false + description: | + Condition to filter the retrieval of records. Supports 'sw', 'co', 'ew' and 'eq' operations. + schema: + type: string + example: identifier+eq+greetings + + limit: + name: limit + in: query + required: false + description: | + Maximum number of records to return. + schema: + type: integer + example: 10 + + attributes: + name: attributes + in: query + required: false + description: Specifies the required attributes in the response. Only 'properties' attribute is currently supported. + schema: + type: string diff --git a/docusaurus-asgardeo/static/apis/restapis/verification-code-management-me.yaml b/docusaurus-asgardeo/static/apis/restapis/verification-code-management-me.yaml new file mode 100644 index 0000000000..de2ee8fbee --- /dev/null +++ b/docusaurus-asgardeo/static/apis/restapis/verification-code-management-me.yaml @@ -0,0 +1,167 @@ +openapi: 3.1.0 +info: + title: Verification Code Management Me API + description: | + This API provides endpoints for the authenticated user to manage verification codes. + version: 1.0.0 +servers: + - url: https://api.asgardeo.io/t/{organization-name}/api/identity/user/v1.0 +security: + - OAuth2: [] +tags: + - name: me + description: Operations for the authenticated user +paths: + /me/validate-code: + post: + tags: + - me + summary: Validate code + description: | + This API is used by the authenticated user to validate a verification code. + + Scope(Permission) required: `internal_login` + operationId: meValidateCode + requestBody: + description: The validation code retrieved for the verification scenario and optional properties. + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/MeCodeValidationRequest' + responses: + '202': + description: Accepted + content: {} + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X POST \ + -H "Authorization: Bearer " \ + -H "Content-Type: application/json" \ + -d '{ + "code": "string", + "properties": [] + }' \ + "https://api.asgardeo.io/t/{organization-name}/api/identity/user/v1.0/me/validate-code" + /me/resend-code: + post: + tags: + - me + summary: Resend code + description: | + This API is used by the authenticated user to resend a verification code. + + Scope(Permission) required: `internal_login` + operationId: meResendCode + requestBody: + description: Optional property parameters. + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/MeResendCodeRequest' + responses: + '201': + description: Created + content: {} + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X POST \ + -H "Authorization: Bearer " \ + -H "Content-Type: application/json" \ + -d '{ + "properties": [ + { + "key": "string", + "value": "string" + } + ] + }' \ + "https://api.asgardeo.io/t/{organization-name}/api/identity/user/v1.0/me/resend-code" +components: + schemas: + MeCodeValidationRequest: + type: object + required: + - code + properties: + code: + type: string + properties: + type: array + items: + $ref: '#/components/schemas/Property' + MeResendCodeRequest: + type: object + required: + - properties + properties: + properties: + type: array + items: + $ref: '#/components/schemas/Property' + Property: + type: object + properties: + key: + type: string + value: + type: string + Error: + type: object + properties: + code: + type: string + message: + type: string + description: + type: string + traceId: + type: string + securitySchemes: + OAuth2: + type: oauth2 + flows: + authorizationCode: + authorizationUrl: 'https://api.asgardeo.io/t/{organization-name}/oauth2/authorize' + tokenUrl: 'https://api.asgardeo.io/t/{organization-name}/oauth2/token' + scopes: + internal_login: Grant permission for an authenticated user for self management. diff --git a/docusaurus-asgardeo/static/apis/restapis/verification-code-management.yaml b/docusaurus-asgardeo/static/apis/restapis/verification-code-management.yaml new file mode 100644 index 0000000000..afc20289c1 --- /dev/null +++ b/docusaurus-asgardeo/static/apis/restapis/verification-code-management.yaml @@ -0,0 +1,175 @@ +openapi: 3.1.0 +info: + title: Verification Code Management API + description: | + This API manages verification codes for various verification scenarios including validation and resending. + version: 1.0.0 +servers: + - url: https://api.asgardeo.io/t/{organization-name}/api/identity/user/v1.0 +security: + - OAuth2: [] + +paths: + /validate-code: + post: + tags: + - Verification Code + summary: Validate code + description: | + This API is used to validate the code generated during the verification process associated with a user. + + Scope(Permission) required: `internal_user_code_mgt_create` + operationId: validateCode + requestBody: + description: The validation code retrieved for the verification scenario, and optional property parameters. + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/CodeValidationRequest' + responses: + '202': + description: Accepted + content: {} + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X POST \ + -H "Authorization: Bearer " \ + -H "Content-Type: application/json" \ + -d '{ + "code": "string", + "properties": [] + }' \ + "https://api.asgardeo.io/t/{organization-name}/api/identity/user/v1.0/validate-code" + /resend-code: + post: + tags: + - Verification Code + summary: Resend code + description: | + This API is used to resend the confirmation code if it is missing. + + Scope(Permission) required: `internal_user_code_mgt_create` + operationId: resendCode + requestBody: + description: User information and optional property parameters to resend the verification code. + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/ResendCodeRequest' + responses: + '201': + description: Created + content: {} + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Server Error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl -X POST \ + -H 'Authorization: Bearer ' \ + -H 'Content-Type: application/json' \ + -d '{ + "user": { + "username": "string", + "realm": "string" + }, + "properties": [ + { + "key": "string", + "value": "string" + } + ] + }' \ + 'https://api.asgardeo.io/t/{organization-name}/api/identity/user/v1.0/resend-code' +components: + schemas: + CodeValidationRequest: + type: object + properties: + code: + type: string + properties: + type: array + items: + $ref: '#/components/schemas/Property' + Error: + type: object + properties: + code: + type: string + message: + type: string + description: + type: string + traceId: + type: string + Property: + type: object + properties: + key: + type: string + value: + type: string + ResendCodeRequest: + type: object + properties: + user: + $ref: '#/components/schemas/User' + properties: + type: array + items: + $ref: '#/components/schemas/Property' + User: + type: object + properties: + username: + type: string + realm: + type: string + securitySchemes: + OAuth2: + type: oauth2 + flows: + authorizationCode: + authorizationUrl: https://api.asgardeo.io/t/{organization-name}/oauth2/authorize + tokenUrl: https://api.asgardeo.io/t/{organization-name}/oauth2/token + scopes: + internal_user_code_mgt_create: Grants create access to user code management in the organization (root) + diff --git a/docusaurus-asgardeo/static/apis/restapis/webhook-management.yaml b/docusaurus-asgardeo/static/apis/restapis/webhook-management.yaml new file mode 100644 index 0000000000..f25570d5f4 --- /dev/null +++ b/docusaurus-asgardeo/static/apis/restapis/webhook-management.yaml @@ -0,0 +1,530 @@ +openapi: 3.0.0 +info: + version: v1 + title: Asgardeo - Webhook Management Rest API + description: > + The Webhook Management REST API provides a standardized interface to manage webhooks within Asgardeo. Webhooks allow external systems to receive real-time notifications for various events, such as login successes or failures, enabling seamless integration and automation across external applications and services. + This API empowers developers and administrators to create, update, delete, and retrieve webhook configurations tailored to their specific business needs and event-driven workflows. +servers: + - url: 'https://api.asgardeo.io/t/{organization-name}/api/server/v1' +security: + - OAuth2: [] + +paths: + /webhooks: + get: + summary: List Webhooks + description: "This API returns the detailed summary of the webhooks.\n\n Scope(Permission) required: `internal_webhook_view` \n\n" + operationId: getWebhooks + tags: + - Webhooks + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/WebhookList' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '500': + description: Internal server error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/webhooks' -H 'Authorization: Bearer {bearer_token}' + + post: + summary: Add Webhook + description: "Create a new webhook. \n\n Scope(Permission) required: `internal_webhook_create` \n\n" + operationId: createWebhook + tags: + - Webhooks + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/WebhookRequest' + responses: + '201': + description: Webhook Created + content: + application/json: + schema: + $ref: '#/components/schemas/WebhookResponse' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '500': + description: Internal server error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location --request POST 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/webhooks' \ + -H 'Authorization: Bearer {bearer_token}' \ + -H 'Content-Type: application/json' \ + -d '{ + "endpoint": "https://example.com/webhook", + "name": "Login Webhook", + "secret": "my-secret", + "channelsSubscribed": ["https://schemas.identity.wso2.org/events/login", "https://schemas.identity.wso2.org/events/registration"], + "eventProfile": { + "name": "WSO2", + "uri": "https://schemas.identity.wso2.org/events" + }, + "status": "ACTIVE" + }' + + /webhooks/{webhookId}: + get: + summary: Retrieve Webhook by ID + description: "This API returns the webhook details along with the webhook unique ID. \n\n Scope(Permission) required: `internal_webhook_view` \n\n" + operationId: getWebhookByWebhookId + tags: + - Webhooks + parameters: + - name: webhookId + in: path + required: true + schema: + type: string + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/WebhookResponse' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Webhook not found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Internal server error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/webhooks/{webhookId}' -H 'Authorization: Bearer {bearer_token}' + + delete: + summary: Delete Webhook + description: "This API deletes a webhook using the webhook unique ID. \n\n Scope(Permission) required: `internal_webhook_delete` \n\n" + operationId: deleteWebhook + tags: + - Webhooks + parameters: + - name: webhookId + in: path + required: true + schema: + type: string + responses: + '204': + description: Webhook Deleted + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Webhook not found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Internal server error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location --request DELETE 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/webhooks/{webhookId}' -H 'Authorization: Bearer {bearer_token}' + + + /webhooks/{webhookId}/activate: + post: + summary: Activate Webhook + description: "Activate a webhook by its unique ID.\n\n Scope(Permission) required: `internal_webhook_update` \n\n" + operationId: activateWebhook + tags: + - Webhooks + parameters: + - name: webhookId + in: path + required: true + schema: + type: string + responses: + '200': + description: Webhook Activated + content: + application/json: + schema: + $ref: '#/components/schemas/WebhookResponse' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Webhook not found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Internal server error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location --request POST 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/webhooks/{webhookId}/activate' \ + -H 'Authorization: Bearer {bearer_token}' + + /webhooks/{webhookId}/deactivate: + post: + summary: Deactivate Webhook + description: "Deactivate a webhook by its unique ID.\n\n Scope(Permission) required: `internal_webhook_update` \n\n" + operationId: deactivateWebhook + tags: + - Webhooks + parameters: + - name: webhookId + in: path + required: true + schema: + type: string + responses: + '200': + description: Webhook Deactivated + content: + application/json: + schema: + $ref: '#/components/schemas/WebhookResponse' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Webhook not found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Internal server error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location --request POST 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/webhooks/{webhookId}/deactivate' \ + -H 'Authorization: Bearer {bearer_token}' + + /webhooks/{webhookId}/retry: + post: + summary: Retry Webhook Subscription or Unsubscription + description: "Retry a webhook subscription or unsubscription by its unique ID.\n\n Scope(Permission) required: `internal_webhook_update` \n\n" + operationId: retryWebhook + tags: + - Webhooks + parameters: + - name: webhookId + in: path + required: true + schema: + type: string + responses: + '200': + description: Webhook Retried + content: + application/json: + schema: + $ref: '#/components/schemas/WebhookResponse' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Webhook not found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Internal server error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location --request POST 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/webhooks/{webhookId}/retry' \ + -H 'Authorization: Bearer {bearer_token}' + +components: + securitySchemes: + BasicAuth: + type: http + scheme: basic + OAuth2: + type: oauth2 + flows: + authorizationCode: + authorizationUrl: 'https://api.asgardeo.io/t/{org-name}/oauth2/authorize' + tokenUrl: 'https://api.asgardeo.io/t/{org-name}/oauth2/token' + scopes: + internal_webhook_view: View webhooks + internal_webhook_create: Create webhooks + internal_webhook_update: Update webhooks + internal_webhook_delete: Delete webhooks + + schemas: + WebhookRequest: + type: object + required: + - endpoint + - eventProfile + - name + - channelsSubscribed + properties: + endpoint: + type: string + description: Webhook URL. + example: https://example.com/webhook + eventProfile: + type: object + required: + - name + - uri + properties: + name: + type: string + description: Webhook Event Profile. + example: WSO2 + uri: + type: string + description: Webhook Event Profile URI. + example: https://schemas.identity.wso2.org/events + name: + type: string + description: Webhook name. + example: Login Webhook. + secret: + type: string + description: Secret for validating webhook payloads. + example: my-secret + channelsSubscribed: + type: array + items: + type: string + description: List of channels to subscribe to. + example: ["https://schemas.identity.wso2.org/events/login", "https://schemas.identity.wso2.org/events/registration"] + status: + type: string + enum: + - ACTIVE + - INACTIVE + description: Webhook Status. + example: "ACTIVE" + + WebhookSubscription: + type: object + properties: + channelUri: + type: string + description: Channel URI to subscribe to. + example: https://schemas.identity.wso2.org/events/login + status: + type: string + enum: + - SUBSCRIPTION_ACCEPTED + - SUBSCRIPTION_PENDING + - SUBSCRIPTION_ERROR + - UNSUBSCRIPTION_ACCEPTED + - UNSUBSCRIPTION_PENDING + - UNSUBSCRIPTION_ERROR + description: Status of the subscription. + example: SUBSCRIPTION_PENDING + + WebhookResponse: + type: object + properties: + id: + type: string + example: 'eeb8c1a2-3f4d-4e5b-8c6f-7d8e9f0a1b2c' + createdAt: + type: string + example: '2024-05-01T12:00:00Z' + updatedAt: + type: string + example: '2024-05-02T12:00:00Z' + endpoint: + type: string + description: Webhook URL. + example: https://example.com/webhook + eventProfile: + type: object + required: + - name + - uri + properties: + name: + type: string + description: Webhook Event Profile. + example: WSO2 + uri: + type: string + description: Webhook Event Profile URI. + example: https://schemas.identity.wso2.org/events + name: + type: string + description: Webhook name. + example: Login webhook. + channelsSubscribed: + type: array + description: List of channel subscriptions with status. + items: + $ref: '#/components/schemas/WebhookSubscription' + example: + - channelUri: https://schemas.identity.wso2.org/events/login + status: SUBSCRIPTION_ACCEPTED + - channelUri: https://schemas.identity.wso2.org/events/registration + status: SUBSCRIPTION_ERROR + status: + type: string + enum: + - ACTIVE + - PARTIALLY_ACTIVE + - INACTIVE + - PARTIALLY_INACTIVE + description: Webhook Status. + example: "ACTIVE" + + WebhookSummary: + type: object + properties: + id: + type: string + example: 'eeb8c1a2-3f4d-4e5b-8c6f-7d8e9f0a1b2c' + createdAt: + type: string + example: '2024-05-01T12:00:00Z' + updatedAt: + type: string + example: '2024-05-02T12:00:00Z' + endpoint: + type: string + description: Webhook URL. + example: https://example.com/webhook + name: + type: string + description: Webhook name. + example: Login webhook. + status: + type: string + enum: + - ACTIVE + - PARTIALLY_ACTIVE + - INACTIVE + - PARTIALLY_INACTIVE + description: Webhook Status. + example: "ACTIVE" + self: + type: string + example: /t/{organization_name}/api/server/v1/webhooks/123e4567-e89b-12d3-a456-556642440000 + + WebhookList: + type: object + properties: + webhooks: + type: array + items: + $ref: '#/components/schemas/WebhookSummary' + + Error: + type: object + properties: + code: + type: string + example: WEBHOOK-00001 + message: + type: string + example: Some error message. + description: + type: string + example: Some error description. + traceId: + type: string + example: e0fbcfeb-3617-43c4-8dd0-7b7d38e13047 diff --git a/docusaurus-asgardeo/static/apis/restapis/webhook-metadata.yaml b/docusaurus-asgardeo/static/apis/restapis/webhook-metadata.yaml new file mode 100644 index 0000000000..e9776721fc --- /dev/null +++ b/docusaurus-asgardeo/static/apis/restapis/webhook-metadata.yaml @@ -0,0 +1,188 @@ +openapi: 3.0.0 +info: + version: v1 + title: Asgardeo - Webhook Metadata Rest API + description: > + The Webhook Metadata REST API provides a standardized interface to retrieve + supported event profiles and the associated events within Asgardeo. This API + enables clients to dynamically fetch available events for webhook subscription based on the + selected event profile, improving flexibility and profile-awareness in integrations. +servers: + - url: 'https://api.asgardeo.io/t/{organization-name}/api/server/v1' +security: + - OAuth2: [] + +paths: + /webhooks/metadata: + get: + summary: List Event Profiles + description: "This API returns the list of event profiles supported by Asgardeo.\n\n Scope(Permission) required: `internal_webhook_meta_view` \n\n" + operationId: getEventProfiles + tags: + - Webhook Metadata + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/WebhookMetadata' + '401': + description: Unauthorized + '403': + description: Forbidden + '500': + description: Internal server error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + x-codeSamples: + - lang: Curl + source: | + curl --location 'https://api.asgardeo.io/t/{organization-name}/api/server/v1/webhooks/metadata/event-profiles' -H 'Authorization: Bearer {bearer_token}' + + /webhooks/metadata/event-profiles/{profileName}: + get: + summary: Get Event Profile Details + description: > + This API retrieves detailed information about a specific event profile including its channels and events. + + Scope(Permission) required: `internal_webhook_meta_view` + operationId: getEventProfile + tags: + - Webhook Metadata + parameters: + - name: profileName + in: path + required: true + schema: + type: string + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/EventProfile' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Profile not found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Internal server error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + +components: + securitySchemes: + BasicAuth: + type: http + scheme: basic + OAuth2: + type: oauth2 + flows: + authorizationCode: + authorizationUrl: 'https://api.asgardeo.io/t/{org-name}/oauth2/authorize' + tokenUrl: 'https://api.asgardeo.io/t/{org-name}/oauth2/token' + scopes: + internal_webhook_view: View webhook metadata + + schemas: + Event: + type: object + properties: + eventName: + type: string + example: loginSuccess + eventDescription: + type: string + example: Triggered when a user logs in successfully. + eventUri: + type: string + example: https://schemas.identity.wso2.org/events/logins/loginSuccess + + Channel: + type: object + properties: + name: + type: string + example: analytics + description: + type: string + example: Events related to user behavior analytics. + uri: + type: string + example: https://schemas.identity.wso2.org/channels/analytics + events: + type: array + items: + $ref: '#/components/schemas/Event' + + EventProfile: + type: object + properties: + profile: + type: string + example: WSO2 + uri: + type: string + example: "https://schemas.identity.wso2.org" + channels: + type: array + items: + $ref: '#/components/schemas/Channel' + + WebhookMetadata: + type: object + properties: + profiles: + type: array + items: + $ref: '#/components/schemas/EventProfileMetadata' + adapter: + type: object + properties: + name: + type: string + example: "httppublisher" + type: + type: string + example: "Publisher" + + EventProfileMetadata: + type: object + properties: + name: + type: string + example: "WSO2" + uri: + type: string + example: "https://schemas.identity.wso2.org" + self: + type: string + example: /t/{organization_name}/api/server/v1/webhooks/metadata/event-profiles/WSO2 + + Error: + type: object + properties: + code: + type: string + example: WEBHOOK-METADATA-00001 + message: + type: string + example: Some error message. + description: + type: string + example: Some error description. + traceId: + type: string + example: e0fbcfeb-3617-43c4-8dd0-7b7d38e13047 diff --git a/docusaurus-asgardeo/static/apis/restapis/workflow.yaml b/docusaurus-asgardeo/static/apis/restapis/workflow.yaml new file mode 100644 index 0000000000..3d9ee3332c --- /dev/null +++ b/docusaurus-asgardeo/static/apis/restapis/workflow.yaml @@ -0,0 +1,1255 @@ +openapi: 3.0.0 +info: + description: > + This is the RESTful API for managing workflows in Asgardeo. + version: v1 + title: Asgardeo - Workflow Management Rest API +servers: + - url: 'https://api.asgardeo.io/t/{organization-name}/api/server/v1' +security: + - OAuth2: [] + +paths: + /workflows: + get: + tags: + - Workflow Management + summary: Retrieve all the available workflows. + description: | + Retrieve all the available workflows in the system. + + Scope required: ``internal_workflow_view`` + + operationId: getWorkflows + parameters: + - $ref: "#/components/parameters/limitQueryParam" + - $ref: "#/components/parameters/offsetQueryParam" + - $ref: "#/components/parameters/filterQueryParam" + responses: + "200": + description: Successful response + content: + "application/json": + schema: + $ref: "#/components/schemas/WorkflowListResponse" + example: + totalResults: 10 + startIndex: 1 + count: 10 + workflows: + - id: "100" + name: User Approval Workflow + description: Approves requests for user related tasks + engine: Simple Workflow Engine + template: MultiStepApprovalTemplate + - id: "101" + name: User Role Approval Workflow + description: Approves requests for user role related tasks + engine: Simple Workflow Engine + template: MultiStepApprovalTemplate + - id: "102" + name: User Claim Approval Workflow + description: Approves requests for user claim related tasks + engine: Simple Workflow Engine + template: SingleStepApprovalTemplate + "400": + $ref: "#/components/responses/InvalidInput" + "401": + $ref: "#/components/responses/Unauthorized" + "403": + $ref: "#/components/responses/Forbidden" + "404": + $ref: "#/components/responses/NotFound" + "500": + $ref: "#/components/responses/ServerError" + post: + tags: + - Workflow Management + summary: Add a new workflow. + description: | + Create a new workflow using the specified workflow template and execution engine. + + Scope required: ``internal_workflow_create`` + + operationId: addWorkflow + responses: + "201": + description: Successful response + content: + "application/json": + schema: + $ref: "#/components/schemas/WorkflowResponse" + example: + id: "100" + name: User Approval Workflow + description: Workflow to approve user role related requests + engine: Simple Workflow Engine + notificationsForInitiator: + channels: ["email", "sms"] + events: ["onApproval", "onRejection"] + template: + name: MultiStepApprovalTemplate + notificationsForApprovers: + channels: ["email", "sms"] + events: ["onAssignment", "onRelease"] + steps: + - step: 1 + options: + - entity: roles + values: + - 123 + - 124 + - entity: users + values: + - 234 + - 235 + "400": + $ref: "#/components/responses/InvalidInput" + "401": + $ref: "#/components/responses/Unauthorized" + "403": + $ref: "#/components/responses/Forbidden" + "409": + $ref: "#/components/responses/Conflict" + "500": + $ref: "#/components/responses/ServerError" + requestBody: + content: + "application/json": + schema: + $ref: "#/components/schemas/WorkflowRequest" + description: This represents the workflow to be created. + required: true + /workflows/{workflow-id}: + get: + tags: + - Workflow Management + summary: Retrieve the workflow by workflow id. + description: | + Retrieve information about a specific workflow identified by the workflow id. + + Scope required: ``internal_workflow_view`` + + operationId: getWorkflowById + parameters: + - $ref: "#/components/parameters/workflowIdPathParam" + responses: + "200": + description: Successful response + content: + "application/json": + schema: + $ref: "#/components/schemas/WorkflowResponse" + "400": + $ref: "#/components/responses/InvalidInput" + "401": + $ref: "#/components/responses/Unauthorized" + "403": + $ref: "#/components/responses/Forbidden" + "404": + $ref: "#/components/responses/NotFound" + "500": + $ref: "#/components/responses/ServerError" + put: + tags: + - Workflow Management + summary: Update an existing workflow. + description: | + Update a workflow identified by workflow-id. + + Scope required: ``internal_workflow_update`` + + operationId: updateWorkflow + parameters: + - $ref: "#/components/parameters/workflowIdPathParam" + responses: + "200": + description: Successful response + content: + "application/json": + schema: + $ref: "#/components/schemas/WorkflowResponse" + example: + id: "100" + name: User Approval Workflow + description: Workflow to approve user role related requests + engine: Simple Workflow Engine + notificationsForInitiator: + channels: ["email", "sms"] + events: ["onApproval", "onRejection"] + template: + name: MultiStepApprovalTemplate + notificationsForApprovers: + channels: ["email", "sms"] + events: ["onAssignment", "onRelease"] + steps: + - step: 1 + options: + - entity: roles + values: + - 123 + - entity: users + values: + - 234 + "400": + $ref: "#/components/responses/InvalidInput" + "401": + $ref: "#/components/responses/Unauthorized" + "403": + $ref: "#/components/responses/Forbidden" + "404": + $ref: "#/components/responses/NotFound" + "500": + $ref: "#/components/responses/ServerError" + requestBody: + description: Contains the details of the updated workflow. + content: + "application/json": + schema: + $ref: "#/components/schemas/WorkflowRequest" + example: + id: "100" + name: User Approval Workflow + description: Workflow to approve user role related requests + engine: Simple Workflow Engine + notificationsForInitiator: + channels: ["email", "sms"] + events: ["onApproval", "onRejection"] + template: + name: MultiStepApprovalTemplate + notificationsForApprovers: + channels: ["email", "sms"] + events: ["onAssignment", "onRelease"] + steps: + - step: 1 + options: + - entity: roles + values: + - 123 + - entity: users + values: + - 234 + delete: + tags: + - Workflow Management + summary: Delete the workflow by workflow-id. + description: | + Delete a specific workflow identified by the workflow-id + + Scope required: ``internal_workflow_delete`` + + operationId: deleteWorkflowById + parameters: + - $ref: "#/components/parameters/workflowIdPathParam" + responses: + "204": + $ref: "#/components/responses/Deleted" + "400": + $ref: "#/components/responses/InvalidInput" + "401": + $ref: "#/components/responses/Unauthorized" + "403": + $ref: "#/components/responses/Forbidden" + "404": + $ref: "#/components/responses/NotFound" + "500": + $ref: "#/components/responses/ServerError" + /workflow-associations: + get: + tags: + - Workflow Associations Management + summary: Retrieve all the available workflow associations. + description: | + Retrieve all the available workflow associations in the system. + + Scope required: ``internal_workflow_association_view`` + + operationId: getWorkflowAssociations + parameters: + - $ref: "#/components/parameters/limitQueryParam" + - $ref: "#/components/parameters/offsetQueryParam" + - $ref: "#/components/parameters/filterQueryParam" + responses: + "200": + description: Successful Response + content: + "application/json": + schema: + $ref: "#/components/schemas/WorkflowAssociationListResponse" + example: + totalResults: 10 + startIndex: 1 + count: 10 + workflowAssociations: + - id: "500" + associationName: User Registration Workflow Association + operation: ADD_USER + workflowName: User Approval Workflow + isEnabled: true + - id: "501" + associationName: Role Update Workflow Association + operation: UPDATE_ROLE + workflowName: User Role Approval Workflow + isEnabled: true + - id: "502" + associationName: User Deletion Workflow Association + operation: DELETE_USER + workflowName: User Approval Workflow + isEnabled: false + "400": + $ref: "#/components/responses/InvalidInput" + "401": + $ref: "#/components/responses/Unauthorized" + "403": + $ref: "#/components/responses/Forbidden" + "404": + $ref: "#/components/responses/NotFound" + "500": + $ref: "#/components/responses/ServerError" + post: + tags: + - Workflow Associations Management + summary: Create a new workflow association. + description: | + Create a new workflow association by assigning a user operation to an existing workflow. + + Scope required: ``internal_workflow_association_create`` + + operationId: addWorkflowAssociation + responses: + "201": + description: Item Created + content: + "application/json": + schema: + $ref: "#/components/schemas/WorkflowAssociationResponse" + "400": + $ref: "#/components/responses/InvalidInput" + "401": + $ref: "#/components/responses/Unauthorized" + "403": + $ref: "#/components/responses/Forbidden" + "409": + $ref: "#/components/responses/Conflict" + "500": + $ref: "#/components/responses/ServerError" + requestBody: + description: Contains the details of the newly created workflow association. + content: + "application/json": + schema: + $ref: "#/components/schemas/WorkflowAssociationRequest" + required: true + /workflow-associations/{association-id}: + get: + tags: + - Workflow Associations Management + summary: Get the workflow association by association-id. + description: | + Get a specific workflow association identified by the association id. + + Scope required: ``internal_workflow_association_view`` + + operationId: getWorkflowAssociationById + parameters: + - $ref: "#/components/parameters/associationIdPathParam" + responses: + "200": + description: Array of workflow associations matching the search criteria + content: + "application/json": + schema: + $ref: "#/components/schemas/WorkflowAssociationResponse" + example: + id: "500" + associationName: User Registration Workflow Association + operation: ADD_USER + workflowName: User Approval Workflow + isEnabled: true + "400": + $ref: "#/components/responses/InvalidInput" + "401": + $ref: "#/components/responses/Unauthorized" + "403": + $ref: "#/components/responses/Forbidden" + "404": + $ref: "#/components/responses/NotFound" + "500": + $ref: "#/components/responses/ServerError" + delete: + tags: + - Workflow Associations Management + summary: Delete the workflow association by association-id. + description: | + Delete a specific workflow association identified by the association ID. + + Scope required: ``internal_workflow_association_view`` + + operationId: deleteWorkflowAssociationById + parameters: + - $ref: "#/components/parameters/associationIdPathParam" + responses: + "204": + $ref: "#/components/responses/Deleted" + "400": + $ref: "#/components/responses/InvalidInput" + "401": + $ref: "#/components/responses/Unauthorized" + "403": + $ref: "#/components/responses/Forbidden" + "404": + $ref: "#/components/responses/NotFound" + "500": + $ref: "#/components/responses/ServerError" + patch: + tags: + - Workflow Associations Management + summary: | + Partially update association by association-id. + operationId: updateAssociation + description: | + Partially update an association by association-id.
      + + Scope required: ``internal_workflow_association_update`` + + parameters: + - $ref: "#/components/parameters/associationIdPathParam" + requestBody: + description: Represents the association details to be updated. + content: + application/json: + schema: + $ref: "#/components/schemas/WorkflowAssociationPatchRequest" + example: + associationName: User Registration Workflow Association + operation: ADD_USER + workflowId: "100" + isEnabled: true + responses: + "200": + description: Successfully Updated + content: + "application/json": + schema: + $ref: "#/components/schemas/WorkflowAssociationResponse" + example: + id: "500" + associationName: User Registration Workflow Association + operation: ADD_USER + workflowName: User Approval Workflow + isEnabled: true + "400": + description: Bad Request + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + "401": + description: "#/components/responses/Unauthorized" + "403": + description: "#/components/responses/Forbidden" + "409": + description: "#/components/responses/Conflict" + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + "500": + description: Server Error + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + + /workflow-instances: + get: + tags: + - Workflow Instances Management + summary: Get workflow instances for a tenant + description: | + Retrieve workflow instances filtered by various parameters. + + Scope required: ``internal_workflow_instance_view`` + + operationId: getWorkflowInstances + parameters: + - name: limit + in: query + schema: + type: integer + default: 25 + - name: offset + in: query + schema: + type: integer + default: 0 + - name: filter + in: query + description: | + Filter conditions using logical expressions. Supported operators: `eq`, `le`, `ge`. + + Combine multiple conditions with `and`. + + Example: + + `operationType+eq+ADD_USER+and+requestType+eq+MY_TASKS+and+status+eq+PENDING+and+createdAt+ge+2025-06-01 09:57:47.000+and+createdAt+le+2025-07-31 09:57:47.000` + schema: + type: string + responses: + "200": + description: Workflow instances retrieved successfully + content: + application/json: + schema: + $ref: "#/components/schemas/WorkflowInstanceListResponse" + "400": + $ref: "#/components/responses/InvalidInput" + "401": + $ref: "#/components/responses/Unauthorized" + "403": + $ref: "#/components/responses/Forbidden" + "404": + $ref: "#/components/responses/NotFound" + "500": + $ref: "#/components/responses/ServerError" + + /workflow-instances/{instance_id}: + get: + tags: + - Workflow Instances Management + summary: Get workflow instance by ID + description: | + Retrieve a specific workflow instance by providing its unique ID. + + Scope required: ``internal_workflow_instance_view`` + + operationId: getWorkflowInstanceById + parameters: + - name: instance_id + in: path + required: true + schema: + type: string + responses: + "200": + description: Workflow instance retrieved successfully + content: + application/json: + schema: + $ref: "#/components/schemas/WorkflowInstanceResponse" + "404": + $ref: "#/components/responses/NotFound" + + delete: + tags: + - Workflow Instances Management + summary: Delete workflow instance by ID + description: | + Delete a workflow instance by providing the instance ID. + + Scope required: ``internal_workflow_instance_delete`` + + operationId: deleteWorkflowInstance + parameters: + - name: instance_id + in: path + required: true + schema: + type: string + responses: + "204": + description: Successfully deleted the workflow instance + "404": + $ref: "#/components/responses/NotFound" + + /workflow-instances/{instance_id}/abort: + post: + tags: + - Workflow Instances Management + summary: Abort a workflow instance by ID + description: | + Abort a workflow instance by providing the instance ID. + + Scope required: ``internal_workflow_instance_update`` + + operationId: abortWorkflowInstance + parameters: + - name: instance_id + in: path + required: true + schema: + type: string + responses: + "200": + description: Successfully aborted the workflow instance + content: + application/json: + schema: + $ref: "#/components/schemas/InstanceStatus" + "400": + $ref: "#/components/responses/InvalidInput" + "404": + $ref: "#/components/responses/NotFound" + "500": + $ref: "#/components/responses/ServerError" + + + /workflow-engines: + get: + tags: + - Workflow Engines + summary: Retrieve all the available workflow engines. + description: | + Retrieve metadata information of all the workflow engines in the system. + + operationId: searchWorkFlowEngines + responses: + "200": + description: search results matching criteria + content: + "application/json": + schema: + type: array + items: + $ref: "#/components/schemas/WorkflowEngine" + "400": + $ref: "#/components/responses/InvalidInput" + "401": + $ref: "#/components/responses/Unauthorized" + "403": + $ref: "#/components/responses/Forbidden" + "404": + $ref: "#/components/responses/NotFound" + "500": + $ref: "#/components/responses/ServerError" + +components: + schemas: + WorkflowEngine: + type: object + required: + - profileName + properties: + profileName: + type: string + example: embedded_bps + description: A unique name for the workflow engine. + workerHostURL: + type: string + example: https://localhost:9443/services + description: URL of the workflow worker node. + managerHostURL: + type: string + example: https://localhost:9443/services + description: URL of the workflow manager node. + userName: + type: string + example: challengeQuestion1 + description: Username of the creator of the workflow engine. + + WorkflowListResponse: + type: object + properties: + totalResults: + type: integer + example: 10 + startIndex: + type: integer + example: 1 + count: + type: integer + example: 10 + workflows: + type: array + items: + $ref: "#/components/schemas/WorkflowListItem" + + WorkflowListItem: + type: object + properties: + id: + type: string + example: "100" + description: "Unique id to represent a workflow" + name: + type: string + example: "User Role Approval" + description: "Display name of the workflow" + description: + type: string + example: "Workflow to approve user role related requests" + description: "Detailed description of the workflow" + engine: + type: string + example: "Simple Workflow Engine" + description: "Category in which the workflow is deployed" + template: + type: string + example: "MultiStepApprovalTemplate" + description: "Template defining the approval process for the workflow" + + WorkflowResponse: + type: object + properties: + id: + type: string + example: "100" + description: "Id of the workflow" + name: + type: string + example: "User Approval Workflow" + description: "Name of the created workflow" + description: + type: string + example: "Workflow to approve user role related requests" + description: "Description of the created workflow" + engine: + type: string + example: "Simple Workflow Engine" + description: "Name of the selected workflow engine" + notificationsForInitiator: + $ref: "#/components/schemas/InitiatorNotifications" + template: + $ref: "#/components/schemas/WorkflowTemplateBase" + + WorkflowRequest: + type: object + required: + - name + - engine + properties: + name: + type: string + example: "User Approval Workflow" + description: "Name of the created workflow" + description: + type: string + example: "Workflow to approve user role related requests" + description: "Description of the created workflow" + engine: + type: string + example: "Simple Workflow Engine" + description: "Name of the selected workflow engine" + notificationsForInitiator: + $ref: "#/components/schemas/InitiatorNotifications" + template: + type: object + allOf: + - $ref: "#/components/schemas/WorkflowTemplate" + required: [name] + + WorkflowTemplate: + type: object + properties: + name: + type: string + example: "MultiStepApprovalTemplate" + description: "Name of the workflow template" + notificationsForApprovers: + $ref: "#/components/schemas/ApproverNotifications" + steps: + type: array + minItems: 1 + items: + type: object + allOf: + - $ref: "#/components/schemas/WorkflowTemplateParameters" + required: [step] + + WorkflowTemplateParameters: + type: object + properties: + step: + type: integer + example: 1 + options: + type: array + minItems: 1 + items: + type: object + allOf: + - $ref: "#/components/schemas/OptionDetails" + required: [entity, values] + example: + [ + { "entity": "roles", "values": ["301", "302"] }, + { "entity": "users", "values": ["501", "502"] }, + ] + + WorkflowTemplateBase: + type: object + properties: + name: + type: string + example: "MultiStepApproval" + description: "Name of the workflow template" + notificationsForApprovers: + $ref: "#/components/schemas/ApproverNotifications" + steps: + type: array + minItems: 1 + items: + $ref: "#/components/schemas/WorkflowTemplateParametersBase" + + WorkflowTemplateParametersBase: + type: object + properties: + step: + type: integer + example: 1 + options: + type: array + minItems: 1 + items: + $ref: "#/components/schemas/OptionDetails" + example: + [ + { "entity": "roles", "values": ["900", "901"] }, + { "entity": "users", "values": ["300", "301"] }, + ] + + OptionDetails: + type: object + properties: + entity: + type: string + example: "roles" + values: + type: array + items: + type: string + example: "123" + description: "Identifier of the selected entity" + + InitiatorNotifications: + type: object + properties: + channels: + type: array + items: + type: string + example: ["email", "sms"] + description: "Notification channels to be used for initiator (e.g., email, sms)" + events: + type: array + items: + type: string + example: ["onApproval", "onRejection"] + description: "Events that trigger notifications for initiator (e.g., onApproval, onRejection)" + + ApproverNotifications: + type: object + properties: + channels: + type: array + items: + type: string + example: ["email", "sms"] + description: "Notification channels to be used for approvers (e.g., email, sms)" + events: + type: array + items: + type: string + example: ["onAssignment", "onRelease"] + description: "Events that trigger notifications for approvers (e.g., onAssignment, onRelease)" + + WorkflowAssociationListResponse: + type: object + properties: + totalResults: + type: integer + example: 10 + startIndex: + type: integer + example: 1 + count: + type: integer + example: 10 + workflowAssociations: + type: array + items: + $ref: "#/components/schemas/WorkflowAssociationListItem" + + WorkflowAssociationListItem: + type: object + properties: + id: + type: string + example: "500" + description: "Unique id to represent a workflow association" + associationName: + type: string + example: "User Registration Workflow Association" + description: "Name of the workflow association" + operation: + $ref: "#/components/schemas/Operation" + workflowName: + type: string + example: "User Approval Workflow" + description: "Assigned Workflow" + isEnabled: + type: boolean + example: true + description: "Association Status" + rule: + $ref: "#/components/schemas/ORRuleResponse" + + WorkflowAssociationResponse: + type: object + properties: + id: + type: string + example: "500" + description: "Unique id to represent a workflow association" + associationName: + type: string + example: "User Registration Workflow Association" + description: "Name of the workflow association" + operation: + $ref: "#/components/schemas/Operation" + workflowName: + type: string + example: "User Approval Workflow" + description: "Assigned Workflow" + isEnabled: + type: boolean + example: true + description: "Association Status" + rule: + $ref: "#/components/schemas/ORRuleResponse" + + WorkflowAssociationRequest: + type: object + required: + - associationName + - operation + - workflowId + properties: + associationName: + type: string + example: "User Registration Workflow Association" + description: "Name of the workflow association" + operation: + $ref: "#/components/schemas/Operation" + workflowId: + type: string + example: "100" + description: "Id of the assigned workflow" + isEnabled: + type: boolean + example: true + description: "Association Status" + default: true + rule: + $ref: "#/components/schemas/ORRule" + + WorkflowAssociationPatchRequest: + type: object + properties: + associationName: + type: string + example: "User Registration Workflow Association" + description: "Name of the workflow association" + operation: + $ref: "#/components/schemas/Operation" + workflowId: + type: string + example: "100" + description: "Id of the assigned workflow" + isEnabled: + type: boolean + example: true + description: "Association Status" + rule: + $ref: "#/components/schemas/ORRule" + + WorkflowInstanceListResponse: + type: object + properties: + totalResults: + type: integer + example: 10 + startIndex: + type: integer + example: 3 + count: + type: integer + example: 10 + instances: + type: array + items: + $ref: "#/components/schemas/WorkflowInstanceListItem" + + WorkflowInstanceListItem: + type: object + properties: + workflowInstanceId: + type: string + example: "500" + description: "Unique id to represent a workflow instance" + eventType: + $ref: "#/components/schemas/Operation" + requestInitiator: + type: string + createdAt: + type: string + updatedAt: + type: string + status: + $ref: "#/components/schemas/InstanceStatus" + + WorkflowInstanceResponse: + type: object + properties: + workflowInstanceId: + type: string + example: "500" + description: "Unique id to represent a workflow instance" + eventType: + $ref: "#/components/schemas/Operation" + createdAt: + type: string + requestInitiator: + type: string + updatedAt: + type: string + status: + $ref: "#/components/schemas/InstanceStatus" + requestParameters: + type: object + properties: + type: array + items: + $ref: "#/components/schemas/Property" + + Property: + type: object + required: + - key + - value + properties: + key: + type: string + example: "some_key" + value: + type: string + example: "some_value" + + InstanceStatus: + type: string + enum: [ALL_TASKS, PENDING, APPROVED, REJECTED, FAILED, DELETED, ABORTED] + + Operation: + type: string + enum: + - ADD_USER + - SELF_REGISTER_USER + - DELETE_USER + - UPDATE_ROLES_OF_USERS + - ADD_ROLE + - DELETE_ROLE + - UPDATE_ROLE_NAME + - UPDATE_USERS_OF_ROLES + - DELETE_USER_CLAIMS + - UPDATE_USER_CLAIMS + description: "Name of the user operation" + + Error: + required: + - code + - message + type: object + properties: + code: + type: string + example: some_error_code + message: + type: string + example: Some Error Message + description: + type: string + example: Some Error Description + traceId: + type: string + example: Some Trace ID + ORRule: + type: object + description: Represents a rule configuration that combines multiple sub-rules with an OR condition. + If any of the sub-rules evaluate to true, the ORRule is considered satisfied. + properties: + condition: + type: string + description: The logical condition for combining the sub-rules. For ORRule, the value + must always be "OR". + enum: ["OR"] + rules: + type: array + items: + $ref: '#/components/schemas/ANDRule' + minItems: 1 + + ORRuleResponse: + type: object + description: Rule configured for the action. + properties: + condition: + type: string + enum: [ "OR" ] + rules: + type: array + items: + $ref: '#/components/schemas/ANDRuleResponse' + description: A list of sub-rules that are combined using the OR condition. Each sub-rule is an ANDRule. + minItems: 1 + + ANDRule: + type: object + description: A sub-rule that combines expression with AND condition. + required: + - condition + - expressions + properties: + condition: + type: string + enum: ["AND"] + description: The logical condition for combining the expressions. For ANDRule, the value must always be "AND". + expressions: + type: array + items: + $ref: '#/components/schemas/Expression' + minItems: 1 + description: A list of expressions that are combined using the AND condition. All expressions must evaluate to true for the ANDRule to pass. + + ANDRuleResponse: + type: object + description: Represents a rule configuration that combines multiple expressions with an AND condition. All expressions in the ANDRule must evaluate to true for the rule to be satisfied. + properties: + condition: + type: string + enum: [ "AND" ] + description: The logical condition for combining the expressions. For ANDRule, the value must always be "AND". + expressions: + type: array + items: + $ref: '#/components/schemas/ExpressionResponse' + minItems: 1 + description: A list of expressions that are combined using the AND condition. All expressions must evaluate to true for the ANDRule to pass. + + Expression: + type: object + description: Represents a single logical condition or comparison within a rule. An expression defines a field, and operator, and a value that is evaluated. + required: + - field + - operator + - value + properties: + field: + type: string + description: The field or attribute of the entity being evaluated (e.g.,application, role). + example: application + operator: + type: string + description: The comparison operator used to evaluate the field and value. Common operators include "equals", "contains", "startsWith", etc. + example: equals + value: + type: string + description: The value that the field is compared against based on the operator. + example: FinanceApp + + ExpressionResponse: + type: object + description: Expressions in the rule. + properties: + field: + type: string + example: application + operator: + type: string + example: equals + value: + type: string + example: myapp + + responses: + NotFound: + description: The specified resource is not found + content: + "application/json": + schema: + $ref: "#/components/schemas/Error" + Unauthorized: + description: Unauthorized + Forbidden: + description: Forbidden + ServerError: + description: Internal Server Error + content: + "application/json": + schema: + $ref: "#/components/schemas/Error" + InvalidInput: + description: Invalid input request + content: + "application/json": + schema: + $ref: "#/components/schemas/Error" + Conflict: + description: Item Already Exists + content: + "application/json": + schema: + $ref: "#/components/schemas/Error" + Deleted: + description: Item Deleted + Updated: + description: Item Updated + parameters: + workflowIdPathParam: + name: workflow-id + in: path + description: Workflow ID + required: true + schema: + type: string + associationIdPathParam: + name: association-id + in: path + description: Workflow Association ID + required: true + schema: + type: string + offsetQueryParam: + name: offset + in: query + description: Number of records to skip for pagination + schema: + type: integer + format: int32 + limitQueryParam: + name: limit + in: query + description: Maximum number of records to return + schema: + type: integer + format: int32 + filterQueryParam: + name: filter + in: query + description: Records, filtered by their name + schema: + type: string + securitySchemes: + BasicAuth: + type: http + scheme: basic + OAuth2: + type: oauth2 + flows: + authorizationCode: + authorizationUrl: 'https://api.asgardeo.io/t/{org-name}/oauth2/authorize' + tokenUrl: 'https://api.asgardeo.io/t/{org-name}/oauth2/token' + scopes: + read: internal_workflow_view + write: internal_workflow_create + update: internal_workflow_update + delete: internal_workflow_delete \ No newline at end of file diff --git a/docusaurus-asgardeo/static/assets b/docusaurus-asgardeo/static/assets new file mode 120000 index 0000000000..a4d19f3b45 --- /dev/null +++ b/docusaurus-asgardeo/static/assets @@ -0,0 +1 @@ +../../en/asgardeo/docs/assets \ No newline at end of file