diff --git a/.gitignore b/.gitignore index e8b60c8063..9e0bf7ed4e 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ # Log file *.log +broken-links-log.txt # BlueJ files *.ctxt @@ -20,6 +21,7 @@ hs_err_pid* .idea/ .DS_Store +node_modules en/identity-server/*/site en/asgardeo/site diff --git a/VERSION b/VERSION index a77a707e08..ff1205fea8 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.0.198 +0.0.205 diff --git a/en/asgardeo/docs/apis/index.md b/en/asgardeo/docs/apis/index.md index 6c8020e15f..6ea2a82da9 100644 --- a/en/asgardeo/docs/apis/index.md +++ b/en/asgardeo/docs/apis/index.md @@ -20,7 +20,7 @@ Follow the steps below to obtain an access token using OAuth-based authenticatio ### Step 1: Register an application -Follow the guide and create either a [standard-based (OIDC) application]({{base_path}}guides/applications/register-standard-based-app/) or an [M2M application]({{base_path}}/guides/applications/register-machine-to-machine-app/) based on the use case. Take note of the client ID and the client secret of the created application. +Follow the guide and create either a [standard-based (OIDC) application]({{base_path}}/guides/applications/register-standard-based-app/) or an [M2M application]({{base_path}}/guides/applications/register-machine-to-machine-app/) based on the use case. Take note of the client ID and the client secret of the created application. ### Step 2: Authorize the application to consume API resources diff --git a/en/asgardeo/docs/assets/img/guides/authorization/impersonation/user-impersonation-selection.png b/en/asgardeo/docs/assets/img/guides/authorization/impersonation/user-impersonation-selection.png new file mode 100644 index 0000000000..1ab3fbbaf6 Binary files /dev/null and b/en/asgardeo/docs/assets/img/guides/authorization/impersonation/user-impersonation-selection.png differ diff --git a/en/asgardeo/docs/assets/img/guides/sso-integrations/google-workspace-sso/add-app.png b/en/asgardeo/docs/assets/img/guides/sso-integrations/google-workspace-sso/add-app.png new file mode 100644 index 0000000000..b15615d8e9 Binary files /dev/null and b/en/asgardeo/docs/assets/img/guides/sso-integrations/google-workspace-sso/add-app.png differ diff --git a/en/asgardeo/docs/assets/img/guides/sso-integrations/google-workspace-sso/add-google-app.png b/en/asgardeo/docs/assets/img/guides/sso-integrations/google-workspace-sso/add-google-app.png new file mode 100644 index 0000000000..2dc28e0963 Binary files /dev/null and b/en/asgardeo/docs/assets/img/guides/sso-integrations/google-workspace-sso/add-google-app.png differ diff --git a/en/asgardeo/docs/assets/img/guides/sso-integrations/google-workspace-sso/sso-fill-google.png b/en/asgardeo/docs/assets/img/guides/sso-integrations/google-workspace-sso/sso-fill-google.png new file mode 100644 index 0000000000..08f45ffcde Binary files /dev/null and b/en/asgardeo/docs/assets/img/guides/sso-integrations/google-workspace-sso/sso-fill-google.png differ diff --git a/en/asgardeo/docs/assets/img/guides/sso-integrations/microsoft-365-sso/add-microsoft-365-app.png b/en/asgardeo/docs/assets/img/guides/sso-integrations/microsoft-365-sso/add-microsoft-365-app.png new file mode 100644 index 0000000000..c7aa978d9d Binary files /dev/null and b/en/asgardeo/docs/assets/img/guides/sso-integrations/microsoft-365-sso/add-microsoft-365-app.png differ diff --git a/en/asgardeo/docs/assets/img/guides/sso-integrations/salesforce-sso/add-entity-id.png b/en/asgardeo/docs/assets/img/guides/sso-integrations/salesforce-sso/add-entity-id.png new file mode 100644 index 0000000000..1736bf5a93 Binary files /dev/null and b/en/asgardeo/docs/assets/img/guides/sso-integrations/salesforce-sso/add-entity-id.png differ diff --git a/en/asgardeo/docs/assets/img/guides/sso-integrations/salesforce-sso/add-salesforce-app.png b/en/asgardeo/docs/assets/img/guides/sso-integrations/salesforce-sso/add-salesforce-app.png new file mode 100644 index 0000000000..2edf06c105 Binary files /dev/null and b/en/asgardeo/docs/assets/img/guides/sso-integrations/salesforce-sso/add-salesforce-app.png differ diff --git a/en/asgardeo/docs/assets/img/guides/sso-integrations/salesforce-sso/salesforce-sso.png b/en/asgardeo/docs/assets/img/guides/sso-integrations/salesforce-sso/salesforce-sso.png new file mode 100644 index 0000000000..abdeae1fc9 Binary files /dev/null and b/en/asgardeo/docs/assets/img/guides/sso-integrations/salesforce-sso/salesforce-sso.png differ diff --git a/en/asgardeo/docs/assets/img/logo/salesforce.svg b/en/asgardeo/docs/assets/img/logo/salesforce.svg new file mode 100644 index 0000000000..8a15f25559 --- /dev/null +++ b/en/asgardeo/docs/assets/img/logo/salesforce.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/en/asgardeo/docs/guides/authentication/sso-integrations/add-google-workspace-template.md b/en/asgardeo/docs/guides/authentication/sso-integrations/add-google-workspace-template.md new file mode 100644 index 0000000000..8f7751b1ae --- /dev/null +++ b/en/asgardeo/docs/guides/authentication/sso-integrations/add-google-workspace-template.md @@ -0,0 +1,5 @@ +{% set product_name = "Asgardeo" %} +{% set product_domain = "api.asgardeo.io" %} +{% set product_url_format = "https://api.asgardeo.io/t/{organization_name}" %} +{% set localhost_warning_note = "" %} +{% include "../../../../../includes/guides/authentication/sso-integrations/add-google-workspace-template.md" %} \ No newline at end of file diff --git a/en/asgardeo/docs/guides/authentication/sso-integrations/add-microsoft-365-template.md b/en/asgardeo/docs/guides/authentication/sso-integrations/add-microsoft-365-template.md new file mode 100644 index 0000000000..272a642650 --- /dev/null +++ b/en/asgardeo/docs/guides/authentication/sso-integrations/add-microsoft-365-template.md @@ -0,0 +1,5 @@ +{% set product_name = "Asgardeo" %} +{% set product_domain = "api.asgardeo.io" %} +{% set product_url_format = "https://api.asgardeo.io/t/{organization_name}" %} +{% set localhost_warning_note = "" %} +{% include "../../../../../includes/guides/authentication/sso-integrations/add-microsoft-365-template.md" %} \ No newline at end of file diff --git a/en/asgardeo/docs/guides/authentication/sso-integrations/add-salesforce-template.md b/en/asgardeo/docs/guides/authentication/sso-integrations/add-salesforce-template.md new file mode 100644 index 0000000000..ffb922f50a --- /dev/null +++ b/en/asgardeo/docs/guides/authentication/sso-integrations/add-salesforce-template.md @@ -0,0 +1,5 @@ +{% set product_name = "Asgardeo" %} +{% set product_domain = "api.asgardeo.io" %} +{% set product_url_format = "https://api.asgardeo.io/t/{organization_name}" %} +{% set localhost_warning_note = "" %} +{% include "../../../../../includes/guides/authentication/sso-integrations/add-salesforce-template.md" %} \ No newline at end of file diff --git a/en/asgardeo/docs/guides/authentication/sso-integrations/index.md b/en/asgardeo/docs/guides/authentication/sso-integrations/index.md new file mode 100644 index 0000000000..7500ff233c --- /dev/null +++ b/en/asgardeo/docs/guides/authentication/sso-integrations/index.md @@ -0,0 +1 @@ +{% include "../../../../../includes/guides/authentication/sso-integrations/index.md" %} \ No newline at end of file diff --git a/en/asgardeo/docs/guides/authorization/impersonation/user-impersonation.md b/en/asgardeo/docs/guides/authorization/impersonation/user-impersonation.md index 59c303fe01..7efaddefd2 100644 --- a/en/asgardeo/docs/guides/authorization/impersonation/user-impersonation.md +++ b/en/asgardeo/docs/guides/authorization/impersonation/user-impersonation.md @@ -10,10 +10,12 @@ User impersonation involves an authorization server’s ability to temporarily g 1. On the {{ product_name }} Console, go to **Applications**. -2. Select the application and go to API Authorization tab of the application and click authorize API Resource. +2. Select the application and go to API Authorization tab of the application and click authorize on API Resource. 3. Search for User Impersonation under management APIs and subscribe to the application. + ![Api-Authorization-Impersonation-Selection]({{base_path}}/assets/img/guides/authorization/impersonation/user-impersonation-selection.png){: width="700" style="display: block; margin: 0; border: 0.3px solid lightgrey;"} + ![Api-Authorization-Impersonation]({{base_path}}/assets/img/guides/authorization/impersonation/api-authorization-impersonation.png){: width="700" style="display: block; margin: 0; border: 0.3px solid lightgrey;"} 4. Switch to the Roles tab, click on **+ New Role** to create a Role and assign the Impersonation Scope. @@ -65,12 +67,12 @@ A security JWT token that represents the identity of both parties Impersonator a **Request Format** ``` -https://api.asgardeo.io/t/{organization_name}/oauth2/authorize?response_type=code&redirect_uri={redirect_uri}&client_id={client_id}state=&scope=internal_user_impersonate%20{Other_Required_Scopes}&response_type=id_token%20subject_token&requested_subject={User_id_of_the_end_user}&nonce={nonce} +https://api.asgardeo.io/t/{organization_name}/oauth2/authorize?redirect_uri={redirect_uri}&client_id={client_id}&state=&scope=internal_user_impersonate%20{Other_Required_Scopes}&response_type=id_token%20subject_token&requested_subject={User_id_of_the_end_user}&nonce={nonce} ``` **Sample Request** ``` -https://api.asgardeo.io/t/bifrost/oauth2/authorize?client_id=jVcW4oLn1Jjb2T94H4gtPV9z5Y0a&state=sample_state&scope=internal_user_impersonate%20openid%20internal_org_user_mgt_view%20internal_org_user_mgt_list%20internal_user_mgt_delete%20internal_org_user_mgt_create%20internal_login%20internal_user_mgt_delete%20internal_user_mgt_view%20internal_user_mgt_list%20internal_user_mgt_update%20internal_user_mgt_create%20readBooking%0A&redirect_uri=https%3A%2F%2Foauth.pstmn.io%2Fv1%2Fcallback&response_type=id_token%20subject_token&requested_subject=32bc4697-ed0f-4546-8387-dcd6403e7caa&nonce=2131232 +https://api.asgardeo.io/t/bifrost/oauth2/authorize?client_id=jVcW4oLn1Jjb2T94H4gtPV9z5Y0a&state=sample_state&scope=internal_user_impersonate%20openid%20internal_org_user_mgt_view%20internal_org_user_mgt_list%20internal_user_mgt_delete%20internal_org_user_mgt_create%20internal_login%20internal_user_mgt_delete%20internal_user_mgt_view%20internal_user_mgt_list%20internal_user_mgt_update%20internal_user_mgt_create&redirect_uri=https%3A%2F%2Foauth.pstmn.io%2Fv1%2Fcallback&response_type=id_token%20subject_token&requested_subject=32bc4697-ed0f-4546-8387-dcd6403e7caa&nonce=2131232 ``` **Sample Response after sucessful authorization** diff --git a/en/asgardeo/docs/quick-starts/react.md b/en/asgardeo/docs/quick-starts/react.md new file mode 100644 index 0000000000..1fa7220156 --- /dev/null +++ b/en/asgardeo/docs/quick-starts/react.md @@ -0,0 +1,200 @@ +--- +template: templates/quick-start.html +heading: React Quickstart +description: Welcome to the React Quickstart guide! In this document, you will learn to build a React application, add user login and display user profile information using Asgardeo. +what_you_will_learn: + - Create new React app using Vite + - Install @asgardeo/auth-react package + - Add user login and logout + - Display user profile information +prerequisites: + - About 15 minutes + - Asgardeo account + - Install a JS package manager + - A favorite text editor or IDE +source_code: React Vite App Sample +whats_next: + - Try out Asgardeo complete React guide + - Try out Asgardeo user onboarding complete guide for React + - Read Asgardeo security best practices for React app guide +--- + +## Configure an application Asgardeo + +- Sign into Asgardeo console and navigate to Applications > New Application. + +- Select Single Page Application and Complete the wizard popup by providing a suitable name and an authorized redirect URL + - Name - Asgardeo-React + - Authorized redirect URL - `https://localhost:5173` + +!!! abstract + + The authorized redirect URL determines where Asgardeo should send users after they successfully log in. Typically, this will be the web address where your application is hosted. For this guide, we'll use `https://localhost:5173`, as the sample application will be accessible at this URL. + +!!! note + + Note down the following values : you will need them during the **Step 4** + + - `client-id` + - `base-url` + - `redirect-url` + +## Create a React application using Vite + +Create (a.k.a scaffold) your new React application using Vite. + +=== "npm" + + ``` bash + npm create vite@latest asgardeo-react -- --template react + + cd asgardeo-react + + npm install + + npm run dev + ``` + +=== "yarn" + + ``` bash + yarn create vite@latest asgardeo-react -- --template react + + cd asgardeo-react + + yran install + + yarn dev + ``` + +=== "pnpm" + + ``` bash + pnpm create vite@latest asgardeo-react -- --template react + + cd asgardeo-react + + pnpm install + + pnpm run dev + ``` + +## Install @asgardeo/auth-react + +Asgardeo React SDK provides all the components and hooks you need to integrate Asgardeo into your app. To get started, simply add the Asgardeo React SDK to the project. + +=== "npm" + + ``` bash + npm install @asgardeo/auth-react + ``` + +=== "yarn" + + ``` bash + yarn add @asgardeo/auth-react + ``` + +=== "pnpm" + + ``` bash + pnpm add @asgardeo/auth-react + ``` + +## Add to your app + +The `` serves as a context provider for user login in the app. You can add the AuthProvider to your app by wrapping the root component. + +Add the following changes to the `main.jsx` file. + +!!! note + + Replace below placeholders with your registered organization name in Asgardeo and the generated `client-id` from the app you registered in Asgardeo. + + - `` + - `https://api.asgardeo.io/t/` + +```javascript title="src/main.jsx" hl_lines="4 7-13 17 19" linenums="1" +import React from 'react'; +import ReactDOM from 'react-dom/client'; +import App from './App.jsx'; +import { AuthProvider } from '@asgardeo/auth-react'; +import './index.css'; + +const config = { + signInRedirectURL: "http://localhost:5173", + signOutRedirectURL: "http://localhost:5173", + clientID: "", + baseUrl: "https://api.asgardeo.io/t/", + scope: [ "openid","profile" ] +} + +ReactDOM.createRoot(document.getElementById('root')).render( + + + + +, +); + +``` + +## Add login and logout link to your app + +Asgardeo provides `useAuthContext` hook to conveniently access user authentication data and sign-in and sign-out methods. + +Replace the existing content of the `App.jsx` file with following content. + +```javascript title="src/App.jsx" hl_lines="1 5 9-13" linenums="1" +import { useAuthContext } from "@asgardeo/auth-react"; +import './App.css'; + +const App = () => { +const { state, signIn, signOut } = useAuthContext(); + +return ( + <> + { + state.isAuthenticated + ? + : + } + +) +}; + +export default App; +``` + +Visit your app's homepage at [http://localhost:5173](http://localhost:5173). + +!!! tip + + You need to create a test user in Asgardeo by following this guide to tryout login and logout features. + +## Display logged in user details + +Modified the code as below to see logged in user details. + +```javascript title="src/App.jsx" hl_lines="8-15" linenums="1" +... + +const App = () => { +... + +return ( + <> + { + state.isAuthenticated ? + <> +

Welocme {state.username}

+ + + : + } + +) +}; + +... +``` diff --git a/en/asgardeo/docs/references/actions/pre-issue-access-token-action/api/pre-issue-access-token-action-v1.yaml b/en/asgardeo/docs/references/actions/pre-issue-access-token-action/api/pre-issue-access-token-action-v1.yaml index d1937774a9..e6596fb467 100644 --- a/en/asgardeo/docs/references/actions/pre-issue-access-token-action/api/pre-issue-access-token-action-v1.yaml +++ b/en/asgardeo/docs/references/actions/pre-issue-access-token-action/api/pre-issue-access-token-action-v1.yaml @@ -347,7 +347,13 @@ components: name: type: string value: - type: string + oneOf: + - type: string + - type: integer + - type: boolean + - type: array + items: + type: string Operations: type: object properties: diff --git a/en/asgardeo/mkdocs.yml b/en/asgardeo/mkdocs.yml index 97f94ffeed..deed00439b 100644 --- a/en/asgardeo/mkdocs.yml +++ b/en/asgardeo/mkdocs.yml @@ -166,6 +166,11 @@ nav: - Add login to an SPA: guides/authentication/add-login-to-single-page-app.md - Add login to a web app: guides/authentication/add-login-to-web-app.md - Add login to a mobile app: guides/authentication/add-login-to-mobile-app.md + - Add login to saas app: + - Add SSO login to saas apps: guides/authentication/sso-integrations/index.md + - Google Workspace: guides/authentication/sso-integrations/add-google-workspace-template.md + - Salesforce: guides/authentication/sso-integrations/add-salesforce-template.md + - Microsoft 365: guides/authentication/sso-integrations/add-microsoft-365-template.md - Add passwordless login: - Add passwordless login: guides/authentication/passwordless-login/index.md - Add login with Magic link: guides/authentication/passwordless-login/add-passwordless-login-with-magic-link.md diff --git a/en/check-broken-links-config.json b/en/check-broken-links-config.json new file mode 100644 index 0000000000..c87c774188 --- /dev/null +++ b/en/check-broken-links-config.json @@ -0,0 +1,9 @@ +{ + "liveUrl": "http://localhost:8000/asgardeo/docs", + "ignorePatterns": [ + "https://wso2.com/.*", + "mailto:.*", + "https://example.com/.*", + "https://api.asgardeo.io/t/.*" + ] +} diff --git a/en/check-broken-links.js b/en/check-broken-links.js new file mode 100644 index 0000000000..8bd6a67e01 --- /dev/null +++ b/en/check-broken-links.js @@ -0,0 +1,160 @@ +/** + * Copyright (c) 2024, WSO2 LLC. (https://www.wso2.com). + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +const markdownLinkCheck = require('markdown-link-check'); +const fs = require('fs'); +const puppeteer = require('puppeteer'); +const config = require('./check-broken-links-config.json'); + +const logFile = 'broken-links-log.txt'; +const ignoredLinkPatterns = config.ignorePatterns.map(pattern => new RegExp(pattern)); +const startUrl = config.liveUrl; // Live URL from config +const visitedUrls = new Set(); // Set to track visited URLs +const baseDomain = new URL(startUrl).hostname; // Get the base domain for comparison + +let brokenLinksCount = 0; // Counter for broken links +let localLinksCount = 0; // Counter for local links +let externalLinksCount = 0; // Counter for external links +let isShuttingDown = false; // Flag to indicate shutdown +let spinner; // Spinner for loader + +// Prepare the broken-links-log.txt file (wipes content on new run) +fs.writeFileSync(logFile, 'Broken Links Report\n====================\n\n'); + +// Function to check if a link should be ignored based on the patterns +function shouldIgnore(link) { + return ignoredLinkPatterns.some(pattern => pattern.test(link)); +} + +// Function to log broken links +function logBrokenLink(link, sourceUrl) { + brokenLinksCount++; + const logEntry = `Broken Link Found on: ${sourceUrl}\nLink: ${link}\n\n`; + fs.appendFileSync(logFile, logEntry); +} + +// Function to check links on a page and crawl nested links +async function checkLinksOnPage(url, depth = 2) { + if (isShuttingDown || depth < 0 || visitedUrls.has(url)) return; // Stop if shutting down, depth limit reached, or already visited + + visitedUrls.add(url); // Mark the URL as visited + + return new Promise((resolve) => { + // Use Puppeteer to get links from the page + (async () => { + const browser = await puppeteer.launch(); + const page = await browser.newPage(); + + try { + spinner.text = `Visiting: ${url}`; + await page.goto(url, { waitUntil: 'networkidle2' }); + const linksWithInfo = await page.evaluate(() => { + const anchorTags = Array.from(document.querySelectorAll('a')); + return anchorTags.map(tag => tag.href).filter(link => link.startsWith('http')); + }); + + // Check each link + for (const link of linksWithInfo) { + if (shouldIgnore(link)) { + continue; // Skip ignored links + } + + // Check if the link is in the same domain + const linkDomain = new URL(link).hostname; + + // Increment local or external link count + if (linkDomain === baseDomain) { + localLinksCount++; + } else { + externalLinksCount++; + } + + // Check the link status + markdownLinkCheck(link, { retry: true }, (err, results) => { + if (err) { + console.error(`Error checking ${link}:`, err); + return; + } + + results.forEach(result => { + const { dead, statusCode } = result; + + if (dead || statusCode === 404) { + logBrokenLink(link, url); + console.log(`\n[Broken Link] Found: ${link}\n`); + } + }); + }); + + // Recursively check nested links if they are in the same domain + if (linkDomain === baseDomain) { + await checkLinksOnPage(link, depth - 1); + } + } + } catch (error) { + console.error(`Error visiting ${url}:`, error); + } finally { + await browser.close(); // Ensure the browser is closed + + resolve(); + } + })(); + }); +} + +// Function to handle termination +const handleExit = () => { + isShuttingDown = true; // Set shutdown flag + spinner.stop(); // Stop the spinner + + console.log(`Total Broken Links Found: ${brokenLinksCount}`); + console.log(`Total Local Links Scanned: ${localLinksCount}`); + console.log(`Total External Links Scanned: ${externalLinksCount}`); + + fs.appendFileSync(logFile, `\nTotal Broken Links: ${brokenLinksCount}\n`); + fs.appendFileSync(logFile, `Total Local Links Scanned: ${localLinksCount}\n`); + fs.appendFileSync(logFile, `Total External Links Scanned: ${externalLinksCount}\n`); + + process.exit(); // Exit the process +}; + +// Main function to start checking links +(async () => { + // Handle SIGINT (Ctrl + C) + process.on('SIGINT', handleExit); + + // Dynamic import of ora + const ora = (await import('ora')).default; + spinner = ora('Checking links...').start(); // Start the spinner + + try { + await checkLinksOnPage(startUrl); // Start checking links + } catch (error) { + console.error('Error during link checking:', error); + } + + spinner.succeed('Link checking complete!'); // Stop the spinner + + console.log(`Total Broken Links: ${brokenLinksCount}`); + console.log(`Total Local Links Scanned: ${localLinksCount}`); + console.log(`Total External Links Scanned: ${externalLinksCount}`); + + fs.appendFileSync(logFile, `\nTotal Broken Links: ${brokenLinksCount}\n`); + fs.appendFileSync(logFile, `Total Local Links Scanned: ${localLinksCount}\n`); + fs.appendFileSync(logFile, `Total External Links Scanned: ${externalLinksCount}\n`); +})(); diff --git a/en/identity-server/7.0.0/docs/apis/restapis/application.yaml b/en/identity-server/7.0.0/docs/apis/restapis/application.yaml index 066775db90..032aebbb8c 100644 --- a/en/identity-server/7.0.0/docs/apis/restapis/application.yaml +++ b/en/identity-server/7.0.0/docs/apis/restapis/application.yaml @@ -1,10 +1,17 @@ openapi: 3.0.0 info: description: > - This document specifies an **Application Management RESTful API** for WSO2 Identity Server. + This document specifies an **Application Management RESTful API** for **WSO2 Identity Server**. version: "v1" - title: Application Management Rest API - + title: WSO2 Identity Server - Application Management Rest API + termsOfService: 'http://swagger.io/terms/' + contact: + name: WSO2 + url: 'http://wso2.com/products/identity-server/' + email: architecture@wso2.org + license: + name: Apache 2.0 + url: 'http://www.apache.org/licenses/LICENSE-2.0.html' security: - OAuth2: [] - BasicAuth: [] @@ -15,9 +22,9 @@ paths: - Applications operationId: getAllApplications summary: | - List applications + List applications. description: | - This API provides the capability to retrieve the list of applications.
+ This API provides the capability to retrieve the list of applications.
Scope(Permission) required: `internal_application_mgt_view` parameters: - $ref: '#/components/parameters/limitQueryParam' @@ -67,16 +74,15 @@ paths: curl -X 'GET' \ 'https://localhost:9443/api/server/v1/applications?limit=30&offset=0' \ -H 'accept: application/json' \ - -H 'Authorization: Basic YWRtaW46YWRtaW4=' + -H 'Authorization: Basic YWRtaW46YWRtaW4=' post: tags: - Applications summary: | - Add application + Add application. operationId: createApplication description: > - This API provides the capability to store the application information - that is provided by users.
+ This API provides the capability to store the application information that is provided by users.
Scope(Permission) required: `internal_application_mgt_create` parameters: - in: query @@ -383,7 +389,7 @@ paths: operationId: importApplication description: > This API provides the capability to create an application based on the - information provided in an XML, YAML, or JSON file.
+ information provided in an XML, YAML, or JSON file.
Scope(Permission) required: `internal_application_mgt_create` requestBody: content: @@ -438,7 +444,7 @@ paths: operationId: importApplicationForUpdate description: > This API provides the capability to update an application based on the - information provided in an XML, YAML, or JSON file.
+ information provided in an XML, YAML, or JSON file.
Scope(Permission) required: `internal_application_mgt_update` requestBody: content: @@ -496,11 +502,10 @@ paths: tags: - Applications summary: | - Retrieve application by ID + Retrieve application by ID. operationId: getApplication description: > - This API provides the capability to retrieve the application information - by ID.
+ This API provides the capability to retrieve the application information by ID.
Scope(Permission) required: `internal_application_mgt_view` parameters: - name: applicationId @@ -558,10 +563,10 @@ paths: tags: - Applications summary: | - Partially update application by ID + Partially update application by ID. operationId: patchApplication description: | - This API provides the capability to partially update an application by ID.
+ This API provides the capability to partially update an application by ID.
Scope(Permission) required: `internal_application_mgt_update` parameters: - name: applicationId @@ -716,7 +721,7 @@ paths: tags: - Applications summary: | - Delete application by ID + Delete application by ID. operationId: deleteApplication description: | This API provides the capability to delete an application by ID.
@@ -766,9 +771,9 @@ paths: - Applications operationId: exportApplication summary: | - Export application as an XML file + Export application as an XML file. description: | - This API provides the capability to retrieve the application as an XML file.
+ This API provides the capability to retrieve the application as an XML file.
Scope(Permission) required: `internal_application_mgt_view` parameters: - name: applicationId @@ -822,11 +827,8 @@ paths: summary: | Export application in XML, YAML, or JSON file formats. description: | - This API provides the capability to retrieve the application in XML, YAML, or JSON format.
- Permission required:
- * /permission/admin/manage/identity/applicationmgt/view
- Scope required:
- * internal_application_mgt_view + This API provides the capability to retrieve the application in XML, YAML, or JSON format.
+ Scope(Permission) required: `internal_application_mgt_view` parameters: - name: applicationId in: path @@ -891,9 +893,9 @@ paths: - Applications operationId: changeApplicationOwner summary: | - Change application owner + Change application owner. description: | - This API provides the capability to change the application owner.
+ This API provides the capability to change the application owner.
Scope(Permission) required: `internal_organization_admin` parameters: - name: applicationId @@ -948,11 +950,11 @@ paths: tags: - Authenticators summary: | - Get configured authenticators + Get configured authenticators. operationId: getConfiguredAuthenticators description: | - This API provides the capability to retrieve the configured authenticators. - Scope(Permission) required: `internal_application_mgt_view` + This API provides the capability to retrieve the configured authenticators.
+ Scope(Permission) required: `internal_application_mgt_view` parameters: - name: applicationId in: path @@ -1006,8 +1008,7 @@ paths: Get authorized APIs of the application. operationId: getAuthorizedAPIs description: | - This API provides the capability to retrieve all the authorized APIs of the application.
- + This API provides the capability to retrieve all the authorized APIs of the application.
Scope(Permission) required: `internal_application_mgt_view` parameters: - name: applicationId @@ -1046,11 +1047,10 @@ paths: tags: - Authorized APIs summary: | - Authorized an API to the application + Authorized an API to the application. operationId: addAuthorizedAPI description: | - This API provides the capability to authorized an API to the application.
- + This API provides the capability to authorized an API to the application.
Scope(Permission) required: `internal_application_mgt_update` parameters: - name: applicationId @@ -1099,17 +1099,15 @@ paths: ] }' x-codegen-request-body-name: body - /applications/{applicationId}/authorized-apis/{apiId}: patch: tags: - Authorized APIs summary: | - Update authorized API scopes + Update authorized API scopes. operationId: patchAuthorizedAPI description: | - This API provides the capability to update an authorized API of the application.
- + This API provides the capability to update an authorized API of the application.
Scope(Permission) required: `internal_application_mgt_update` parameters: - name: applicationId @@ -1169,11 +1167,10 @@ paths: tags: - Authorized APIs summary: | - Remove API authorization from the application + Remove API authorization from the application. operationId: deleteAuthorizedAPI description: | - This API provides the capability to delete an authorized API of the application.
- + This API provides the capability to delete an authorized API of the application.
Scope(Permission) required: `internal_application_mgt_update` parameters: - name: applicationId @@ -1211,11 +1208,10 @@ paths: tags: - Resident Application summary: | - Get Resident application + Get resident application. operationId: getResidentApplication description: | - This API provides the capability to retrieve the resident application information. -
+ This API provides the capability to retrieve the resident application information.
Scope(Permission) required: `internal_application_mgt_view` responses: '200': @@ -1257,10 +1253,10 @@ paths: tags: - Resident Application summary: | - Update resident application + Update resident application. operationId: updateResidentApplication description: > - This API provides the capability to update the Resident Application Configuration.
+ This API provides the capability to update the resident application configuration.
Scope(Permission) required: `internal_application_mgt_update` responses: '200': @@ -1339,11 +1335,10 @@ paths: tags: - Inbound Protocols summary: | - Retrieve inbound protocol configurations + Retrieve inbound protocol configurations. operationId: getInboundAuthenticationConfigurations description: > - This API provides the capability to retrieve authentication protocol - configurations of an application.
+ This API provides the capability to retrieve authentication protocol configurations of an application.
Scope(Permission) required: `internal_application_mgt_view` parameters: - name: applicationId @@ -1393,11 +1388,10 @@ paths: tags: - Inbound Protocols - SAML summary: | - Retrieve SAML2 authentication protocol parameters + Retrieve SAML2 authentication protocol parameters. operationId: getInboundSAMLConfiguration description: > - This API provides the capability to retrieve SAML2 authentication - protocol parameters of an application.
+ This API provides the capability to retrieve SAML2 authentication protocol parameters of an application.
Scope(Permission) required: `internal_application_mgt_view` parameters: - name: applicationId @@ -1446,11 +1440,10 @@ paths: tags: - Inbound Protocols - SAML summary: | - Update SAML2 authentication protocol parameters + Update SAML2 authentication protocol parameters. operationId: updateInboundSAMLConfiguration description: > - This API provides the capability to store SAML2 authentication protocol - parameters of an application.
+ This API provides the capability to store SAML2 authentication protocol parameters of an application.
Scope(Permission) required: `internal_application_mgt_update` - There are three methods to create/update SAML2 authentication protocol configuration. @@ -1581,11 +1574,10 @@ paths: tags: - Inbound Protocols - SAML summary: | - Delete SAML2 authentication protocol parameters + Delete SAML2 authentication protocol parameters. operationId: deleteInboundSAMLConfiguration description: > - This API provides the capability to delete SAML2 authentication protocol - parameters of an application.
+ This API provides the capability to delete SAML2 authentication protocol parameters of an application.
Scope(Permission) required: `internal_application_mgt_delete` parameters: - name: applicationId @@ -1631,10 +1623,9 @@ paths: tags: - Inbound Protocols - OAuth / OIDC summary: | - Retrieve OIDC authentication protocol parameters + Retrieve OIDC authentication protocol parameters. description: > - This API provides the capability to retrieve OIDC authentication - protocol parameters of an application.
+ This API provides the capability to retrieve OIDC authentication protocol parameters of an application.
Scope(Permission) required: `internal_application_mgt_view` operationId: getInboundOAuthConfiguration parameters: @@ -1684,10 +1675,9 @@ paths: tags: - Inbound Protocols - OAuth / OIDC summary: | - Update OIDC authentication protocol parameters + Update OIDC authentication protocol parameters. description: > - This API provides the capability to store OIDC authentication protocol - parameters of an application.
+ This API provides the capability to store OIDC authentication protocol parameters of an application.
Scope(Permission) required: `internal_application_mgt_update` operationId: updateInboundOAuthConfiguration parameters: @@ -1808,10 +1798,9 @@ paths: tags: - Inbound Protocols - OAuth / OIDC summary: | - Delete OIDC authentication protocol parameters + Delete OIDC authentication protocol parameters. description: > - This API provides the capability to delete OIDC authentication protocol - parameters of an application.
+ This API provides the capability to delete OIDC authentication protocol parameters of an application.
Scope(Permission) required: `internal_application_mgt_delete` operationId: deleteInboundOAuthConfiguration parameters: @@ -1858,7 +1847,7 @@ paths: tags: - Inbound Protocols - OAuth / OIDC summary: | - Regenerate the OAuth2/OIDC client secret + Regenerate the OAuth2/OIDC client secret. description: | This API regenerates the OAuth2/OIDC client secret.
Scope(Permission) required: `internal_application_mgt_create` @@ -1912,9 +1901,10 @@ paths: tags: - Inbound Protocols - OAuth / OIDC summary: | - Revoke the OAuth2/OIDC client of application + Revoke the OAuth2/OIDC client of application. description: | - This API revokes the OAuth2/OIDC client secret. To re-activate the client, the client secret needs to be regenerated.
+ This API revokes the OAuth2/OIDC client secret. + To re-activate the client, the client secret needs to be regenerated.
Scope(Permission) required: `internal_application_mgt_create` operationId: revokeOAuthClient parameters: @@ -1962,7 +1952,7 @@ paths: tags: - Inbound Protocols - Passive STS summary: > - Retrieve Passive STS authentication protocol parameters + Retrieve Passive STS authentication protocol parameters. description: > This API provides the capability to retrieve Passive STS authentication protocol parameters of an application.
@@ -2015,10 +2005,9 @@ paths: tags: - Inbound Protocols - Passive STS summary: | - Update Passive STS authentication protocol parameters + Update Passive STS authentication protocol parameters. description: > - This API provides the capability to store passive STS authentication - protocol parameters of an application.
+ This API provides the capability to store passive STS authentication protocol parameters of an application.
Scope(Permission) required: `internal_application_mgt_update` operationId: updatePassiveStsConfiguration parameters: @@ -2093,7 +2082,7 @@ paths: tags: - Inbound Protocols - Passive STS summary: | - Delete Passive STS authentication protocol parameters + Delete Passive STS authentication protocol parameters. description: > This API provides the capability to delete Passive STS authentication protocol parameters of an application.
@@ -2143,7 +2132,7 @@ paths: tags: - Inbound Protocols - WS Trust summary: | - Retrieve WS Trust authentication protocol parameters + Retrieve WS Trust authentication protocol parameters. description: > This API provides the capability to retrieve Passive STS authentication protocol parameters of an application.
@@ -2196,10 +2185,9 @@ paths: tags: - Inbound Protocols - WS Trust summary: | - Update WS Trust authentication protocol parameters + Update WS Trust authentication protocol parameters. description: > - This API provides the capability to store WS Trust authentication - protocol parameters of an application.
+ This API provides the capability to store WS Trust authentication protocol parameters of an application.
Scope(Permission) required: `internal_application_mgt_update` operationId: updateWSTrustConfiguration parameters: @@ -2274,10 +2262,9 @@ paths: tags: - Inbound Protocols - WS Trust summary: | - Delete WS Trust authentication protocol parameters + Delete WS Trust authentication protocol parameters. description: > - This API provides the capability to delete WS Trust authentication - protocol parameters of an application.
+ This API provides the capability to delete WS Trust authentication protocol parameters of an application.
Scope(Permission) required: `internal_application_mgt_delete` operationId: deleteWSTrustConfiguration parameters: @@ -2324,7 +2311,7 @@ paths: tags: - Inbound Protocols - Custom summary: > - Retrieve custom inbound authentication protocol parameters + Retrieve custom inbound authentication protocol parameters. description: > This API provides the capability to retrieve custom inbound authentication protocol parameters of an application.
@@ -2383,10 +2370,10 @@ paths: tags: - Inbound Protocols - Custom summary: | - Update the custom inbound authentication protocol parameters + Update the custom inbound authentication protocol parameters. description: > - This API provides the capability to store custom inbound authentication protocol parameters of an application. -
+ This API provides the capability to store custom inbound authentication + protocol parameters of an application.
Scope(Permission) required: `internal_application_mgt_update` operationId: updateCustomInboundConfiguration parameters: @@ -2474,7 +2461,7 @@ paths: tags: - Inbound Protocols - Custom summary: > - Delete custom inbound authentication protocol parameters + Delete custom inbound authentication protocol parameters. description: > This API provides the capability to delete custom inbound authentication protocol of an application.
Scope(Permission) required: `internal_application_mgt_delete` @@ -2529,11 +2516,10 @@ paths: tags: - Application Metadata summary: | - Retrieve the list of inbound authentication protocols available + 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. -
+ If the query parameter 'customOnly' is set to true, only custom inbound protocols will be listed.
Scope(Permission) required: `internal_application_mgt_view` operationId: getInboundProtocols parameters: @@ -2578,7 +2564,7 @@ paths: tags: - Application Metadata summary: | - Retrieve all the metadata related to the auth protocol SAML + 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.
Scope(Permission) required: `internal_application_mgt_view` @@ -2626,9 +2612,10 @@ paths: tags: - Application Metadata summary: | - Retrieve all the metadata related to the authentication protocol OAuth / OIDC + 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.
+ This API provides the capability to retrieve all the metadata related + to the authentication protocol OAuth / OIDC.
Scope(Permission) required: `internal_application_mgt_view` operationId: getOIDCMetadata responses: @@ -2666,7 +2653,7 @@ paths: tags: - Application Metadata summary: | - Retrieve all the metadata related to the auth protocol WS Trust + 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.
Scope(Permission) required: `internal_application_mgt_view` @@ -2706,10 +2693,10 @@ paths: tags: - Application Metadata summary: | - Retrieve all the metadata related to the custom auth protocol identified by the inboundProtocolId + 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.
+ identified by the inboundProtocolId. The URL encoded inbound protocol name is used as inboundProtocolId.
Scope(Permission) required: `internal_application_mgt_view` operationId: getCustomProtocolMetadata parameters: @@ -2754,7 +2741,7 @@ paths: tags: - Application Metadata summary: | - Retrieve adaptive authentication sample templates + Retrieve adaptive authentication sample templates. description: > This API provides the capability to retrieve the sample adaptive authentication templates.
Scope(Permission) required: `internal_application_mgt_view` @@ -2795,7 +2782,7 @@ paths: - Application Templates operationId: getAllApplicationTemplates summary: | - List application templates + List application templates. description: | This API provides the capability to retrieve the list of templates available.
Scope(Permission) required: `internal_application_mgt_view` @@ -2849,7 +2836,7 @@ paths: tags: - Application Templates summary: | - Add application template + Add application template. operationId: createApplicationTemplate description: > This API provides the capability to store the application template provided by users.
@@ -3161,7 +3148,7 @@ paths: tags: - Application Templates summary: | - Retrieve application template by ID + Retrieve application template by ID. operationId: getApplicationTemplate description: > This API provides the capability to retrieve the application template from the template id.
@@ -3217,7 +3204,7 @@ paths: tags: - Application Templates summary: | - Update the application template by the template ID + Update the application template by the template ID. operationId: updateApplicationTemplate description: | This API provides the capability to update an application template by the template ID.
@@ -3524,7 +3511,7 @@ paths: tags: - Application Templates summary: | - Delete application template by template ID + Delete application template by template ID. operationId: deleteApplicationTemplate description: | This API provides the capability to delete an application template by template ID.
@@ -3571,9 +3558,7 @@ paths: summary: | Share the application from the root organization to the given organization(s). description: | - This API provides the capability to share an application with organizations. -
- + This API provides the capability to share an application with organizations.
Scope(Permission) required: `internal_shared_application_create` operationId: shareOrgApplication parameters: @@ -3636,9 +3621,7 @@ paths: summary: | List of organizations that the application is shared to. description: | - This API returns the list of organizations that the application is shared to. -

- + This API returns the list of organizations that the application is shared to.
Scope(Permission) required: `internal_shared_application_view` operationId: shareOrgApplicationGet parameters: @@ -3690,9 +3673,7 @@ paths: 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. -

- + 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: @@ -3741,9 +3722,8 @@ paths: -H 'Authorization: Basic YWRtaW46YWRtaW4=' delete: description: | - This API provides the capability to stop sharing an application to all organizations the application is shared to. -

- + 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. @@ -3791,9 +3771,7 @@ paths: /applications/{applicationId}/share/{shared-organization-id}: delete: description: | - This API provides the capability to stop sharing an application to an organization by providing its ID. -

- + 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. @@ -3924,9 +3902,10 @@ components: required: false description: | Specifies the required parameters in the response. - Only 'advancedConfigurations', 'templateId', 'clientId', and 'issuer' attributes are currently supported. + Only 'advancedConfigurations', 'templateId', 'clientId', 'issuer', and 'associatedRoles.allowedAudience' + attributes are currently supported. - /applications?attributes=advancedConfigurations,templateId,clientId,issuer + /applications?attributes=advancedConfigurations,templateId,clientId,issuer,associatedRoles.allowedAudience schema: type: string exportSecretsQueryParam: @@ -3992,7 +3971,6 @@ components: rel: type: string example: "next" - ApplicationListResponse: type: object properties: @@ -4016,7 +3994,6 @@ components: type: array items: $ref: '#/components/schemas/Link' - ApplicationListItem: type: object properties: @@ -4041,6 +4018,9 @@ components: issuer: type: string example: 'http://idp.example.com/metadata.php' + realm: + type: string + example: 'PassiveSTSSampleApp' access: type: string enum: @@ -4055,7 +4035,9 @@ components: templateId: type: string example: "980b8tester24c64a8a09a0d80abf8c337bd2555" - + associatedRoles: + type: object + $ref: '#/components/schemas/AssociatedRolesConfig' ApplicationModel: type: object required: @@ -4088,6 +4070,13 @@ components: type: boolean example: false description: Decides whether the application used to access System APIs + isB2BSelfServiceApp: + default: false + type: boolean + example: false + description: Decides whether the application used to for B2B self service + associatedRoles: + $ref: '#/components/schemas/AssociatedRolesConfig' claimConfiguration: $ref: '#/components/schemas/ClaimConfiguration' inboundProtocolConfiguration: @@ -4098,7 +4087,6 @@ components: $ref: '#/components/schemas/AdvancedApplicationConfiguration' provisioningConfigurations: $ref: '#/components/schemas/ProvisioningConfiguration' - ApplicationResponseModel: type: object required: @@ -4129,6 +4117,9 @@ components: issuer: type: string example: 'http://idp.example.com/metadata.php' + realm: + type: string + example: 'PassiveSTSSampleApp' templateId: type: string example: "adwefi2429asdfdf94444rraf44" @@ -4136,6 +4127,12 @@ components: 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 + associatedRoles: + $ref: '#/components/schemas/AssociatedRolesConfig' claimConfiguration: $ref: '#/components/schemas/ClaimConfiguration' inboundProtocols: @@ -4152,7 +4149,6 @@ components: - READ - WRITE default: READ - ApplicationPatchModel: type: object properties: @@ -4174,6 +4170,8 @@ components: templateId: type: string example: "adwefi2429asdfdf94444rraf44" + associatedRoles: + $ref: '#/components/schemas/AssociatedRolesConfig' claimConfiguration: $ref: '#/components/schemas/ClaimConfiguration' authenticationSequence: @@ -4182,13 +4180,11 @@ components: $ref: '#/components/schemas/AdvancedApplicationConfiguration' provisioningConfigurations: $ref: '#/components/schemas/ProvisioningConfiguration' - ResidentApplication: type: object properties: provisioningConfigurations: $ref: '#/components/schemas/ProvisioningConfiguration' - ProvisioningConfiguration: type: object properties: @@ -4210,7 +4206,6 @@ components: description: >- This property becomes only applicable if the proxy-mode config is set to false - OutboundProvisioningConfiguration: type: object properties: @@ -4229,6 +4224,8 @@ components: jit: type: boolean example: false + description: >- + This property is disabled by default as of Identity Server version 7.0 onwards. ConfiguredAuthenticatorsModal: type: object properties: @@ -4285,6 +4282,33 @@ components: 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" additionalSpProperties: $ref: '#/components/schemas/AdditionalProperties' AdditionalProperties: @@ -4334,12 +4358,10 @@ components: type: array items: $ref: '#/components/schemas/CustomInboundProtocolConfiguration' - InboundProtocolsListResponse: type: array items: $ref: '#/components/schemas/InboundProtocolListItem' - InboundProtocolListItem: type: object required: @@ -4356,7 +4378,6 @@ components: self: type: string example: "/api/server/v1/applications/29048810-1447-4ea0-a348-30d15ab65fa3/inbound-protocols/saml" - ClaimConfiguration: type: object properties: @@ -4392,6 +4413,9 @@ components: useMappedLocalSubject: type: boolean example: false + mappedLocalSubjectMandatory: + type: boolean + example: false RoleConfig: type: object properties: @@ -4416,6 +4440,33 @@ components: 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: @@ -4458,7 +4509,6 @@ components: type: string example: Username readOnly: true - SAML2Configuration: type: object properties: @@ -4470,7 +4520,6 @@ components: example: 'https://example.com/samlsso/meta' manualConfiguration: $ref: '#/components/schemas/SAML2ServiceProvider' - SingleSignOnProfile: type: object properties: @@ -4482,23 +4531,18 @@ components: - 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: @@ -4508,7 +4552,6 @@ components: alwaysIncludeAttributesInResponse: type: boolean default: false - SingleLogoutProfile: type: object properties: @@ -4529,7 +4572,6 @@ components: - FRONTCHANNEL_HTTP_POST idpInitiatedSingleLogout: $ref: '#/components/schemas/IdpInitiatedSingleLogout' - IdpInitiatedSingleLogout: type: object properties: @@ -4540,7 +4582,6 @@ components: type: array items: type: string - SAMLAssertionConfiguration: type: object properties: @@ -4548,7 +4589,6 @@ components: 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 @@ -4556,7 +4596,6 @@ components: - 'https://app.example.com/saml' items: type: string - recipients: type: array description: Additional recipient values to be added to the SAML Assertions @@ -4564,14 +4603,12 @@ components: - '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: @@ -4584,7 +4621,6 @@ components: keyEncryptionAlgorithm: type: string default: "http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p" - SAMLRequestValidation: type: object properties: @@ -4593,7 +4629,6 @@ components: default: true signatureValidationCertAlias: type: string - SAMLResponseSigning: type: object properties: @@ -4602,13 +4637,11 @@ components: default: true signingAlgorithm: type: string - SAML2ServiceProvider: type: object required: - issuer - assertionConsumerUrls - properties: issuer: type: string @@ -4625,26 +4658,19 @@ components: 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: @@ -4696,6 +4722,8 @@ components: $ref: '#/components/schemas/AccessTokenConfiguration' refreshToken: $ref: '#/components/schemas/RefreshTokenConfiguration' + subjectToken: + $ref: '#/components/schemas/SubjectTokenConfiguration' idToken: $ref: '#/components/schemas/IdTokenConfiguration' logout: @@ -4711,6 +4739,19 @@ components: - XACML Scope Validator items: type: string + clientAuthentication: + $ref: '#/components/schemas/ClientAuthenticationConfiguration' + requestObject: + $ref: '#/components/schemas/RequestObjectConfiguration' + pushAuthorizationRequest: + $ref: '#/components/schemas/PushAuthorizationRequestConfiguration' + 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: @@ -4759,6 +4800,15 @@ components: 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: @@ -4773,6 +4823,9 @@ components: - 'http://idp.abc.com' items: type: string + idTokenSignedResponseAlg: + type: string + example: 'PS256' encryption: $ref: '#/components/schemas/IdTokenEncryptionConfiguration' IdTokenEncryptionConfiguration: @@ -4788,6 +4841,50 @@ components: method: type: string example: A128CBC+HS256 + ClientAuthenticationConfiguration: + type: object + properties: + tokenEndpointAuthMethod: + type: string + example: 'client_secret_basic' + 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: @@ -4807,6 +4904,8 @@ components: type: string replyTo: type: string + replyToLogout: + type: string WSTrustConfiguration: type: object required: @@ -4879,7 +4978,6 @@ components: type: integer default: 1 example: 1 - AuthenticationStepModel: type: object required: @@ -4907,7 +5005,6 @@ components: authenticator: type: string example: basic - AuthProtocolMetadata: type: object properties: @@ -4928,6 +5025,31 @@ components: 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: @@ -4987,6 +5109,22 @@ components: $ref: '#/components/schemas/MetadataProperty' accessTokenBindingType: $ref: '#/components/schemas/MetadataProperty' + tokenEndpointAuthMethod: + $ref: '#/components/schemas/ClientAuthenticationMethodMetadata' + 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: @@ -5043,14 +5181,12 @@ components: isConfidential: type: boolean default: false - AdaptiveAuthTemplates: type: object properties: templatesJSON: type: string example: 'Adaptive Auth Templates JSON' - FileUpload: type: object properties: @@ -5065,7 +5201,6 @@ components: type: array items: $ref: '#/components/schemas/ApplicationTemplatesListItem' - ApplicationTemplatesListItem: type: object properties: @@ -5175,7 +5310,6 @@ components: type: array items: $ref: '#/components/schemas/AuthorizedScope' - AuthorizedScope: type: object properties: @@ -5188,7 +5322,6 @@ components: displayName: type: string example: Read Bookings - AuthorizedAPICreationModel: type: object properties: @@ -5203,7 +5336,6 @@ components: items: type: string example: bookings:read - AuthorizedAPIPatchModel: type: object properties: @@ -5291,7 +5423,6 @@ components: ref: type: string example: '/t/wso2.com/api/server/v1/organizations/b4526d91-a8bf-43d2-8b14-c548cf73065b' - servers: - url: 'https://{serverUrl}/t/{tenantDomain}/api/server/v1' variables: diff --git a/en/identity-server/7.0.0/docs/assets/img/guides/authorization/impersonation/user-impersonation-selection.png b/en/identity-server/7.0.0/docs/assets/img/guides/authorization/impersonation/user-impersonation-selection.png new file mode 100644 index 0000000000..1ab3fbbaf6 Binary files /dev/null and b/en/identity-server/7.0.0/docs/assets/img/guides/authorization/impersonation/user-impersonation-selection.png differ diff --git a/en/identity-server/7.0.0/docs/assets/img/guides/sso-integrations/google-workspace-sso/add-app.png b/en/identity-server/7.0.0/docs/assets/img/guides/sso-integrations/google-workspace-sso/add-app.png new file mode 100644 index 0000000000..b15615d8e9 Binary files /dev/null and b/en/identity-server/7.0.0/docs/assets/img/guides/sso-integrations/google-workspace-sso/add-app.png differ diff --git a/en/identity-server/7.0.0/docs/assets/img/guides/sso-integrations/google-workspace-sso/add-google-app.png b/en/identity-server/7.0.0/docs/assets/img/guides/sso-integrations/google-workspace-sso/add-google-app.png new file mode 100644 index 0000000000..2dc28e0963 Binary files /dev/null and b/en/identity-server/7.0.0/docs/assets/img/guides/sso-integrations/google-workspace-sso/add-google-app.png differ diff --git a/en/identity-server/7.0.0/docs/assets/img/guides/sso-integrations/google-workspace-sso/sso-fill-google.png b/en/identity-server/7.0.0/docs/assets/img/guides/sso-integrations/google-workspace-sso/sso-fill-google.png new file mode 100644 index 0000000000..08f45ffcde Binary files /dev/null and b/en/identity-server/7.0.0/docs/assets/img/guides/sso-integrations/google-workspace-sso/sso-fill-google.png differ diff --git a/en/identity-server/7.0.0/docs/assets/img/guides/sso-integrations/microsoft-365-sso/add-microsoft-365-app.png b/en/identity-server/7.0.0/docs/assets/img/guides/sso-integrations/microsoft-365-sso/add-microsoft-365-app.png new file mode 100644 index 0000000000..c7aa978d9d Binary files /dev/null and b/en/identity-server/7.0.0/docs/assets/img/guides/sso-integrations/microsoft-365-sso/add-microsoft-365-app.png differ diff --git a/en/identity-server/7.0.0/docs/assets/img/guides/sso-integrations/salesforce-sso/add-entity-id.png b/en/identity-server/7.0.0/docs/assets/img/guides/sso-integrations/salesforce-sso/add-entity-id.png new file mode 100644 index 0000000000..1736bf5a93 Binary files /dev/null and b/en/identity-server/7.0.0/docs/assets/img/guides/sso-integrations/salesforce-sso/add-entity-id.png differ diff --git a/en/identity-server/7.0.0/docs/assets/img/guides/sso-integrations/salesforce-sso/add-salesforce-app.png b/en/identity-server/7.0.0/docs/assets/img/guides/sso-integrations/salesforce-sso/add-salesforce-app.png new file mode 100644 index 0000000000..2edf06c105 Binary files /dev/null and b/en/identity-server/7.0.0/docs/assets/img/guides/sso-integrations/salesforce-sso/add-salesforce-app.png differ diff --git a/en/identity-server/7.0.0/docs/assets/img/guides/sso-integrations/salesforce-sso/salesforce-sso.png b/en/identity-server/7.0.0/docs/assets/img/guides/sso-integrations/salesforce-sso/salesforce-sso.png new file mode 100644 index 0000000000..abdeae1fc9 Binary files /dev/null and b/en/identity-server/7.0.0/docs/assets/img/guides/sso-integrations/salesforce-sso/salesforce-sso.png differ diff --git a/en/identity-server/7.0.0/docs/assets/img/logo/salesforce.svg b/en/identity-server/7.0.0/docs/assets/img/logo/salesforce.svg new file mode 100644 index 0000000000..8a15f25559 --- /dev/null +++ b/en/identity-server/7.0.0/docs/assets/img/logo/salesforce.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/en/identity-server/7.0.0/docs/guides/authentication/sso-integrations/add-google-workspace-template.md b/en/identity-server/7.0.0/docs/guides/authentication/sso-integrations/add-google-workspace-template.md new file mode 100644 index 0000000000..ddac61bbdd --- /dev/null +++ b/en/identity-server/7.0.0/docs/guides/authentication/sso-integrations/add-google-workspace-template.md @@ -0,0 +1,5 @@ +{% set product_name = "WSO2 Identity Server" %} +{% set product_url = "https://localhost:9443" %} +{% set product_url_format = "https://localhost:9443" %} +{% set product_url_sample = "https://localhost:9443" %} +{% include "../../../../../../includes/guides/authentication/sso-integrations/add-google-workspace-template.md" %} \ No newline at end of file diff --git a/en/identity-server/7.0.0/docs/guides/authentication/sso-integrations/add-microsoft-365-template.md b/en/identity-server/7.0.0/docs/guides/authentication/sso-integrations/add-microsoft-365-template.md new file mode 100644 index 0000000000..a8dd1bafe1 --- /dev/null +++ b/en/identity-server/7.0.0/docs/guides/authentication/sso-integrations/add-microsoft-365-template.md @@ -0,0 +1,5 @@ +{% set product_name = "WSO2 Identity Server" %} +{% set product_url = "https://localhost:9443" %} +{% set product_url_format = "https://localhost:9443" %} +{% set product_url_sample = "https://localhost:9443" %} +{% include "../../../../../../includes/guides/authentication/sso-integrations/add-microsoft-365-template.md" %} \ No newline at end of file diff --git a/en/identity-server/7.0.0/docs/guides/authentication/sso-integrations/add-salesforce-template.md b/en/identity-server/7.0.0/docs/guides/authentication/sso-integrations/add-salesforce-template.md new file mode 100644 index 0000000000..9c5f3c3790 --- /dev/null +++ b/en/identity-server/7.0.0/docs/guides/authentication/sso-integrations/add-salesforce-template.md @@ -0,0 +1,5 @@ +{% set product_name = "WSO2 Identity Server" %} +{% set product_url = "https://localhost:9443" %} +{% set product_url_format = "https://localhost:9443" %} +{% set product_url_sample = "https://localhost:9443" %} +{% include "../../../../../../includes/guides/authentication/sso-integrations/add-salesforce-template.md" %} \ No newline at end of file diff --git a/en/identity-server/7.0.0/docs/guides/authentication/sso-integrations/index.md b/en/identity-server/7.0.0/docs/guides/authentication/sso-integrations/index.md new file mode 100644 index 0000000000..f96e14b102 --- /dev/null +++ b/en/identity-server/7.0.0/docs/guides/authentication/sso-integrations/index.md @@ -0,0 +1 @@ +{% include "../../../../../../includes/guides/authentication/sso-integrations/index.md" %} \ No newline at end of file diff --git a/en/identity-server/7.0.0/docs/guides/authorization/impersonation/user-impersonation.md b/en/identity-server/7.0.0/docs/guides/authorization/impersonation/user-impersonation.md index 904de45c94..bc8fd65e2b 100644 --- a/en/identity-server/7.0.0/docs/guides/authorization/impersonation/user-impersonation.md +++ b/en/identity-server/7.0.0/docs/guides/authorization/impersonation/user-impersonation.md @@ -108,10 +108,12 @@ You only need to run this command once per deployment. 1. On the {{ product_name }} Console, go to **Applications**. -2. Select the application and go to API Authorization tab of the application and click authorize API Resource. +2. Select the application and go to API Authorization tab of the application and click authorize on API Resource. 3. Search for User Impersonation under management APIs and subscribe to the application. + ![Api-Authorization-Impersonation-Selection]({{base_path}}/assets/img/guides/authorization/impersonation/user-impersonation-selection.png){: width="700" style="display: block; margin: 0; border: 0.3px solid lightgrey;"} + ![Api-Authorization-Impersonation]({{base_path}}/assets/img/guides/authorization/impersonation/api-authorization-impersonation.png){: width="700" style="display: block; margin: 0; border: 0.3px solid lightgrey;"} 4. Switch to the Roles tab, click on **+ New Role** to create a Role and assign the Impersonation Scope. @@ -161,12 +163,12 @@ A security JWT token that represents the identity of both parties Impersonator a **Request Format** ``` bash -https://{{ host_name }}/oauth2/authorize?response_type=code&redirect_uri={redirect_uri}&client_id={client_id}state=&scope=internal_user_impersonate%20{Other_Required_Scopes}&response_type=id_token%20subject_token&requested_subject={User_id_of_the_end_user}&nonce={nonce} +https://{{ host_name }}/oauth2/authorize?redirect_uri={redirect_uri}&client_id={client_id}&state=&scope=internal_user_impersonate%20{Other_Required_Scopes}&response_type=id_token%20subject_token&requested_subject={User_id_of_the_end_user}&nonce={nonce} ``` **Sample Request** ``` bash -https://localhost:9443/oauth2/authorize?client_id=jVcW4oLn1Jjb2T94H4gtPV9z5Y0a&state=sample_state&scope=internal_user_impersonate%20openid%20internal_org_user_mgt_view%20internal_org_user_mgt_list%20internal_user_mgt_delete%20internal_org_user_mgt_create%20internal_login%20internal_user_mgt_delete%20internal_user_mgt_view%20internal_user_mgt_list%20internal_user_mgt_update%20internal_user_mgt_create%20readBooking%0A&redirect_uri=https%3A%2F%2Foauth.pstmn.io%2Fv1%2Fcallback&response_type=id_token%20subject_token&requested_subject=32bc4697-ed0f-4546-8387-dcd6403e7caa&nonce=2131232 +https://localhost:9443/oauth2/authorize?client_id=jVcW4oLn1Jjb2T94H4gtPV9z5Y0a&state=sample_state&scope=internal_user_impersonate%20openid%20internal_org_user_mgt_view%20internal_org_user_mgt_list%20internal_user_mgt_delete%20internal_org_user_mgt_create%20internal_login%20internal_user_mgt_delete%20internal_user_mgt_view%20internal_user_mgt_list%20internal_user_mgt_update%20internal_user_mgt_create&redirect_uri=https%3A%2F%2Foauth.pstmn.io%2Fv1%2Fcallback&response_type=id_token%20subject_token&requested_subject=32bc4697-ed0f-4546-8387-dcd6403e7caa&nonce=2131232 ``` **Sample Response after sucessful authorization** diff --git a/en/identity-server/7.0.0/mkdocs.yml b/en/identity-server/7.0.0/mkdocs.yml index 93b672352c..7b51aba0e9 100644 --- a/en/identity-server/7.0.0/mkdocs.yml +++ b/en/identity-server/7.0.0/mkdocs.yml @@ -377,6 +377,11 @@ nav: - Add login to an SPA: guides/authentication/add-login-to-single-page-app.md - Add login to a web app: guides/authentication/add-login-to-web-app.md - Add login to a mobile app: guides/authentication/add-login-to-mobile-app.md + - Add login to saas app: + - Add SSO login to saas apps: guides/authentication/sso-integrations/index.md + - Google Workspace: guides/authentication/sso-integrations/add-google-workspace-template.md + - Salesforce: guides/authentication/sso-integrations/add-salesforce-template.md + - Microsoft 365: guides/authentication/sso-integrations/add-microsoft-365-template.md - Add passwordless login: - Add passwordless login: guides/authentication/passwordless-login/index.md - Add login with Magic link: guides/authentication/passwordless-login/add-passwordless-login-with-magic-link.md diff --git a/en/identity-server/next/docs/assets/img/guides/sso-integrations/google-workspace-sso/add-app.png b/en/identity-server/next/docs/assets/img/guides/sso-integrations/google-workspace-sso/add-app.png new file mode 100644 index 0000000000..b15615d8e9 Binary files /dev/null and b/en/identity-server/next/docs/assets/img/guides/sso-integrations/google-workspace-sso/add-app.png differ diff --git a/en/identity-server/next/docs/assets/img/guides/sso-integrations/google-workspace-sso/add-google-app.png b/en/identity-server/next/docs/assets/img/guides/sso-integrations/google-workspace-sso/add-google-app.png new file mode 100644 index 0000000000..2dc28e0963 Binary files /dev/null and b/en/identity-server/next/docs/assets/img/guides/sso-integrations/google-workspace-sso/add-google-app.png differ diff --git a/en/identity-server/next/docs/assets/img/guides/sso-integrations/google-workspace-sso/sso-fill-google.png b/en/identity-server/next/docs/assets/img/guides/sso-integrations/google-workspace-sso/sso-fill-google.png new file mode 100644 index 0000000000..08f45ffcde Binary files /dev/null and b/en/identity-server/next/docs/assets/img/guides/sso-integrations/google-workspace-sso/sso-fill-google.png differ diff --git a/en/identity-server/next/docs/assets/img/guides/sso-integrations/microsoft-365-sso/add-microsoft-365-app.png b/en/identity-server/next/docs/assets/img/guides/sso-integrations/microsoft-365-sso/add-microsoft-365-app.png new file mode 100644 index 0000000000..c7aa978d9d Binary files /dev/null and b/en/identity-server/next/docs/assets/img/guides/sso-integrations/microsoft-365-sso/add-microsoft-365-app.png differ diff --git a/en/identity-server/next/docs/assets/img/guides/sso-integrations/salesforce-sso/add-entity-id.png b/en/identity-server/next/docs/assets/img/guides/sso-integrations/salesforce-sso/add-entity-id.png new file mode 100644 index 0000000000..1736bf5a93 Binary files /dev/null and b/en/identity-server/next/docs/assets/img/guides/sso-integrations/salesforce-sso/add-entity-id.png differ diff --git a/en/identity-server/next/docs/assets/img/guides/sso-integrations/salesforce-sso/add-salesforce-app.png b/en/identity-server/next/docs/assets/img/guides/sso-integrations/salesforce-sso/add-salesforce-app.png new file mode 100644 index 0000000000..2edf06c105 Binary files /dev/null and b/en/identity-server/next/docs/assets/img/guides/sso-integrations/salesforce-sso/add-salesforce-app.png differ diff --git a/en/identity-server/next/docs/assets/img/guides/sso-integrations/salesforce-sso/salesforce-sso.png b/en/identity-server/next/docs/assets/img/guides/sso-integrations/salesforce-sso/salesforce-sso.png new file mode 100644 index 0000000000..abdeae1fc9 Binary files /dev/null and b/en/identity-server/next/docs/assets/img/guides/sso-integrations/salesforce-sso/salesforce-sso.png differ diff --git a/en/identity-server/next/docs/references/actions/pre-issue-access-token-action/api/pre-issue-access-token-action-v1.yaml b/en/identity-server/next/docs/references/actions/pre-issue-access-token-action/api/pre-issue-access-token-action-v1.yaml index 93dfe2d287..c00ee47ba6 100644 --- a/en/identity-server/next/docs/references/actions/pre-issue-access-token-action/api/pre-issue-access-token-action-v1.yaml +++ b/en/identity-server/next/docs/references/actions/pre-issue-access-token-action/api/pre-issue-access-token-action-v1.yaml @@ -353,7 +353,13 @@ components: name: type: string value: - type: string + oneOf: + - type: string + - type: integer + - type: boolean + - type: array + items: + type: string Operations: type: object properties: diff --git a/en/includes/guides/authentication/index.md b/en/includes/guides/authentication/index.md index 99dc3c0945..cae18373e1 100644 --- a/en/includes/guides/authentication/index.md +++ b/en/includes/guides/authentication/index.md @@ -16,6 +16,8 @@ When you register an application, you can customize the login flow. - Enforce [conditional authentication]({{base_path}}/guides/authentication/conditional-auth/) to dynamically change the login flow of a user based on the user's devices, networks, locations, or usage contexts. +- Add [SSO integrations]({{base_path}}/guides/authentication/sso-integrations/) using {{ product_name }} to log in to applications such as [Google]({{base_path}}/guides/authentication/social-login/add-google-login/), [Salesforce]({{base_path}}/guides/authentication/social-login/add-apple-login/), and [Microsoft]({{base_path}}/guides/authentication/social-login/add-microsoft-login/). + ## Manage user attributes Manage the user attributes you want to share with your application: @@ -41,4 +43,7 @@ With identity federation, users can use an existing user account registered to a You can configure any number of external connections for your application via {{ product_name }}. -{% include "../fragments/manage-connection/add-groups.md" %} \ No newline at end of file +{% include "../fragments/manage-connection/add-groups.md" %} + + + diff --git a/en/includes/guides/authentication/oidc/token-validation-resource-server.md b/en/includes/guides/authentication/oidc/token-validation-resource-server.md index eac1a385b1..0deede7e23 100644 --- a/en/includes/guides/authentication/oidc/token-validation-resource-server.md +++ b/en/includes/guides/authentication/oidc/token-validation-resource-server.md @@ -1,64 +1,60 @@ # Token validation by resource servers -A resource server is responsible for protecting resources such as APIs via OAuth2 access tokens. Access tokens are intended for authorizing the access of a resource. -The resource server should be able to verify the access token sent by the application. If the application sends a [self-contained JWT access token]({{base_path}}/references/app-settings/oidc-settings-for-app/#access-token), then the resource server can validate the access token without interacting with the authorization server. -OAuth2.0 supports [token introspection](https://datatracker.ietf.org/doc/html/rfc7662){:target="_blank"} to inspect the **access tokens** and **refresh tokens** using authorization servers. +Access tokens provide limited authorization to resources within a resource server. The resource server is responsible for validating these tokens before granting access. Token validation differs based on the [type of the access tokens]({{base_path}}/references/app-settings/oidc-settings-for-app/#access-token) that the resource server receives. -{{ product_name }} provides the `/oauth2/introspect` endpoint to perform token validation. A resource server can inspect tokens using {{ product_name }} and know the information related to the tokens. On {{ product_name }}, the resource server has to use client secret basic authentication to authenticate with the token introspection endpoint. -You have to send it as the authorization header in the request: `Authorization: Basic BASE46_ENCODING` +## Validate JWT tokens -**Token introspection endpoint** +A Jason Web Token (JWT) is a self-contained token. This means that the resource server does not need to interact with the identity provider to validate tokens. The payload of a sample decoded JWT token is as shown below. -``` -{{ product_url_sample }}/oauth2/introspect +```json +{ + "sub": "Alica@bifrost.com", + "aut": "APPLICATION_USER", + "aud": "Wsoq8t4nHW80gSnPfyDvRbiC__Ea", + "nbf": 1623904805, + "azp": "Wsoq8t4nHW80gSnPfyDvRbiC__Ea", + "scope": "openid", + "iss": "{{product_url_sample}}/oauth2/token", + "exp": 1623908405, + "iat": 1623904805, + "jti": "9fac7747-bb2d-46be-bef2-a95b2f69f8b2" +} ``` -!!! tip - To perform base64 encoding for the client ID and client secret, you can use a tool, or you can run the below command. +## Validate opaque tokens - ` - echo -n '' | base64 - ` +Unlike JWT tokens, opaque tokens are non-transparent. This means that the authorization information is not readily available to resource servers and they should interact with the identity provider to validate and extract the relevant information. OAuth2.0 supports [token introspection](https://datatracker.ietf.org/doc/html/rfc7662){:target="_blank"} to inspect access tokens and refresh tokens. -**Request format** +{{ product_name }} provides the following endpoint to perform token validation. -```bash -curl --location --request POST '{introspection_endpoint_url}' \ ---header 'Content-Type: application/x-www-form-urlencoded' \ ---header 'Authorization: Basic V3NvcTh0NG5IVzgwZ1NuUGZ5RHZSYmlDX19FYTp6MEM3OXpsb3B4OGk3QnlPdzhLMTVBOWRwbFlh' \ ---data-urlencode 'token={access_token}' +``` +{{product_url_format}}/oauth2/introspect ``` +=== "Request format" -**Sample request** - -=== "cURL" - ```bash - curl --location --request POST '{{ product_url_sample }}/oauth2/introspect' \ - --header 'Content-Type: application/x-www-form-urlencoded' \ - --header 'Cookie: atbv=646b0ed2-c501-4b17-9251-94112013a718' \ - --header 'Authorization: Bearer 54bd024f-5080-3db5-9422-785f5d610605' \ - --data-urlencode 'token=94e325b7-77c8-32c2-a6ff-d7be430bf785' - ``` + ```bash + curl --location --request POST {{product_url_format}}/oauth2/introspect \ + --header 'Content-Type: application/x-www-form-urlencoded' \ + --header 'Authorization: Basic ' \ + --data-urlencode 'token={access_token}' + ``` -This introspection request takes the following parameters: +=== "Request sample" + + ```bash + curl --location --request POST '{{ product_url_sample }}/oauth2/introspect' \ + --header 'Content-Type: application/x-www-form-urlencoded' \ + --header 'Cookie: atbv=646b0ed2-c501-4b17-9251-94112013a718' \ + --header 'Authorization: Basic V3NvcTh0NG5IVzgwZ1NuUGZ5RHZSYmlDX19FYTp6MEM3OXpsb3B4OGk3QnlPdzhLMTVBOWRwbFlh' \ + --data-urlencode 'token=94e325b7-77c8-32c2-a6ff-d7be430bf785' + ``` -!!! note - See the [OAuth2.0 introspection request](https://datatracker.ietf.org/doc/html/rfc7662#section-2.1){:target="_blank"} for details. +### User access token response - - - - - - - - - -
Request ParameterDescription
tokenThe token(access token or refresh token) you want to inspect.
+User access tokens are tokens generated through user interactions, such as logging in by entering credentials. The access token represents the user and the user's permissions. -**Sample response** +The following response will be returned for the provided user access token: -The following response will be returned for the provided access token: ```json { "aut": "APPLICATION_USER", @@ -94,4 +90,31 @@ If the token you used is invalid, you will get the following response: {'active':false} ``` -
+!!! note + See the [OAuth2.0 introspection request](https://datatracker.ietf.org/doc/html/rfc7662#section-2.1){:target="_blank"} for details. + +### Application access token response + +Application access tokens are tokens obtained through grant types like the [client_credentials]({{base_path}}/references/grant-types/#client-credentials-grant) grant, without any user involvement. Unlike user-bound tokens, application access tokens represent the application itself rather than an individual user. + +The introspection response for Application access Ttkens follows the format shown below: + +```json +{ + "nbf": 1629961093, + "scope": "openid profile", + "active": true, + "token_type": "Bearer", + "exp": 1629968693, + "iat": 1629961093, + "client_id": "Wsoq8t4nHW80gSnPfyDvRbiC__Eb" +} +``` + +!!! warning "Deprecated behavior" + + Previously, the introspection response for application access tokens included the `username` attribute, which contained the application owner's username. This attribute will no longer be included in the introspection response. + + If your application's access tokens still return the response, it is likely that your application is out-of-date. If so, update your application through the {{product_name}} Console by navigating to the relevant application under the **Applications** section. + + Once updated, the `username` attribute will no longer be included in the introspection response. Therefore, before updating, ensure that your application does not rely on the `username` attribute and remove any such dependencies. diff --git a/en/includes/guides/authentication/sso-integrations/add-google-workspace-template.md b/en/includes/guides/authentication/sso-integrations/add-google-workspace-template.md new file mode 100644 index 0000000000..ff1649d6e6 --- /dev/null +++ b/en/includes/guides/authentication/sso-integrations/add-google-workspace-template.md @@ -0,0 +1,74 @@ +# Log in to Google Workspace using the {{ product_name }} + +This page guides you through using {{ product_name }} to log in to Google. + +!!! note + You need to have a Google domain. Further, ensure you have a Google Workspace account and your account supports SSO by referring to the [Google documentation](https://support.google.com/a/answer/182076?sjid=13406338490513240799-AP){:target="_blank"}. + +## Create the Google Workspace Service Provider + +Follow the steps given below to register the Google Workspace application in {{ product_name }}. + +1. On the {{ product_name }} Console, go to **Applications**. + +2. Click **New Application** and select **Google Workspace** from **SSO Integrations** section. + + ![Select app type in the WSO2 Identity Server]({{base_path}}/assets/img/guides/sso-integrations/google-workspace-sso/add-app.png){: width="600" style="border: 0.3px solid lightgrey;"} + +3. Provide the Google domain name and a name for the application. + + ![Select google workspace app in the WSO2 Identity Server]({{base_path}}/assets/img/guides/sso-integrations/google-workspace-sso/add-google-app.png){: width="600" style="border: 0.3px solid lightgrey;"} + +4. Click **Create** to complete the registration. + +5. Download the Certificate from the Guide section. + +----- + +## Configure Google + +1. Access your domain's [admin console](https://admin.google.com). + +2. Follow Google’s instructions to [configure the SSO profile for your organization](https://support.google.com/a/answer/12032922?hl=en&ref_topic=7579248&sjid=3736947215943977003-AP#org_profile). During this process, use the details below: + + - **Sign-in page URL:** + ` {{ product_url_format }}/samlsso` + + - **Sign-out page URL:** + `{{ product_url_format }}/samlsso` + + - **Password URL:** + `{{ product_url_format }}/t/carbon.super/myaccount/security` + +3. Upload the downloaded Identity Server certificate. + + ![sso-fill-google.png]({{base_path}}/assets/img/guides/sso-integrations/google-workspace-sso/sso-fill-google.png){: width="600" style="border: 0.3px solid lightgrey;"} +----- + +## Try it out + +Now, you have successfully configured Google and {{ product_name }}. + +!!! note + The admin users of your Google domain do not get redirected to WSO2 IS. + Therefore, to try out the tutorial you need to use a user who is not an + admin in your Google account. + +1. Create a user in {{ product_name }}. Make sure that the same user + exists in your Google domain. + In this example, `alex@wso2support.com` + is in the Google domain. Therefore, we need to create the same user in {{ product_name }}. + +2. Navigate to [http://accounts.google.com](http://accounts.google.com) + and enter the email address of the user you created. + You are navigated to {{ product_name }}'s sign in screen. +3. Enter the username and password of the user you created. + You are navigated to the G-Suite of that domain and you can select + the application you need to use. + +!!! note + If you want to only access Gmail, navigate to + [mail.google.com](http://mail.google.com), enter the username of the + user, enter the username and password of the user on the WSO2 Identity + Server sign in screen, and you are navigated to the user's mail account. + diff --git a/en/includes/guides/authentication/sso-integrations/add-microsoft-365-template.md b/en/includes/guides/authentication/sso-integrations/add-microsoft-365-template.md new file mode 100644 index 0000000000..7a0b3dbe9b --- /dev/null +++ b/en/includes/guides/authentication/sso-integrations/add-microsoft-365-template.md @@ -0,0 +1,155 @@ +# Configuring Microsoft 365 SAML2 with {{ product_name }} + + +This page guides you through using {{ product_name }} to log in to Google. + +!!! note + - You need an Office 365 Business account with admin access and a domain added as per the [Microsoft documentation](https://learn.microsoft.com/en-gb/microsoft-365/admin/setup/add-domain?view=o365-worldwide&redirectSourcePath=%252fen-us%252farticle%252fadd-a-domain-to-office-365-6383f56d-3d09-4dcb-9b41-b5f5a5efd611). + - Additionally, ensure a Windows instance with PowerShell is installed. + + +## Create the Microsoft 365 Service Provider + +Follow the steps given below to register the Microsoft 365 application in {{ product_name }}. + +1. On the {{ product_name }} Console, go to **Applications**. + +2. Click **New Application** and select **Microsoft 365** from **SSO Integrations** section. + + ![Select app type in the WSO2 Identity Server]({{base_path}}/assets/img/guides/sso-integrations/google-workspace-sso/add-app.png){: width="600" style="border: 0.3px solid lightgrey;"} + +3. Provide a name for the application. + + ![Select google workspace app in the WSO2 Identity Server]({{base_path}}/assets/img/guides/sso-integrations/microsoft-365-sso/add-microsoft-365-app.png){: width="600" style="border: 0.3px solid lightgrey;"} + +4. Click **Create** to complete the registration. + +----- + +## Install the required modules and connect to Microsoft + +A Windows platform Windows Azure Active Directory Powershell +installed. If you do not already have the Azure AD module, run the +following commands to install the required modules. + +``` java +#uninstall any existing older version of the AzureAD module +uninstall-module AzureAD + + +install-module AzureAD +install-module AzureADPreview +install-module MSOnline +``` + +### Configure Azure AD to trust WSO2 IS + +1. Log in to a Windows machine and start Windows Azure Active Directory + Powershell. +2. Run the following command. It prompts for the Azure AD admin + credentials. + + ``` java + $cred=Get-Credential + ``` + +3. Enter the credentials and click OK. Run the following command to + connect to the service with the stored credentials. + + ``` java + Connect-MsolService –Credential $cred + ``` + +4. Run the following command to verify the availability of the + validated domain. + The ‘Status’ of the domain should be ‘Verified’, and + ‘Authentication’ should be ‘Managed’. + + ``` java + Get-MsolDomain + ``` + +5. Configure the domain as a federated domain by providing the + respective federation settings that match the WSO2 IS IdP. Store the + federation settings in parameters. + +6. Store your domain. + + ``` java + $dom = "wso2.cf" + ``` + +7. Set the IdP Logon URL for the POST SAML Authentication Request. + For this tutorial, you can use the SAML SSO endpoint URL of WSO2 + IS. + + ``` java + $logonurl = "https://localhost:9443/samlsso" + ``` + +8. Set the issuer ID of the IdP. This value should be the + `Identity Provider Entity Id` that you + configured in the SAML configuration of the Resident IdP of WSO2 + IS. + + ``` java + $issueruri = "localhost" + ``` + +9. Set the IdP Logout URL for the POST SAML Logout Request. For + this tutorial, you can use the SAML SSO endpoint URL of WSO2 IS. + + ``` java + $logouturl = "https://localhost:9443/samlsso" + ``` + +10. Store the IdP certificate. You can get the certificate value from the Guide section in application. + + ``` java + $cert = "{certificate}" + ``` + + The certificate for the default key store configured in WSO2 IS + is given below. + + **Sample certificate** + + ``` java + $cert = "MIIDSTCCAjGgAwIBAgIEAoLQ/TANBgkqhkiG9w0BAQsFADBVMQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExFjAUBgNVBAcTDU1vdW50YWluIFZpZXcxDTALBgNVBAoTBFdTTzIxEjAQBgNVBAMTCWxvY2FsaG9zdDAeFw0xNzA3MTkwNjUyNTFaFw0yNzA3MTcwNjUyNTFaMFUxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJDQTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzENMAsGA1UEChMEV1NPMjESMBAGA1UEAxMJbG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAluZFdW1ynitztkWLC6xKegbRWxky+5P0p4ShYEOkHs30QI2VCuR6Qo4Bz5rTgLBrky03W1GAVrZxuvKRGj9V9+PmjdGtau4CTXu9pLLcqnruaczoSdvBYA3lS9a7zgFU0+s6kMl2EhB+rk7gXluEep7lIOenzfl2f6IoTKa2fVgVd3YKiSGsyL4tztS70vmmX121qm0sTJdKWP4HxXyqK9neolXI9fYyHOYILVNZ69z/73OOVhkh/mvTmWZLM7GM6sApmyLX6OXUp8z0pkY+vT/9+zRxxQs7GurC4/C1nK3rI/0ySUgGEafO1atNjYmlFN+M3tZX6nEcA6g94IavyQIDAQABoyEwHzAdBgNVHQ4EFgQUtS8kIYxQ8UVvVrZSdgyide9OHxUwDQYJKoZIhvcNAQELBQADggEBABfk5mqsVUrpFCYTZZhOxTRRpGXqoW1G05bOxHxs42Paxw8rAJ06Pty9jqM1CgRPpqvZa2lPQBQqZrHkdDE06q4NG0DqMH8NT+tNkXBe9YTre3EJCSfsvswtLVDZ7GDvTHKojJjQvdVCzRj6XH5Truwefb4BJz9APtnlyJIvjHk1hdozqyOniVZd0QOxLAbcdt946chNdQvCm6aUOputp8Xogr0KBnEy3U8es2cAfNZaEkPU8Va5bU6Xjny8zGQnXCXxPKp7sMpgO93nPBt/liX1qfyXM7xEotWoxmm6HZx8oWQ8U5aiXjZ5RKDWCCq4ZuXl6wVsUz1iE61suO5yWi8=" + ``` + +11. Run the following command to establish trust. You can copy the command in Guide section. + + ``` java + Set-MsolDomainAuthentication –DomainName $dom -Authentication Federated -PassiveLogOnUri $logonurl -SigningCertificate $cert -IssuerUri $issueruri -LogOffUri $logouturl -PreferredAuthenticationProtocol SAMLP + ``` + +12. Run the following command to verify the federation settings. + + ``` java + Get-MsolDomainFederationSettings -Domain $dom + ``` + +You have now successfully set up trust between the on-premise identity +provider of WSO2 IS and the Azure Active Directory. + + +If you wish to redo the configurations, do the following: + +1. Run the following command to first move your domain back to the + 'Managed' authentication mode. + +``` bash +Set-MsolDomainAuthentication -DomainName $dom -Authentication Managed +``` + +2. Re-set the parameters as listed in step 5 and then set the authentication method again as shown in step 6. + +## Try it out + +1. Create a user on the {{ product_name }}. +2. Add that same user to Microsoft using the following command. Here, the ImmutableID should be the UUID of the user. + +``` bash +New-MsolUser -UserPrincipalName yourdomain.com -ImmutableID userID -LastName lastNameOfUser -FirstName firstNameOfUser -DisplayName WSO2 Test User +``` diff --git a/en/includes/guides/authentication/sso-integrations/add-salesforce-template.md b/en/includes/guides/authentication/sso-integrations/add-salesforce-template.md new file mode 100644 index 0000000000..a1065b80e1 --- /dev/null +++ b/en/includes/guides/authentication/sso-integrations/add-salesforce-template.md @@ -0,0 +1,76 @@ +# Log in to Salesforce using the {{ product_name }} + +This page guides you through using {{ product_name }} to log in to Salesforce. + +!!! note + Ensure your Salesforce edition supports SSO. Check the [Salesforce documentation](https://help.salesforce.com/s/articleView?language=en_US&id=sf.sso_saml_setting_up.htm&type=5){:target="_blank"}. + +## Create the Salesforce Service Provider + +Follow the steps given below to register the Salesforce application in {{ product_name }}. + +1. On the {{ product_name }} Console, go to **Applications**. + +2. Click **New Application** and select **Salesforce** from **SSO Integrations** section. + + ![Select app type in the WSO2 Identity Server]({{base_path}}/assets/img/guides/sso-integrations/google-workspace-sso/add-app.png){: width="600" style="border: 0.3px solid lightgrey;"} + +3. Provide a name for the application. + + ![Select salesforce app in the WSO2 Identity Server]({{base_path}}/assets/img/guides/sso-integrations/salesforce-sso/add-salesforce-app.png){: width="600" style="border: 0.3px solid lightgrey;"} + +4. Click **Create** to complete the registration. + +5. Download the **SAML Metadata file** and copy the **Entity ID** from the Guide section. + +## Configure Salesforce + +1. Log in to [Salesforce](https://login.salesforce.com/). + +!!! note + If using a custom domain, access your organization via the Use Custom Domain option on the [Salesforce](https://login.salesforce.com/) login page. + +2. Navigate to Setup > Settings > Identity > Single Sign-On Settings page. + +3. On the Single sign-on settings page, check the **SAML Enabled** box under **Federated Single Sign-On Using SAML** to enable the use of SAML SSO. +4. Click on the New From Metadata file button and upload the downloaded SAML metadata file of the {{ product_name }}. + + ![salesforce-sso]({{base_path}}/assets/img/guides/sso-integrations/salesforce-sso/salesforce-sso.png){: width="600" style="border: 0.3px solid lightgrey;"} + +5. In the SAML settings form replace **Entity ID** you copied earlier. +6. Choose the same certificate for **Assertion Decryption Certificate** and **Request Signing Certificate**. Add your Salesforce organization’s URL in Custom Logout URL, and click the Save. + + ![add-entity-id]({{base_path}}/assets/img/guides/sso-integrations/salesforce-sso/add-entity-id.png){: width="600" style="border: 0.3px solid lightgrey;"} + +7. Scroll to the Endpoints section and copy the Login (Assertion consumer service URL) and Logout URLs. +8. Download the Request Signing Certificate. + + +### SAML Configurations in Service Provider + +Make the following changes to the created service provider. + +1. Go to protocol section. + +2. Paste the Login (Assertion consumer service URL) and Logout URL into their respective fields, and upload the downloaded certificate. + +## Try it out + +Do the following steps to test out the configurations for a new user in +Salesforce and the {{ product_name }}. + +1. Add login options to your Salesforce login page following Salesforce [guide](https://help.salesforce.com/s/articleView?id=sf.sso_sp_test_connection.htm&type=5). +2. Create a user in Salesforce. +3. Create a user with the same email address as their Salesforce username in {{ product_name }}. +4. Access your Salesforce login URL on an incognito or private browser. +5. Log in using the newly added login option which is available in login page using the new credentials of the user you just created. Then user will redirected back to Salesforce. + +---- + + +## Troubleshooting guidelines + +Additional troubleshooting information regarding any Salesforce side SSO +failures can be retrieved by using Salesforce SAML Assertion Validator. +Further information regarding the steps are available +[here](https://developer.salesforce.com/docs/atlas.en-us.sso.meta/sso/sso_saml_validation_errors.htm#!). diff --git a/en/includes/guides/authentication/sso-integrations/index.md b/en/includes/guides/authentication/sso-integrations/index.md new file mode 100644 index 0000000000..345bf24d16 --- /dev/null +++ b/en/includes/guides/authentication/sso-integrations/index.md @@ -0,0 +1,19 @@ +
+

Add Single Sign On

+

Add Single Sign On (SSO) with {{ product_name }}

+ + +
diff --git a/en/includes/guides/authentication/user-attributes/enable-attributes-for-oidc-app.md b/en/includes/guides/authentication/user-attributes/enable-attributes-for-oidc-app.md index a5e6f1e64f..7e3e836071 100644 --- a/en/includes/guides/authentication/user-attributes/enable-attributes-for-oidc-app.md +++ b/en/includes/guides/authentication/user-attributes/enable-attributes-for-oidc-app.md @@ -35,9 +35,7 @@ To add user attributes to the app: ### Select an alternate subject attribute -The subject attribute is used for exchanging information about the user. The subject is represented by the **subject** attribute in the ID token. - -By default, Asgardeo shares **User ID** as the subject. You can define any user attribute as the subject. +The subject attribute is used for exchanging information about the user. The subject is represented by the **subject** attribute in the ID token. By default, Asgardeo shares **User ID** as the subject. You can define any user attribute as the subject. To define a different attribute as the subject: @@ -52,6 +50,14 @@ To define a different attribute as the subject: 3. Click **Update**. +!!! warning "Deprecated `sub` attribute behavior in application access tokens" + + Application access tokens are tokens generated to represent the application rather than an individual user. Such tokens are generated during grant types such as [client_credential]({{base_path}}/references/grant-types/#client-credentials-grant). + + Previously, the `sub` attribute of application access tokens contained the `userid` of the application owner. With the latest updates, the `sub` value will contain the `client_id` of the application. If your application's access tokens still return the `userid` in the `sub` attribute, it is likely that your application is out-of-date. If so, update your application through the {{product_name}} Console by navigating to the relevant application under the **Applications** section. + + Once updated, the `sub` attribute will return the `client_id`. Therefore, before updating, ensure that your application does not rely on the `sub` attribute and remove any such dependencies. + ### Define mandatory user attributes {% include "../../fragments/manage-app/manage-user-attributes/select-mandatory-attributes.md" %} diff --git a/en/package-lock.json b/en/package-lock.json new file mode 100644 index 0000000000..e309d4ccda --- /dev/null +++ b/en/package-lock.json @@ -0,0 +1,2245 @@ +{ + "name": "docs-is", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "docs-is", + "version": "1.0.0", + "license": "Apache-2.0", + "devDependencies": { + "axios": "^1.7.7", + "markdown-link-check": "^3.12.2", + "ora": "^8.1.0", + "puppeteer": "^23.4.1" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.24.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@puppeteer/browsers": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.4.0.tgz", + "integrity": "sha512-x8J1csfIygOwf6D6qUAZ0ASk3z63zPb7wkNeHRerCMh82qWKUrOgkuP005AJC8lDL6/evtXETGEJVcwykKT4/g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "debug": "^4.3.6", + "extract-zip": "^2.0.1", + "progress": "^2.0.3", + "proxy-agent": "^6.4.0", + "semver": "^7.6.3", + "tar-fs": "^3.0.6", + "unbzip2-stream": "^1.4.3", + "yargs": "^17.7.2" + }, + "bin": { + "browsers": "lib/cjs/main-cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.7.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.4.tgz", + "integrity": "sha512-y+NPi1rFzDs1NdQHHToqeiX2TIS79SWEAw9GYhkkx8bD0ChpfqC+n2j5OXOCpzfojBEBt6DnEnnG9MY0zk1XLg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "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==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true, + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", + "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/b4a": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", + "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/bare-events": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.0.tgz", + "integrity": "sha512-/E8dDe9dsbLyh2qrZ64PEPadOQ0F4gbl1sUJOrmph7xOiIxfY8vwab/4bFLh4Y88/Hk/ujKcrQKc+ps0mv873A==", + "dev": true, + "license": "Apache-2.0", + "optional": true + }, + "node_modules/bare-fs": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.5.tgz", + "integrity": "sha512-SlE9eTxifPDJrT6YgemQ1WGFleevzwY+XAP1Xqgl56HtcrisC2CHCZ2tq6dBpcH2TnNxwUEUGhweo+lrQtYuiw==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-events": "^2.0.0", + "bare-path": "^2.0.0", + "bare-stream": "^2.0.0" + } + }, + "node_modules/bare-os": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.4.4.tgz", + "integrity": "sha512-z3UiI2yi1mK0sXeRdc4O1Kk8aOa/e+FNWZcTiPB/dfTWyLypuE99LibgRaQki914Jq//yAWylcAt+mknKdixRQ==", + "dev": true, + "license": "Apache-2.0", + "optional": true + }, + "node_modules/bare-path": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.3.tgz", + "integrity": "sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-os": "^2.1.0" + } + }, + "node_modules/bare-stream": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.3.0.tgz", + "integrity": "sha512-pVRWciewGUeCyKEuRxwv06M079r+fRjAQjBEK2P6OYGrO43O+Z0LrPZZEjlc4mB6C2RpZ9AxJ1s7NLEtOHO6eA==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "b4a": "^1.6.6", + "streamx": "^2.20.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/basic-ftp": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", + "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "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==", + "dev": true, + "license": "ISC" + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/cheerio": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0.tgz", + "integrity": "sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.1.0", + "encoding-sniffer": "^0.2.0", + "htmlparser2": "^9.1.0", + "parse5": "^7.1.2", + "parse5-htmlparser2-tree-adapter": "^7.0.0", + "parse5-parser-stream": "^7.1.2", + "undici": "^6.19.5", + "whatwg-mimetype": "^4.0.0" + }, + "engines": { + "node": ">=18.17" + }, + "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==", + "dev": true, + "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/chromium-bidi": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.6.5.tgz", + "integrity": "sha512-RuLrmzYrxSb0s9SgpB+QN5jJucPduZQ/9SIe76MDxYJuecPW5mxMdacJ1f4EtgiV+R0p3sCkznTMvH0MPGFqjA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "mitt": "3.0.1", + "urlpattern-polyfill": "10.0.0", + "zod": "3.23.8" + }, + "peerDependencies": { + "devtools-protocol": "*" + } + }, + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dev": true, + "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-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/data-uri-to-buffer": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", + "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/degenerator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/devtools-protocol": { + "version": "0.0.1342118", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1342118.tgz", + "integrity": "sha512-75fMas7PkYNDTmDyb6PRJCH7ILmHLp+BhrZGeMsa4bCh40DTxgCz2NRy5UDzII4C5KuD0oBMZ9vXKhEl6UD/3w==", + "dev": true, + "license": "BSD-3-Clause" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dev": true, + "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/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/encoding-sniffer": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.0.tgz", + "integrity": "sha512-ju7Wq1kg04I3HtiYIOrUrdfdDvkyO9s5XM8QAj/bN61Yo/Vb4vgJxy5vi4Yxk01gWHbrofpPtpxM8bKger9jhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "^0.6.3", + "whatwg-encoding": "^3.1.1" + }, + "funding": { + "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "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==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.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==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", + "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-uri": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.3.tgz", + "integrity": "sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==", + "dev": true, + "license": "MIT", + "dependencies": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.2", + "debug": "^4.3.4", + "fs-extra": "^11.2.0" + }, + "engines": { + "node": ">= 14" + } + }, + "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==", + "dev": true, + "license": "ISC" + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/html-link-extractor": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/html-link-extractor/-/html-link-extractor-1.0.5.tgz", + "integrity": "sha512-ADd49pudM157uWHwHQPUSX4ssMsvR/yHIswOR5CUfBdK9g9ZYGMhVSE6KZVHJ6kCkR0gH4htsfzU6zECDNVwyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cheerio": "^1.0.0-rc.10" + } + }, + "node_modules/htmlparser2": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.1.0.tgz", + "integrity": "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==", + "dev": true, + "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.1.0", + "entities": "^4.5.0" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "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/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/is-absolute-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-4.0.1.tgz", + "integrity": "sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-relative-url": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-relative-url/-/is-relative-url-4.0.0.tgz", + "integrity": "sha512-PkzoL1qKAYXNFct5IKdKRH/iBQou/oCC85QhXj6WKtUQBliZ4Yfd3Zk27RHu9KQG8r6zgvAA2AQKC9p+rqTszg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-absolute-url": "^4.0.1" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isemail": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/isemail/-/isemail-3.2.0.tgz", + "integrity": "sha512-zKqkK+O+dGqevc93KNsbZ/TqTUFd46MwWjYOoMrjIMZ51eU7DtQG3Wmd9SQQT7i7RVnuTPEiYEWHU3MSbxC1Tg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "punycode": "2.x.x" + }, + "engines": { + "node": ">=4.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==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "dev": true, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/link-check": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/link-check/-/link-check-5.3.0.tgz", + "integrity": "sha512-Jhb7xueDgQgBaZzkfOtAyOZEZAIMJQIjUpYD2QY/zEB+LKTY1tWiBwZg8QIDbzQdPBOcqzg7oLQDNcES/tQmXg==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-relative-url": "^4.0.0", + "isemail": "^3.2.0", + "ms": "^2.1.3", + "needle": "^3.3.1", + "proxy-agent": "^6.4.0" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true, + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", + "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "is-unicode-supported": "^1.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/markdown-link-check": { + "version": "3.12.2", + "resolved": "https://registry.npmjs.org/markdown-link-check/-/markdown-link-check-3.12.2.tgz", + "integrity": "sha512-GWMwSvxuZn+uGGydi5yywnnDZy08SGps4I/63xqvWT7lxtH4cVLnhgZZYtEcPz/QvgPg9vbH2rvWpa29owMtHA==", + "dev": true, + "license": "ISC", + "dependencies": { + "async": "^3.2.5", + "chalk": "^5.3.0", + "commander": "^12.1.0", + "link-check": "^5.3.0", + "lodash": "^4.17.21", + "markdown-link-extractor": "^4.0.2", + "needle": "^3.3.1", + "progress": "^2.0.3", + "proxy-agent": "^6.4.0" + }, + "bin": { + "markdown-link-check": "markdown-link-check" + } + }, + "node_modules/markdown-link-extractor": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/markdown-link-extractor/-/markdown-link-extractor-4.0.2.tgz", + "integrity": "sha512-5cUOu4Vwx1wenJgxaudsJ8xwLUMN7747yDJX3V/L7+gi3e4MsCm7w5nbrDQQy8nEfnl4r5NV3pDXMAjhGXYXAw==", + "dev": true, + "license": "ISC", + "dependencies": { + "html-link-extractor": "^1.0.5", + "marked": "^12.0.1" + } + }, + "node_modules/marked": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/marked/-/marked-12.0.2.tgz", + "integrity": "sha512-qXUm7e/YKFoqFPYPa3Ukg9xlI5cyAtGmyEIzMfW//m6kXwCy2Ps9DYf5ioijFKQ8qyuscrHoY04iJGctu2Kg0Q==", + "dev": true, + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 18" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/needle": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz", + "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "^0.6.3", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "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==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-8.1.0.tgz", + "integrity": "sha512-GQEkNkH/GHOhPFXcqZs3IDahXEQcQxsSjEkK4KvEEST4t7eNzoMjxTzef+EZ+JluDEV+Raoi3WQ2CflnRdSVnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "cli-cursor": "^5.0.0", + "cli-spinners": "^2.9.2", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.0.0", + "log-symbols": "^6.0.0", + "stdin-discarder": "^0.2.2", + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ora/node_modules/emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "dev": true, + "license": "MIT" + }, + "node_modules/ora/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/pac-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.2.tgz", + "integrity": "sha512-BFi3vZnO9X5Qt6NRz7ZOaPja3ic0PhlsmCRYLOpN11+mWBCR6XJDqW5RF3j8jm4WGGQZtBA+bTfxYzeKW73eHg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.5", + "pac-resolver": "^7.0.1", + "socks-proxy-agent": "^8.0.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-resolver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", + "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "dev": true, + "license": "MIT", + "dependencies": { + "degenerator": "^5.0.0", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "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==", + "dev": true, + "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/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", + "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "domhandler": "^5.0.2", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-parser-stream": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", + "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", + "dev": true, + "license": "MIT", + "dependencies": { + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", + "dev": true, + "license": "ISC" + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/proxy-agent": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.4.0.tgz", + "integrity": "sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.1", + "https-proxy-agent": "^7.0.3", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.0.1", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true, + "license": "MIT" + }, + "node_modules/pump": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", + "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/puppeteer": { + "version": "23.4.1", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-23.4.1.tgz", + "integrity": "sha512-+wWfWTkQ8L9IB/3OVGSUp37c0eQ5za/85KdX+LAq2wTZkMdocgYGMCs+/91e2f/RXIYzve4x/uGxN8zG2sj8+w==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@puppeteer/browsers": "2.4.0", + "chromium-bidi": "0.6.5", + "cosmiconfig": "^9.0.0", + "devtools-protocol": "0.0.1342118", + "puppeteer-core": "23.4.1", + "typed-query-selector": "^2.12.0" + }, + "bin": { + "puppeteer": "lib/cjs/puppeteer/node/cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/puppeteer-core": { + "version": "23.4.1", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-23.4.1.tgz", + "integrity": "sha512-uCxGtn8VE9PlKhdFJX/zZySi9K3Ufr3qUZe28jxJoZUqiMJOi+SFh2zhiFDSjWqZIDkc0FtnaCC+rewW3MYXmg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@puppeteer/browsers": "2.4.0", + "chromium-bidi": "0.6.5", + "debug": "^4.3.7", + "devtools-protocol": "0.0.1342118", + "typed-query-selector": "^2.12.0", + "ws": "^8.18.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/queue-tick": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", + "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", + "dev": true, + "license": "MIT" + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/sax": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", + "dev": true, + "license": "ISC" + }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", + "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.4.tgz", + "integrity": "sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.1", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/stdin-discarder": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", + "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/streamx": { + "version": "2.20.1", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.20.1.tgz", + "integrity": "sha512-uTa0mU6WUC65iUvzKH4X9hEdvSW7rbPxPtwfWiLMSj3qTdQbAiUboZTxauKfpFuGIGa1C2BYijZ7wgdUXICJhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-fifo": "^1.3.2", + "queue-tick": "^1.0.1", + "text-decoder": "^1.1.0" + }, + "optionalDependencies": { + "bare-events": "^2.2.0" + } + }, + "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==", + "dev": true, + "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/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tar-fs": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.6.tgz", + "integrity": "sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + }, + "optionalDependencies": { + "bare-fs": "^2.1.1", + "bare-path": "^2.1.0" + } + }, + "node_modules/tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/text-decoder": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.0.tgz", + "integrity": "sha512-n1yg1mOj9DNpk3NeZOx7T6jchTbyJS3i3cucbNN6FcdPriMZx7NsgrGpWWdWZZGxD7ES1XB+3uoqHMgOKaN+fg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.4" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tslib": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", + "dev": true, + "license": "0BSD" + }, + "node_modules/typed-query-selector": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.0.tgz", + "integrity": "sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==", + "dev": true, + "license": "MIT" + }, + "node_modules/unbzip2-stream": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, + "node_modules/undici": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.19.8.tgz", + "integrity": "sha512-U8uCCl2x9TK3WANvmBavymRzxbfFYG+tAu+fgx3zxQy3qdagQqBLwJVrdyO1TBfUXvfKveMKJZhpvUYoOjM+4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.17" + } + }, + "node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/urlpattern-polyfill": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", + "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==", + "dev": true, + "license": "MIT" + }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "dev": true, + "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/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/zod": { + "version": "3.23.8", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", + "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/en/package.json b/en/package.json new file mode 100644 index 0000000000..c705877833 --- /dev/null +++ b/en/package.json @@ -0,0 +1,36 @@ +{ + "name": "docs-is", + "version": "1.0.0", + "description": "Developer Documentation for Asgardeo and WSO2 Identity Server", + "main": "index.js", + "directories": { + "doc": "docs" + }, + "devDependencies": { + "axios": "^1.7.7", + "markdown-link-check": "^3.12.2", + "ora": "^8.1.0", + "puppeteer": "^23.4.1" + }, + "scripts": { + "check-links": "node check-broken-links.js", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/wso2/docs-is.git" + }, + "keywords": [ + "wso2", + "docs-is", + "asgardeo", + "identity-server", + "documentation" + ], + "author": "WSO2", + "license": "Apache-2.0", + "bugs": { + "url": "https://github.com/wso2/docs-is/issues" + }, + "homepage": "https://github.com/wso2/docs-is#readme" +} diff --git a/en/theme/material/assets/css/home.css b/en/theme/material/assets/css/home.css index a673353199..9dcf760d15 100644 --- a/en/theme/material/assets/css/home.css +++ b/en/theme/material/assets/css/home.css @@ -267,6 +267,11 @@ [data-md-toggle=search]:checked~.md-header .md-header__version-select-dropdown { opacity: 1 !important; } + + [dir=ltr] .md-sidebar--secondary:not([hidden])~.md-content > .md-content__inner, + [dir=rtl] .md-sidebar--primary:not([hidden])~.md-content > .md-content__inner { + max-width: 1200px !important; + } } @media screen and (max-width: 76.1875em) { diff --git a/en/theme/material/assets/css/integrations.css b/en/theme/material/assets/css/integrations.css index f1fb205cbd..66d503063d 100644 --- a/en/theme/material/assets/css/integrations.css +++ b/en/theme/material/assets/css/integrations.css @@ -1,5 +1,5 @@ /** - * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). + * Copyright (c) 2023-2024, WSO2 LLC. (https://www.wso2.com). * * WSO2 LLC. licenses this file to you under the Apache License, * Version 2.0 (the "License"); you may not use this file except @@ -177,6 +177,11 @@ } @media screen and (min-width: 76.25em) { + [dir=ltr] .md-sidebar--secondary:not([hidden])~.md-content > .md-content__inner, + [dir=rtl] .md-sidebar--primary:not([hidden])~.md-content > .md-content__inner { + max-width: 1200px !important; + } + .md-sidebar { display: none; } diff --git a/en/theme/material/assets/css/partials/_button.css b/en/theme/material/assets/css/partials/_button.css index a3ba9926d6..a0f7d8d365 100644 --- a/en/theme/material/assets/css/partials/_button.css +++ b/en/theme/material/assets/css/partials/_button.css @@ -35,10 +35,16 @@ } .md-button.md-button--primary { - background-color: var(--md-primary-fg-color); + background: linear-gradient(77.74deg, var(--md-primary-fg-shade-color) 11.16%, var(--md-primary-fg-color) 99.55%) !important; color: var(--colors-white); } +.md-button.md-button--primary.md-button--asgardeo { + border-radius: 38px; + padding-left: 20px; + padding-right: 20px; +} + .md-button.md-button--link { background-color: transparent; border-color: transparent; diff --git a/en/theme/material/assets/css/quick-start.css b/en/theme/material/assets/css/quick-start.css new file mode 100644 index 0000000000..6c6f1c07cf --- /dev/null +++ b/en/theme/material/assets/css/quick-start.css @@ -0,0 +1,172 @@ +/** + * Copyright (c) 2024, WSO2 LLC. (https://www.wso2.com). + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.flex-container { + display: flex; + justify-content: start; + gap: 80px; +} + +.flex-column { + flex: 1; + padding: 20px; +} + +.summary-box { + margin: 40px 0 70px; +} + +ul.tick-list { + list-style: none; + margin-left: 0 !important; +} + +ul.tick-list > li { + margin-left: 0 !important; + padding-left: 20px; + position: relative; +} + +ul.tick-list > li:before { + width: 12px; + height: 12px; + background-image: url('data:image/svg+xml,'); + background-size: contain; + background-repeat: no-repeat; + display: inline-block; + content: " "; + position: absolute; + top: .35rem; + left: 0; +} + +/* Encoded color code is used for path due to not working */ +[data-md-color-scheme="slate"] ul.tick-list > li:before { + background-image: url('data:image/svg+xml,'); +} + +.github-icon:before { + width: 12px; + height: 12px; + background-image: url('data:image/svg+xml,'); + background-size: contain; + background-repeat: no-repeat; + display: inline-block; + content: " "; + margin-right: 8px; +} + +/* Encoded color code is used for path due to not working */ +[data-md-color-scheme="slate"] .github-icon:before { + background-image: url('data:image/svg+xml,'); +} + +.step { + margin-left: 15px; + padding: 0 0 1rem 40px; + border-left: 1px solid var(--md-default-fg-color); +} + +.step > h2 { + margin-top: 0 !important; +} + +.step:last-child { + border-left: none; +} + +.steps-section { + margin: 2rem 0 3rem; +} + +.step-number { + position: absolute; + left: -56px; + background: var(--md-default-fg-color); + color: var(--md-default-bg-color); + font-size: 16px; + border-radius: 50%; + height: 30px; + width: 30px; + line-height: 30px; + text-align: center; +} + +.step > h2 { + position: relative; + line-height: 1.1; +} + +.md-nav__list { + margin-top: .7rem; +} + +[data-md-component='toc'] .md-nav__link { + position: relative; + overflow: visible; + padding: 0 .6rem .5rem .8rem; + margin: 0; +} + +[data-md-component='toc'] .md-nav__link::before { + content: ''; + position: absolute; + top: .5rem; + left: 0; + width: 0; + height: calc(100% - 5px); + border-left: 1px solid var(--md-default-fg-color); +} + +[data-md-component='toc'] .md-nav__item:last-child > .md-nav__link::before { + border-left: none !important; +} + +[data-md-component='toc'] .md-nav__link .toc-step-number { + display: block; + top: 4px; + left: -7px; + position: absolute; + height: 14px; + width: 14px; + font-size: .46rem; + border-radius: 50%; + background: var(--md-default-fg-color); + color: var(--md-default-bg-color); + text-align: center; +} + +[data-md-component='toc'] .md-nav__link.md-nav__link--active .toc-step-number { + color: var(--colors-white); + background: var(--md-typeset-a-color); +} + +[data-md-component='toc'] .md-nav__link.md-nav__link--passed:not(.md-nav__link--active) .toc-step-number { + background: var(--md-default-fg-color--light); +} + +[data-md-component='toc'] .md-nav__link.md-nav__link--passed::before { + border-left-color: var(--md-default-fg-color--light); +} + +/* Responsive styles */ +@media (max-width: 768px) { + .flex-container { + display: block; + } +} diff --git a/en/theme/material/assets/css/redoc.css b/en/theme/material/assets/css/redoc.css index 0988d4c40d..5cc20e2e5f 100644 --- a/en/theme/material/assets/css/redoc.css +++ b/en/theme/material/assets/css/redoc.css @@ -142,10 +142,19 @@ color: var(--md-default-fg-color--light) !important; } -[data-md-color-scheme=slate] .api-content code { - background-color: #11171a !important; +.api-content code { + color: var(--md-code-bg-color) !important; + background-color: var(--md-code-fg-color) !important; + border-radius: .25rem !important; + padding: .1rem .3rem !important; + border: none !important; } +[data-md-color-scheme=slate] .api-content code { + color: var(--md-code-fg-color) !important; + background-color: var(--md-code-bg-color) !important; +} + /* Media query breakpoints $base_px: 16px; diff --git a/en/theme/material/assets/css/theme.css b/en/theme/material/assets/css/theme.css index eeb5e6189f..be915a7749 100644 --- a/en/theme/material/assets/css/theme.css +++ b/en/theme/material/assets/css/theme.css @@ -30,6 +30,7 @@ /* START OF - Default Material Theme Overrides */ --md-text-font: "Gilmer", sans-serif; --md-primary-fg-color: #ff7300; + --md-primary-fg-shade-color: #eb4f63; --md-accent-fg-color: #e46700; --md-redoc-example-bg-color: #2b3339; /* END OF - Default Material Theme Overrides */ @@ -63,6 +64,30 @@ --md-box-shadow-2: 0 12px 32px rgba(0, 0, 0, .1), 0 2px 6px rgba(0, 0, 0, .08); } +:root, +[data-md-color-scheme=default], +[data-md-color-scheme=slate] { + --md-code-fg-color: #d9d9de; + --md-code-bg-color: #161618; + --md-code-hl-color: #29353f; + --md-code-hl-number-color: #d52a2a; + --md-code-hl-special-color: #db1457; + --md-code-hl-function-color: #ec9752; + --md-code-hl-constant-color: #00AFFE; + --md-code-hl-keyword-color: #4489FF; + --md-code-hl-string-color: #a0fbaa; + --md-code-hl-name-color: #d9d9de; + --md-code-hl-operator-color: #d9d9de; + --md-code-hl-punctuation-color: #d9d9de; + --md-code-hl-comment-color: #47bfffb5; + --md-code-hl-generic-color: #47bfffb5; + --md-code-hl-variable-color: #47bfffb5; + + --md-code-tab-bg-color: #393c43; + --md-code-linenos-bg-color: #161618; + --md-code-block-radius: .4rem; +} + :root, [data-md-color-scheme=slate] { /* START OF - Default Material Theme Overrides */ --md-default-bg-color: #232327; @@ -89,6 +114,61 @@ .icon-color-4 { background-color: var(--icon-color-4-bg); } .icon-color-4 svg path { fill: var(--icon-color-4-fg) !important; } +.md-typeset .tabbed-labels, +.highlight span.filename { + border-top-left-radius: var(--md-code-block-radius); + border-top-right-radius: var(--md-code-block-radius); + background-color: var(--md-code-tab-bg-color); +} + +.highlighttable .linenos { + box-shadow: -.01rem 0 #5c5c5c inset; + background-color: var(--md-code-linenos-bg-color); + border-bottom-left-radius: var(--md-code-block-radius); + border-top-left-radius: var(--md-code-block-radius); +} + +.highlighttable th.filename, +.md-typeset .tabbed-labels > label { + color: var(--colors-white); +} + +.md-typeset .highlighttable > tbody > tr + tr > .code > div > pre > code { + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.md-typeset .highlighttable > tbody > tr + tr > .linenos { + border-top-left-radius: 0; +} + +.md-typeset code { + color: var(--md-code-fg-color); + background-color: var(--md-code-bg-color); + border-radius: .25rem; + padding: .1rem .3rem; +} + +[data-md-color-scheme=default] .md-typeset code { + background-color: var(--md-code-fg-color); + color: var(--md-code-bg-color); +} + +.md-typeset pre > code { + border-radius: var(--md-code-block-radius); + color: var(--md-code-fg-color) !important; + background-color: var(--md-code-bg-color) !important; +} + +.highlighttable .linenodiv pre { + color: var(--md-code-hl-name-color); +} + +.md-typeset code .nx, +.md-typeset code .err { + color: var(--md-code-hl-name-color); +} + .md-grid { max-width: 100%; } @@ -262,7 +342,6 @@ } .md-sidebar--primary { - background-color: var(--md-footer-bg-color); border-right: 1px solid var(--md-divider-color); } @@ -270,14 +349,6 @@ margin-top: 0px; } -.md-sidebar__inner { - padding-right: 0px !important; -} - -.md-nav__item { - padding-top: 3px; -} - .md-sidebar--secondary .md-nav--secondary > ul ul > li { padding-left: 30px; font-size: 0.6rem; @@ -334,7 +405,9 @@ @media screen and (min-width: 76.25em) { [dir=ltr] .md-sidebar--secondary:not([hidden])~.md-content > .md-content__inner, [dir=rtl] .md-sidebar--primary:not([hidden])~.md-content > .md-content__inner { - margin: 0 2rem 3rem; + margin: 0 auto 3rem; + padding: .5rem 2rem; + max-width: 850px; } [data-md-toggle=search]:checked~.md-header .md-tabs, diff --git a/en/theme/material/templates/no-right-sidebar.html b/en/theme/material/templates/no-right-sidebar.html index 3388338629..697744e9b4 100644 --- a/en/theme/material/templates/no-right-sidebar.html +++ b/en/theme/material/templates/no-right-sidebar.html @@ -1,5 +1,5 @@ + +{% extends "base.html" %} + +{% block styles %} + {{ super() }} + +{% endblock %} + +{% block container %} +
+
+ +

{{ page.meta.heading }}

+ {{ page.meta.description }} + + {% if page.meta.what_you_will_learn or page.meta.prerequisites or page.meta.source_code %} +
+ {% if page.meta.what_you_will_learn or page.meta.prerequisites %} +
+ {% if page.meta.what_you_will_learn %} +
+

What You Will Learn

+
    + {% for item in page.meta.what_you_will_learn %} + {% set item = item.replace('{{ config.extra.base_path }}', config.extra.base_path) %} +
  • {{ item | safe }}
  • + {% endfor %} +
+
+ {% endif %} + {% if page.meta.prerequisites %} +
+

Prerequisites

+ Before you start, ensure you have the following: +
    + {% for item in page.meta.prerequisites %} + {% set item = item.replace('{{ config.extra.base_path }}', config.extra.base_path) %} +
  • {{ item | safe }}
  • + {% endfor %} +
+
+ {% endif %} +
+
+ {% endif %} + {% if page.meta.source_code %} +

Example Source Code

+ {{ page.meta.source_code | safe }} + {% endif %} +
+ {% endif %} + +
+ + {{ page.content }} + +
+ + {% if page.meta.whats_next %} + +
+

What's Next?

+
    + {% for item in page.meta.whats_next %} + {% set item = item.replace('{{ config.extra.base_path }}', config.extra.base_path) %} +
  • {{ item | safe }}
  • + {% endfor %} +
+
+ {% endif %} + +
+
+ + + +{% endblock %} diff --git a/en/theme/material/templates/versions.html b/en/theme/material/templates/versions.html index 3803f12709..8e324c75b5 100644 --- a/en/theme/material/templates/versions.html +++ b/en/theme/material/templates/versions.html @@ -1,5 +1,5 @@