From fbe8560a6e8cd87b43987e77dd1957d84c2f288a Mon Sep 17 00:00:00 2001 From: bfintal Date: Thu, 13 Aug 2026 13:11:58 +0800 Subject: [PATCH 01/13] Migrate e2e tests from wp-env to WordPress Playground. Replace Docker/.env Playwright harness with @wp-playground/cli, shared blueprints, Design Library fixtures, and hardened REST nonce handling for free and premium suites. --- .env.example | 25 - .github/workflows/e2e-tests.yml | 106 + .github/workflows/playwright.yml | 143 - .gitignore | 2 + AGENTS.md | 7 +- e2e/config/fixtures/design-library-pages.json | 23 + .../fixtures/design-library-patterns.json | 26 + e2e/config/global-setup.js | 83 + e2e/config/global-setup.ts | 43 - e2e/config/stackable-e2e-mu-plugin.php | 62 +- e2e/playground-blueprint.json | 22 + e2e/playwright.config.ts | 117 - e2e/readme.md | 175 +- e2e/setup/auth.js | 24 - e2e/test-utils/mock-design-library.ts | 40 + e2e/test-utils/requestUtils.ts | 61 +- e2e/test-utils/test.ts | 5 +- e2e/tests/design-library.spec.ts | 14 +- e2e/tests/existing-blocks.spec.ts | 21 +- package-lock.json | 5695 ++++++++++++++++- package.json | 11 +- playwright.config.js | 74 + playwright.premium.config.js | 75 + tools/playwright-test-matrix.js | 29 +- tools/update-build-type.js | 16 +- 25 files changed, 6244 insertions(+), 655 deletions(-) delete mode 100644 .env.example create mode 100644 .github/workflows/e2e-tests.yml delete mode 100644 .github/workflows/playwright.yml create mode 100644 e2e/config/fixtures/design-library-pages.json create mode 100644 e2e/config/fixtures/design-library-patterns.json create mode 100644 e2e/config/global-setup.js delete mode 100644 e2e/config/global-setup.ts create mode 100644 e2e/playground-blueprint.json delete mode 100644 e2e/playwright.config.ts delete mode 100644 e2e/setup/auth.js create mode 100644 e2e/test-utils/mock-design-library.ts create mode 100644 playwright.config.js create mode 100644 playwright.premium.config.js diff --git a/.env.example b/.env.example deleted file mode 100644 index b0b50fdfcc..0000000000 --- a/.env.example +++ /dev/null @@ -1,25 +0,0 @@ -# Copy to `.env` in the free plugin root and fill in values: -# cp .env.example .env -# -# Used by Playwright e2e (free + premium configs load this file). - -# Local by Flywheel / local WP URL (use https if the site redirects to SSL) -WP_BASE_URL=https://local.local - -# Relative path where Playwright stores auth cookies after global setup -WP_AUTH_STORAGE=wp-auth.json - -WP_USERNAME=admin -WP_PASSWORD=password - -# Plugin folder + main PHP file under wp-content/plugins/ -# Free/local example: Stackable/plugin -# Premium CI often uses: Stackable-Premium/plugin -STACKABLE_SLUG=Stackable/plugin - -# Optional. Only needed for existing-blocks.spec.ts (CI creates this post). -# Leave unset locally to skip that test. -# WP_TEST_POSTID= - -# Premium e2e only — Freemius license for activate-license setup -# WP_STK_LICENSE= diff --git a/.github/workflows/e2e-tests.yml b/.github/workflows/e2e-tests.yml new file mode 100644 index 0000000000..8b35a223d4 --- /dev/null +++ b/.github/workflows/e2e-tests.yml @@ -0,0 +1,106 @@ +name: E2E Tests + +on: + push: + branches: [ master, develop ] + pull_request: + branches: [ master, develop ] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: lts/* + cache: npm + cache-dependency-path: package-lock.json + - name: Build Stackable Free Plugin + run: | + npm ci --legacy-peer-deps + npm run build:e2e + - name: Archive plugin build + run: tar --exclude=./node_modules --exclude=./.git -czf /tmp/stackable-e2e-build.tar.gz . + - uses: actions/upload-artifact@v4 + with: + name: stackable-e2e-build + path: /tmp/stackable-e2e-build.tar.gz + retention-days: 1 + + test: + needs: build + timeout-minutes: 60 + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + include: + # stackable-playwright-matrix-start + - php_version: '8.5' + wp_version: '7.0' + - php_version: '7.4' + wp_version: '7.0' + - php_version: '7.4' + wp_version: '6.8' + - php_version: '7.4' + wp_version: '6.9' + # stackable-playwright-matrix-end + name: Free e2e PHP ${{ matrix.php_version }} WP ${{ matrix.wp_version }} + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: lts/* + cache: npm + cache-dependency-path: package-lock.json + - name: Restore plugin build + uses: actions/download-artifact@v4 + with: + name: stackable-e2e-build + - name: Extract plugin build + run: tar -xzf stackable-e2e-build.tar.gz + - name: Install dependencies + run: npm ci --legacy-peer-deps + - name: Set the version suffix for the output + run: echo VERSION_SUFFIX=${GITHUB_REF_NAME//\//-} >> $GITHUB_ENV + - name: Cache Playwright Browsers + uses: actions/cache@v4 + with: + path: ~/.cache/ms-playwright + key: ${{ runner.os }}-playwright-${{ hashFiles('package-lock.json') }} + restore-keys: | + ${{ runner.os }}-playwright- + - name: Install Playwright Browsers + timeout-minutes: 15 + run: | + for attempt in 1 2 3; do + npx playwright install chromium --with-deps && exit 0 + echo "Playwright install failed on attempt $attempt" + sleep $((attempt * 30)) + done + exit 1 + - name: Run free Playwright e2e suite + id: run-playwright-tests + env: + WP_PHP_VERSION: ${{ matrix.php_version }} + WP_VERSION: ${{ matrix.wp_version }} + run: npm run test:e2e + - uses: actions/upload-artifact@v4 + if: ${{ !cancelled() && steps.run-playwright-tests.outcome == 'failure' }} + id: artifact-upload-step + with: + name: playwright-report-php_${{ matrix.php_version }}-wp_${{ matrix.wp_version }}-${{ env.VERSION_SUFFIX }} + path: playwright-report/ + overwrite: true + retention-days: 30 + - uses: markpatterson27/markdown-to-output@v1 + id: mto + if: ${{ !cancelled() && steps.run-playwright-tests.outcome == 'failure' }} + with: + filepath: ./playwright-stk/errors.md + - name: Add test results to summary + if: ${{ !cancelled() && steps.run-playwright-tests.outcome == 'failure' }} + run: | + echo "${{ steps.mto.outputs.body }}" >> $GITHUB_STEP_SUMMARY + echo "Report: [playwright-report-php_${{ matrix.php_version }}-wp_${{ matrix.wp_version }}-${{ env.VERSION_SUFFIX }}.zip](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}/artifacts/${{ steps.artifact-upload-step.outputs.artifact-id }})" >> $GITHUB_STEP_SUMMARY diff --git a/.github/workflows/playwright.yml b/.github/workflows/playwright.yml deleted file mode 100644 index aa0e55baf8..0000000000 --- a/.github/workflows/playwright.yml +++ /dev/null @@ -1,143 +0,0 @@ -name: Playwright Tests -on: - push: - branches: [ master, develop ] - pull_request: - branches: [ master, develop ] -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 - with: - node-version: lts/* - cache: npm - cache-dependency-path: package-lock.json - - name: Build Stackable Free Plugin - run: | - npm ci --legacy-peer-deps - npm run build:no-translate - - name: Archive plugin build - run: tar --exclude=./node_modules --exclude=./.git -czf /tmp/stackable-playwright-build.tar.gz . - - uses: actions/upload-artifact@v4 - with: - name: stackable-playwright-build - path: /tmp/stackable-playwright-build.tar.gz - retention-days: 1 - - test: - needs: build - timeout-minutes: 60 - runs-on: ubuntu-latest - strategy: - fail-fast: false # Ensures the matrix doesn't stop if one job fails - matrix: - include: - # stackable-playwright-matrix-start - - php_version: '8.5' - wp_version: '7.0.2' - - php_version: '7.4' - wp_version: '7.0.2' - - php_version: '7.4' - wp_version: '6.8.6' - - php_version: '7.4' - wp_version: '6.9.5' - # stackable-playwright-matrix-end - name: PHP ${{ matrix.php_version }} and WP ${{ matrix.wp_version || 'latest' }} - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 - with: - node-version: lts/* - cache: npm - cache-dependency-path: package-lock.json - - name: Restore plugin build - uses: actions/download-artifact@v4 - with: - name: stackable-playwright-build - - name: Extract plugin build - run: tar -xzf stackable-playwright-build.tar.gz - - name: Install dependencies - run: npm ci --legacy-peer-deps - - name: Set the version suffix for the output - run: echo VERSION_SUFFIX=${GITHUB_REF_NAME//\//-} >> $GITHUB_ENV - - name: Set WP Version and create .wp-env.json - run: | - WP_VERSION="${{ matrix.wp_version }}" - core='"Wordpress/Wordpress#'${{ matrix.wp_version }}'"' - - if [[ -z "$WP_VERSION" || "$WP_VERSION" == "null" ]]; then - WP_VERSION="latest" - core=null - fi - - echo "WP_VERSION=$WP_VERSION" >> $GITHUB_ENV - - echo '{ - "core": '$core', - "phpVersion": "${{ matrix.php_version }}", - "plugins": [ "." ], - "config": { - "SCRIPT_DEBUG": false - } - }' > .wp-env.json - - cat .wp-env.json - - name: Cache Playwright Browsers - uses: actions/cache@v4 - with: - path: ~/.cache/ms-playwright - key: ${{ runner.os }}-playwright-${{ hashFiles('package-lock.json') }} - restore-keys: | - ${{ runner.os }}-playwright- - - name: Install Playwright Browsers - timeout-minutes: 15 - run: | - for attempt in 1 2 3; do - npx playwright install chromium --with-deps && exit 0 - echo "Playwright install failed on attempt $attempt" - sleep $((attempt * 30)) - done - exit 1 - - name: Start wp-env - run: npx @wordpress/env start - - name: Print current WP version - run: npx @wordpress/env run tests-cli wp core version - - name: Create post with existing blocks - run: | - POST_ID=$(npx @wordpress/env run tests-cli wp post create wp-content/plugins/Stackable/e2e/config/post-content.txt --post_title="Existing Blocks" --post_status=publish --porcelain) - echo "WP_TEST_POSTID=$POST_ID" >> $GITHUB_ENV - continue-on-error: true - - name: Disable guided tours - run: | - TOUR_STATES='["design-system", "editor", "design-library", "blocks"]' - npx @wordpress/env run tests-cli wp option update stackable_guided_tour_states "$TOUR_STATES" --format=json - - name: Run playwright tests - id: run-playwright-tests - env: - WP_BASE_URL: http://localhost:8889 - WP_AUTH_STORAGE: wp-auth.json - WP_USERNAME: admin - WP_PASSWORD: password - STACKABLE_SLUG: Stackable/plugin - WP_TEST_POSTID: ${{ env.WP_TEST_POSTID }} - run: npm run test - - uses: actions/upload-artifact@v4 - if: ${{ !cancelled() && steps.run-playwright-tests.outcome == 'failure' }} - id: artifact-upload-step - with: - name: playwright-report-php_${{ matrix.php_version }}-wp_${{ env.WP_VERSION }}-${{ env.VERSION_SUFFIX }} - path: playwright-report/ - overwrite: true - retention-days: 30 - - uses: markpatterson27/markdown-to-output@v1 - id: mto - if: ${{ !cancelled() && steps.run-playwright-tests.outcome == 'failure' }} - with: - filepath: ./playwright-stk/errors.md - - name: Add test results to summary - if: ${{ !cancelled() && steps.run-playwright-tests.outcome == 'failure' }} - run: | - echo "${{ steps.mto.outputs.body }}" >> $GITHUB_STEP_SUMMARY - echo "Report: [playwright-report-php_${{ matrix.php_version }}-wp_${{ env.WP_VERSION }}-${{ env.VERSION_SUFFIX }}.zip](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}/artifacts/${{ steps.artifact-upload-step.outputs.artifact-id }})" >> $GITHUB_STEP_SUMMARY diff --git a/.gitignore b/.gitignore index e18c9711bb..dce847fe88 100644 --- a/.gitignore +++ b/.gitignore @@ -21,5 +21,7 @@ composer.lock /wordpress /test-results/ /playwright-report/ +/playwright-report-premium/ /blob-report/ /playwright/.cache/ +e2e/.auth/ diff --git a/AGENTS.md b/AGENTS.md index 94c02752c0..dceb45f988 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -59,8 +59,11 @@ Do not apply GitHub changes (close, comment, relabel) during issue triage withou ### Testing -- Unit / Jest: `npm test` (and related `test:*` scripts in `package.json`). -- Playwright e2e: see [`e2e/readme.md`](./e2e/readme.md) (`npm test` / `npm run test:debug` with `.env` configured). +- Unit / Jest: `npm run test:scripts` / `npm run test-old` (and related coverage scripts). +- Playwright e2e (WordPress Playground, no Docker): see [`e2e/readme.md`](./e2e/readme.md) + (`npm run build:e2e` then `npm run test:e2e` / `npm run test:debug`). + Premium: `npm run build:e2e:premium` then `npm run test:e2e:premium` with + `pro__premium_only/` present. - Lint: `npm run lint` / `lint-js` / `lint-css` as appropriate for touched files. ### Quality gate diff --git a/e2e/config/fixtures/design-library-pages.json b/e2e/config/fixtures/design-library-pages.json new file mode 100644 index 0000000000..bb99079925 --- /dev/null +++ b/e2e/config/fixtures/design-library-pages.json @@ -0,0 +1,23 @@ +{ + "home-page-1": { + "id": "home-page-1", + "label": "Home Page 1", + "description": "E2E free home page", + "plan": "free", + "category": "Home Page", + "template": [ + { "id": "section-call-to-action-1", "bg": true }, + { "id": "section-card-1" } + ] + }, + "about-page-1": { + "id": "about-page-1", + "label": "About Page 1", + "description": "E2E free about page", + "plan": "free", + "category": "About Page", + "template": [ + { "id": "section-card-1" } + ] + } +} diff --git a/e2e/config/fixtures/design-library-patterns.json b/e2e/config/fixtures/design-library-patterns.json new file mode 100644 index 0000000000..ad5e46c281 --- /dev/null +++ b/e2e/config/fixtures/design-library-patterns.json @@ -0,0 +1,26 @@ +{ + "section-call-to-action-1": { + "id": "section-call-to-action-1", + "label": "Call to Action 1", + "description": "E2E free CTA pattern", + "plan": "free", + "category": "Call to Action", + "template": "

E2E Free CTA

" + }, + "section-call-to-action-3": { + "id": "section-call-to-action-3", + "label": "Call to Action 3", + "description": "E2E premium CTA pattern", + "plan": "premium", + "category": "Call to Action", + "template": "

E2E Premium CTA

" + }, + "section-card-1": { + "id": "section-card-1", + "label": "Card 1", + "description": "E2E free card pattern", + "plan": "free", + "category": "Card", + "template": "

E2E Free Card

" + } +} diff --git a/e2e/config/global-setup.js b/e2e/config/global-setup.js new file mode 100644 index 0000000000..cca04a55a9 --- /dev/null +++ b/e2e/config/global-setup.js @@ -0,0 +1,83 @@ +/** + * Playwright global setup: cookie-authenticates as the Playground blueprint + * admin (admin / password) and persists storage state for specs + requestUtils. + * + * Resolves the "Existing Blocks" post ID from (in order): + * 1. WP_TEST_POSTID env + * 2. Blueprint-written e2e/.auth/seed-post.json + * 3. REST search by exact title + * + * Writes e2e/.auth/test-env.json for existing-blocks.spec.ts. + * In CI, missing fixture post ID fails closed so the suite cannot skip that check. + */ +const fs = require( 'fs/promises' ) +const path = require( 'path' ) +const { RequestUtils } = require( '@wordpress/e2e-test-utils-playwright' ) + +module.exports = async function globalSetup() { + const storageStatePath = process.env.STORAGE_STATE_PATH + const requestUtils = await RequestUtils.setup( { + user: { + username: process.env.WP_USERNAME || 'admin', + password: process.env.WP_PASSWORD || 'password', + }, + storageStatePath, + baseURL: process.env.WP_BASE_URL, + } ) + + await requestUtils.setupRest() + + const authDir = path.dirname( storageStatePath || path.join( __dirname, '../.auth/admin.json' ) ) + await fs.mkdir( authDir, { recursive: true } ) + + let existingBlocksPostId = process.env.WP_TEST_POSTID || null + + if ( ! existingBlocksPostId ) { + try { + const seed = JSON.parse( + await fs.readFile( path.join( authDir, 'seed-post.json' ), 'utf8' ) + ) + if ( seed.WP_TEST_POSTID ) { + existingBlocksPostId = String( seed.WP_TEST_POSTID ) + } + } catch { + // Blueprint may not have written a seed file yet / older boots. + } + } + + if ( ! existingBlocksPostId ) { + try { + const posts = await requestUtils.rest( { + path: '/wp/v2/posts', + params: { + search: 'Existing Blocks', + status: 'publish', + // REST query arg (WordPress API), not a JS identifier. + // eslint-disable-next-line camelcase + per_page: 10, + }, + } ) + const match = ( posts || [] ).find( post => post.title?.rendered === 'Existing Blocks' ) + if ( match ) { + existingBlocksPostId = String( match.id ) + } + } catch ( error ) { + // eslint-disable-next-line no-console + console.warn( 'Could not resolve Existing Blocks post via REST:', error.message ) + } + } + + if ( ! existingBlocksPostId && process.env.CI ) { + throw new Error( + 'Existing Blocks fixture post ID was not seeded. Check playground-blueprint.json runPHP step.' + ) + } + + await fs.writeFile( + path.join( authDir, 'test-env.json' ), + JSON.stringify( { + WP_TEST_POSTID: existingBlocksPostId || undefined, + STACKABLE_SLUG: process.env.STACKABLE_SLUG || 'stackable/plugin', + }, null, 2 ) + ) +} diff --git a/e2e/config/global-setup.ts b/e2e/config/global-setup.ts deleted file mode 100644 index f465ba6aab..0000000000 --- a/e2e/config/global-setup.ts +++ /dev/null @@ -1,43 +0,0 @@ -// Gutenberg global setup: https://github.com/WordPress/gutenberg/blob/b4304f8bf6bd9b890b4108adcc326cd586a3ab4e/test/e2e/config/global-setup.ts - -import { request } from '@playwright/test' - -import { ExtendedRequestUtils } from 'e2e/test-utils' - -// To interact with the WP Guest Bar plugin's settings page, we must be authenticated. -// Before any tests are run, we sign in, save the cookies set by WordPress, and then discard the session. -// Later, when we need to act as a logged-in user, we make those cookies available. -// https://playwright.dev/docs/test-global-setup-teardown#configure-globalsetup-and-globalteardown -async function globalSetup() { - const requestContext = await request.newContext( { - baseURL: process.env.WP_BASE_URL, - // Local by Flywheel (and similar) often use a self-signed HTTPS cert. - ignoreHTTPSErrors: true, - } ) - const requestUtils = new ExtendedRequestUtils( requestContext, { - storageStatePath: process.env.WP_AUTH_STORAGE, - user: { - username: process.env.WP_USERNAME, - password: process.env.WP_PASSWORD, - }, - } ) - - // Alternatively, we could take a more traditional route, - // filling in the input fields for the username and password and submitting the form. - // https://playwright.dev/docs/test-global-setup-teardown#example - await requestUtils.setupRest() - - // Deactivate all plugins except Stackable - const plugins = await requestUtils.getActivePlugins() - - // Use for loop because forEach cannot handle async operations - for ( const slug of Object.keys( plugins ) ) { - await requestUtils.deactivatePlugin( slug ) - } - - await requestUtils.activatePlugin( process.env.STACKABLE_SLUG ) - - await requestContext.dispose() -} - -export default globalSetup diff --git a/e2e/config/stackable-e2e-mu-plugin.php b/e2e/config/stackable-e2e-mu-plugin.php index 603902e018..b3fca80ac6 100644 --- a/e2e/config/stackable-e2e-mu-plugin.php +++ b/e2e/config/stackable-e2e-mu-plugin.php @@ -2,10 +2,15 @@ /** * Must-use plugin for Stackable Playwright e2e tests. * - * Registers post meta used by Dynamic Content tests so it can be set via the REST API. + * - Registers post meta used by Dynamic Content tests so it can be set via REST. + * - Mocks Design Library CDN responses so free/premium suites do not depend on + * outbound network to stackable-files.pages.dev. * - * Load via wp-env mappings, e.g.: - * "wp-content/mu-plugins/stackable-e2e.php": "./e2e/config/stackable-e2e-mu-plugin.php" + * Mounted by playwright.config.js and playwright.premium.config.js into + * Playground as `wp-content/mu-plugins/stackable-e2e.php`. + * + * Fixtures live under the mounted plugin tree: + * `wp-content/plugins/stackable/e2e/config/fixtures/`. */ add_action( 'init', function() { @@ -18,3 +23,54 @@ }, ) ); } ); + +/** + * Serve local Design Library fixtures instead of hitting the CDN. + * + * Matches `library-v4/library.json` and `library-v4/pages.json` requests from + * `Stackable_Design_Library::get_design_library_from_cloud()`. + * + * @param false|array|WP_Error $preempt + * @param array $args + * @param string $url + * @return false|array + */ +add_filter( 'pre_http_request', function( $preempt, $args, $url ) { + if ( false !== $preempt ) { + return $preempt; + } + + $fixture_file = null; + if ( false !== strpos( $url, 'library-v4/library.json' ) ) { + $fixture_file = 'design-library-patterns.json'; + } elseif ( false !== strpos( $url, 'library-v4/pages.json' ) ) { + $fixture_file = 'design-library-pages.json'; + } + + if ( ! $fixture_file ) { + return $preempt; + } + + $fixture_path = WP_PLUGIN_DIR . '/stackable/e2e/config/fixtures/' . $fixture_file; + if ( ! is_readable( $fixture_path ) ) { + return $preempt; + } + + $body = file_get_contents( $fixture_path ); + if ( false === $body || '' === $body ) { + return $preempt; + } + + return array( + 'headers' => array( + 'content-type' => 'application/json', + ), + 'body' => $body, + 'response' => array( + 'code' => 200, + 'message' => 'OK', + ), + 'cookies' => array(), + 'filename' => null, + ); +}, 10, 3 ); diff --git a/e2e/playground-blueprint.json b/e2e/playground-blueprint.json new file mode 100644 index 0000000000..e653cf5858 --- /dev/null +++ b/e2e/playground-blueprint.json @@ -0,0 +1,22 @@ +{ + "$schema": "https://playground.wordpress.net/blueprint-schema.json", + "features": { + "networking": true + }, + "steps": [ + { + "step": "login", + "username": "admin", + "password": "password" + }, + { + "step": "activatePlugin", + "pluginName": "Stackable - Gutenberg Blocks", + "pluginPath": "/wordpress/wp-content/plugins/stackable/plugin.php" + }, + { + "step": "runPHP", + "code": "get_var( $wpdb->prepare(\n\t\t\"SELECT ID FROM {$wpdb->posts} WHERE post_title = %s AND post_type = 'post' AND post_status = 'publish' LIMIT 1\",\n\t\t'Existing Blocks'\n\t) );\n\tif ( ! $id ) {\n\t\t$id = wp_insert_post( array(\n\t\t\t'post_title' => 'Existing Blocks',\n\t\t\t'post_status' => 'publish',\n\t\t\t'post_content' => file_get_contents( $content_file ),\n\t\t), true );\n\t}\n\tif ( $id && ! is_wp_error( $id ) ) {\n\t\tupdate_option( 'stackable_e2e_existing_blocks_post_id', (int) $id, false );\n\t\t$seed_dir = '/wordpress/wp-content/plugins/stackable/e2e/.auth';\n\t\tif ( ! is_dir( $seed_dir ) ) {\n\t\t\tmkdir( $seed_dir, 0777, true );\n\t\t}\n\t\tfile_put_contents(\n\t\t\t$seed_dir . '/seed-post.json',\n\t\t\twp_json_encode( array( 'WP_TEST_POSTID' => (string) (int) $id ) )\n\t\t);\n\t}\n}\n" + } + ] +} diff --git a/e2e/playwright.config.ts b/e2e/playwright.config.ts deleted file mode 100644 index 5e7ef23fc0..0000000000 --- a/e2e/playwright.config.ts +++ /dev/null @@ -1,117 +0,0 @@ -import { defineConfig, devices } from '@playwright/test' -import { fileURLToPath } from 'url' - -/** - * Read environment variables from file. - * https://github.com/motdotla/dotenv - */ -import dotenv from 'dotenv' -import path from 'path' -dotenv.config( { path: path.resolve( __dirname, '../.env' ) } ) - -/** - * See https://playwright.dev/docs/test-configuration. - */ -export default defineConfig( { - // This is run before any tests. Check the file for more information. - // globalSetup: 'e2e-global-setup.ts', - globalSetup: fileURLToPath( - new URL( './config/global-setup.ts', 'file:' + __filename ).href - ), - /* Run tests in files in parallel */ - // fullyParallel: true, - /* Fail the build on CI if you accidentally left test.only in the source code. */ - // forbidOnly: !! process.env.CI, - /* Retry on CI only */ - retries: process.env.CI ? 1 : 0, - // Locally, we could take advantage of parallelism due to multicore systems. - // However, in the CI, we typically can use only one worker at a time. - // It's more straightforward to align how we run tests in both systems. - // https://playwright.dev/docs/test-parallel - // workers: process.env.CI ? 1 : undefined, - workers: 1, - /* Reporter to use. See https://playwright.dev/docs/test-reporters */ - reporter: [ [ './config/reporter.ts' ], [ 'html', { outputFolder: '../playwright-report', open: 'never' } ] ], - reportSlowTests: null, - /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ - use: { - /* Base URL to use in actions like `await page.goto('/')`. */ - // baseURL: 'http://127.0.0.1:3000', - - /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ - // trace: 'on-first-retry', - - // It's simpler to use relative paths when referencing our application's URLs. - // https://playwright.dev/docs/test-webserver#adding-a-baseurl - baseURL: process.env.WP_BASE_URL, - - // Local by Flywheel (and similar) often use a self-signed HTTPS cert. - ignoreHTTPSErrors: true, - - // We save as much information as possible to make debugging easier. - // https://playwright.dev/docs/api/class-testoptions#test-options-screenshot - // https://playwright.dev/docs/api/class-testoptions#test-options-trace - // https://playwright.dev/docs/api/class-testoptions#test-options-video - screenshot: 'only-on-failure', - trace: 'retain-on-failure', - video: 'retain-on-failure', - }, - - /* Configure projects for major browsers */ - projects: [ - // { - // name: 'auth', - // // testDir, - // testMatch: 'setup/auth.js', - // }, - { - name: 'Stackable Free', - use: { - storageState: process.env.WP_AUTH_STORAGE, - ...devices[ 'Desktop Chrome' ], - }, - testDir: './tests', - }, - // { - // name: 'chromium', - // use: { ...devices[ 'Desktop Chrome' ] }, - // }, - - // { - // name: 'firefox', - // use: { ...devices['Desktop Firefox'] }, - // }, - - // { - // name: 'webkit', - // use: { ...devices['Desktop Safari'] }, - // }, - - /* Test against mobile viewports. */ - // { - // name: 'Mobile Chrome', - // use: { ...devices['Pixel 5'] }, - // }, - // { - // name: 'Mobile Safari', - // use: { ...devices['iPhone 12'] }, - // }, - - /* Test against branded browsers. */ - // { - // name: 'Microsoft Edge', - // use: { ...devices['Desktop Edge'], channel: 'msedge' }, - // }, - // { - // name: 'Google Chrome', - // use: { ...devices['Desktop Chrome'], channel: 'chrome' }, - // }, - ], - - /* Run your local dev server before starting the tests */ - // webServer: { - // command: 'npm run start', - // url: 'http://127.0.0.1:3000', - // reuseExistingServer: !process.env.CI, - // }, -} ) diff --git a/e2e/readme.md b/e2e/readme.md index c3f20303f6..c942ccff2c 100644 --- a/e2e/readme.md +++ b/e2e/readme.md @@ -1,83 +1,156 @@ # E2E Testing -Stackable's end-to-end testing aims to test the high-level functions of the -plugin in order to quickly assess whether everything is in working condition. +Stackable's end-to-end tests verify admin pages, block editor flows, global +settings, Design Library, and (premium suite) Dynamic Content / premium settings. -Our goal is to have this run in every Github pull request, and for RC builds. +WordPress is provided by [`@wp-playground/cli`](https://www.npmjs.com/package/@wp-playground/cli) +(WASM PHP + SQLite, **no Docker**). Playwright's `webServer` boots it +automatically before the suite runs. -At the minimum, e2e testing should test the following: -- Plugin's admin pages are intact -- Plugin's licensing functionality is working (for Premium codebase only) -- Blocks are present in the Block Editor and working -- Blocks are present in the Site Editor -- Global settings and functionality is working -- Design Library opens, loads patterns/pages, filters, and inserts designs -- Dynamic Content resolves on the frontend (Premium codebase only) -- Perform the above tests in all supported lower WordPress versions +## Prerequisites -Ideally, we should also handle these: -- Blocks / content from old plugin versions to this new one do not show errors - in editor -- Blocks / content from old plugin versions to this new one look identical in - the frontend +Just Node **20+** - no Docker, Composer, Local WP, or `.env` file. -Github workflow should also test: -- Different WP versions that we support -- Different PHP versions that we support +For **premium** specs you also need `pro__premium_only/` checked out under +the free plugin root (clone `bfintal/Stackable-Premium` into that directory). +Playground mounts the plugin tree as a real directory, so a symlink that +points outside the mount will not expose premium files inside WASM PHP. -# Usage +## Usage -Copy the example env file in the free plugin root, then edit values: +### Free suite + +Build plugin assets first (Playground mounts this repo; enqueue needs `dist/`): ```bash -cp .env.example .env +npm run build:e2e ``` -See `.env.example` for all variables. For Local by Flywheel, use your site’s -real URL (often `https://yoursite.local`). Playwright is configured with -`ignoreHTTPSErrors` for Local’s self-signed cert. Leave `WP_TEST_POSTID` -unset locally to skip `existing-blocks.spec.ts` (CI creates that post). +Run free e2e tests (Playground starts on port `9420` if nothing is already listening): -In Freemius, make sure the license key is: -- new -- lifetime unlimited quota -- has an owner -- non-blocking and white-labeled +```bash +npm run test:e2e +``` -Run this command to run e2e: +or with the Playwright UI: ```bash npm run test:debug ``` -or without the UI: +### Premium suite ```bash -npm run test +# Mount premium (once), e.g.: +# git clone git@github.com:bfintal/Stackable-Premium.git pro__premium_only + +npm run build:e2e:premium +npm run test:e2e:premium ``` -# Dynamic Content (Premium) +or with the Playwright UI: -Premium Dynamic Content tests live in -`pro__premium_only/e2e/tests/dynamic-content.spec.ts`. +```bash +npm run test:debug:premium +``` -The post-meta test needs this must-use plugin so `stk_e2e_dc_meta` is available -over the REST API: +Premium uses port `9421`, `playwright.premium.config.js`, and the shared +`e2e/playground-blueprint.json`. It mounts: -`e2e/config/stackable-e2e-mu-plugin.php` +- `e2e/config/stackable-e2e-mu-plugin.php` (Dynamic Content post meta for REST; + Design Library CDN fixtures via `pre_http_request`) +- `pro__premium_only/e2e/mu-plugins/stackable-e2e-mock-premium.php` (injects a + Freemius in-memory license, exits Freemius activation/opt-in mode, and + suppresses the post-activation admin redirect so Settings stays registered + and REST `rest-nonce` is not poisoned with Getting Started HTML) -Premium CI maps it into wp-env automatically. For local wp-env, add: +After premium builds, restore the free build type if you need free packaging: -```json -"mappings": { - "wp-content/mu-plugins/stackable-e2e.php": "./e2e/config/stackable-e2e-mu-plugin.php" -} +```bash +node ./tools/update-build-type.js free ``` -For a non-wp-env site (e.g. local.local), copy or symlink that file into -`wp-content/mu-plugins/stackable-e2e.php`. +Locally, Playwright reuses an already-running Playground on the suite's port +when present (fast repeat runs). In CI it always boots fresh. If a stale +instance is misbehaving after editing PHP/JS that Playground mounted at boot, +kill whatever is listening on that port and re-run. + +Optional overrides: -# Dev Notes +``` +WP_PORT=9420 +WP_BASE_URL=http://127.0.0.1:9420 +WP_PHP_VERSION=8.2 +WP_VERSION=latest +WP_USERNAME=admin +WP_PASSWORD=password +STACKABLE_SLUG=stackable/plugin +``` -- Our main basis: https://github.com/meszarosrob/wordpress-e2e-playwright-intro-2023 -- Gutenberg e2e Github workflow: https://github.com/WordPress/gutenberg/blob/trunk/.github/workflows/end2end-test.yml +## CI + +| Repo | Workflow | Suites | +|------|----------|--------| +| Free (`gambitph/Stackable`) | `.github/workflows/e2e-tests.yml` | Free matrix (`build:e2e` → `test:e2e`) | +| Premium (`bfintal/Stackable-Premium`) | `pro__premium_only/.github/workflows/e2e-tests.yml` | Free then premium (checks out free as root + premium as `pro__premium_only/`) | + +PHP/WP matrix cells are Playground `--php` / `--wp` values (major.minor). +`tools/playwright-test-matrix.js` syncs both workflow files. + +## What is covered + +### Free (`e2e/tests/`) + +| Surface | Flow | +|---------|------| +| Admin | Activate redirects to Getting Started; settings save | +| Block editor | Insert Text block; inspector tabs; attribute updates | +| Global settings | Color / typography surfaces | +| Design Library | Open, load patterns, insert | +| Existing blocks | Fixture post from blueprint has no block validation errors | + +### Premium (`pro__premium_only/e2e/tests/`) + +| Surface | Flow | +|---------|------| +| Settings | Role Manager tab available when premium mock is mounted | +| Dynamic Content | Post title / meta / featured image resolve on the frontend | + +## Files + +| Path | Role | +| --- | --- | +| `../playwright.config.js` | Free suite; Playground on 9420 | +| `../playwright.premium.config.js` | Premium suite; Playground on 9421 | +| `playground-blueprint.json` | Shared login + activate Stackable + seed tours / existing-blocks post | +| `config/global-setup.js` | Cookie auth + write `e2e/.auth/test-env.json` | +| `config/stackable-e2e-mu-plugin.php` | DC post meta + Design Library CDN mock | +| `config/fixtures/design-library-*.json` | Mock patterns/pages served via `pre_http_request` | +| `test-utils/` | Shared fixtures | +| `tests/*.spec.ts` | Free browser specs | +| `../pro__premium_only/e2e/tests/*.spec.ts` | Premium browser specs | +| `../pro__premium_only/e2e/mu-plugins/stackable-e2e-mock-premium.php` | E2E-only Freemius license injection | +| `.auth/` | Gitignored; written by global setup | + +## Troubleshooting + +- **`browserType.launch: Executable doesn't exist`** - run + `npx playwright install chromium` once per machine. +- **Stale plugin behaviour after editing PHP** - Playground snapshots the + mount at boot. Stop the process on the suite port and re-run. +- **Design Library empty / CDN errors on a reused local server** - free suite + mounts `stackable-e2e-mu-plugin.php` for CDN fixtures. A Playground started + before that mount will not pick it up (`reuseExistingServer`). Kill the + process on port `9420` (or set `CI=1`) and re-run. Specs also mock the + Design Library REST responses in the browser as a fallback. +- **Settings / editor assets missing** - run `npm run build:e2e` (or + `build:e2e:premium`) so `dist/` exists for enqueue. +- **Premium Role Manager / DC missing** - ensure `pro__premium_only/` is present, + `STACKABLE_BUILD` is `premium`, and the mock MU-plugin is mounted. Kill any + stale Playground on port `9421` so the blueprint re-runs. + +## Dev Notes + +- Pattern mirrors [Cimo e2e](https://github.com/gambitph/Cimo/tree/master/e2e) + (Playground CLI + `@wordpress/e2e-test-utils-playwright`). +- Gutenberg e2e workflow: https://github.com/WordPress/gutenberg/blob/trunk/.github/workflows/end2end-test.yml diff --git a/e2e/setup/auth.js b/e2e/setup/auth.js deleted file mode 100644 index 31e3d9bc58..0000000000 --- a/e2e/setup/auth.js +++ /dev/null @@ -1,24 +0,0 @@ -import { test as setup, expect } from '@wordpress/e2e-test-utils-playwright' -// import '../support/env.js' - -const authFile = 'src/playwright/.auth/state.json' - -setup( 'authenticate', async ( { page } ) => { - // Setup the handler. - // await page.addLocatorHandler( page.getByText( 'Administration email verification' ), async () => { - // await page.getByRole( 'button', { name: 'The email is correct' } ).click() - // } ) - - await page.goto( '/wp-login.php' ) - await page.getByLabel( 'Username or Email Address' ).fill( process.env.WP_USERNAME ) - await page.getByLabel( 'Password', { exact: true } ).fill( process.env.WP_PASSWORD ) - await page.getByRole( 'button', { name: 'Log In' } ).click() - - // Handle if the page suddenly asks for email verification. - if ( await page.locator( 'Administration email verification' ).count() ) { - await page.getByRole( 'button', { name: 'The email is correct' } ).click() - } - - await page.waitForURL( '**/wp-admin/' ) - await page.context().storageState( { path: authFile } ) -} ) diff --git a/e2e/test-utils/mock-design-library.ts b/e2e/test-utils/mock-design-library.ts new file mode 100644 index 0000000000..6b93ded728 --- /dev/null +++ b/e2e/test-utils/mock-design-library.ts @@ -0,0 +1,40 @@ +/** + * Browser-side Design Library REST mocks for Playwright. + * + * Complements the PHP `pre_http_request` CDN mock in + * `e2e/config/stackable-e2e-mu-plugin.php`. Playwright routes still apply when + * a reused local Playground was started without that MU-plugin mounted. + */ +import fs from 'fs' +import path from 'path' +import type { Page } from '@playwright/test' + +const FIXTURES_DIR = path.join( __dirname, '../config/fixtures' ) + +const readFixture = ( name: string ) => + JSON.parse( fs.readFileSync( path.join( FIXTURES_DIR, name ), 'utf8' ) ) + +const patternsFixture = readFixture( 'design-library-patterns.json' ) +const pagesFixture = readFixture( 'design-library-pages.json' ) + +/** + * Intercept Design Library REST calls and fulfill with local fixtures. + * Response shape matches PHP: `{ v4: { [id]: design } }`. + * + * @param page + */ +export const mockDesignLibraryRest = async ( page: Page ) => { + await page.route( '**/stackable/v2/design_library/**', async route => { + const url = decodeURIComponent( route.request().url() ) + const isPages = /\/design_library\/pages(?:\/|$|\?)/.test( url ) + const body = { + v4: isPages ? pagesFixture : patternsFixture, + } + + await route.fulfill( { + status: 200, + contentType: 'application/json', + body: JSON.stringify( body ), + } ) + } ) +} diff --git a/e2e/test-utils/requestUtils.ts b/e2e/test-utils/requestUtils.ts index d53c48af58..21000c4d3e 100644 --- a/e2e/test-utils/requestUtils.ts +++ b/e2e/test-utils/requestUtils.ts @@ -1,10 +1,11 @@ import { request as playwrightRequest } from '@playwright/test' import { RequestUtils as BaseRequestUtils } from '@wordpress/e2e-test-utils-playwright' +const REST_NONCE_PATTERN = /^[a-zA-Z0-9_-]{2,64}$/ + class ExtendedRequestUtils extends BaseRequestUtils { /** - * Same as the upstream helper, but allows Local by Flywheel self-signed HTTPS certs. - * (Matches Interactions e2e/test-utils/requestUtils.ts.) + * Same as the upstream helper, with ignoreHTTPSErrors for local HTTPS overrides. * * @param options */ @@ -33,6 +34,16 @@ class ExtendedRequestUtils extends BaseRequestUtils { } } + // Drop a poisoned nonce (e.g. HTML from a Freemius activation redirect) + // so setupRest refreshes it instead of sending it as X-WP-Nonce. + if ( storageState?.nonce && ! REST_NONCE_PATTERN.test( String( storageState.nonce ).trim() ) ) { + storageState = { + ...storageState, + nonce: undefined, + rootURL: undefined, + } + } + const requestContext = await playwrightRequest.newContext( { baseURL, ignoreHTTPSErrors: true, @@ -50,6 +61,52 @@ class ExtendedRequestUtils extends BaseRequestUtils { } ) } + /** + * Upstream login() accepts any response body as the nonce. On Playground + + * Freemius, the first admin request after activation can 302 to Getting + * Started; following that redirect stores HTML as X-WP-Nonce and breaks REST. + * + * @param user + */ + login = async function( user = this.user ) { + let response = await this.request.post( 'wp-login.php', { + failOnStatusCode: true, + form: { + log: user.username, + pwd: user.password, + }, + } ) + await response.dispose() + + response = await this.request.get( 'wp-admin/admin-ajax.php?action=rest-nonce', { + failOnStatusCode: false, + maxRedirects: 0, + } ) + + if ( response.status() >= 300 && response.status() < 400 ) { + await response.dispose() + // Consume the one-shot activation redirect, then fetch the real nonce. + const bounced = await this.request.get( 'wp-admin/' ) + await bounced.dispose() + response = await this.request.get( 'wp-admin/admin-ajax.php?action=rest-nonce', { + failOnStatusCode: true, + } ) + } else if ( ! response.ok() ) { + const body = await response.text() + throw new Error( `rest-nonce failed (${ response.status() }): ${ body.slice( 0, 120 ) }` ) + } + + const nonce = ( await response.text() ).trim() + if ( ! REST_NONCE_PATTERN.test( nonce ) ) { + throw new Error( + `Invalid REST nonce (got ${ JSON.stringify( nonce.slice( 0, 80 ) ) }). ` + + 'Likely followed an admin redirect instead of admin-ajax rest-nonce.' + ) + } + + return nonce + } + getActivePlugins = async function() { const plugins : { [key: string]: any }[] = await this.rest( { path: '/wp/v2/plugins', diff --git a/e2e/test-utils/test.ts b/e2e/test-utils/test.ts index 0c1b9c0cb2..271a6bdc9e 100644 --- a/e2e/test-utils/test.ts +++ b/e2e/test-utils/test.ts @@ -28,9 +28,10 @@ const test = base.extend<{ // We want to make all REST API calls as authenticated users. requestUtils = await ExtendedRequestUtils.setup( { baseURL: process.env.WP_BASE_URL, + storageStatePath: process.env.STORAGE_STATE_PATH, user: { - username: process.env.WP_USERNAME, - password: process.env.WP_PASSWORD, + username: process.env.WP_USERNAME || 'admin', + password: process.env.WP_PASSWORD || 'password', }, } ) diff --git a/e2e/tests/design-library.spec.ts b/e2e/tests/design-library.spec.ts index 505bbaa2a0..7dcd767506 100644 --- a/e2e/tests/design-library.spec.ts +++ b/e2e/tests/design-library.spec.ts @@ -1,5 +1,6 @@ import { Page } from '@playwright/test' import { test, expect } from 'e2e/test-utils' +import { mockDesignLibraryRest } from 'e2e/test-utils/mock-design-library' const dismissTourIfPresent = async ( page: Page ) => { const tourClose = page.locator( '.ugb-tour-modal .components-modal__header button' ).first() @@ -35,7 +36,8 @@ const waitForDesignsToLoad = async ( page: Page ) => { test.describe( 'Design Library', () => { let pid = null - test.beforeEach( async ( { editor, admin } ) => { + test.beforeEach( async ( { editor, admin, page } ) => { + await mockDesignLibraryRest( page ) await admin.createNewPost( { title: 'Design Library Test' } ) await editor.saveDraft() const postQuery = new URL( editor.page.url() ).search @@ -43,7 +45,15 @@ test.describe( 'Design Library', () => { } ) test.afterEach( async ( { requestUtils } ) => { - await requestUtils.deletePost( pid ) + if ( ! pid ) { + return + } + try { + await requestUtils.deletePost( pid ) + } catch { + // Best-effort cleanup. Playground REST nonces can be unusable after + // long editor sessions; leftover drafts should not fail the suite. + } } ) test( 'opens and loads pattern designs without showing a blank library', async ( { diff --git a/e2e/tests/existing-blocks.spec.ts b/e2e/tests/existing-blocks.spec.ts index 2fb67bd07d..57610139f8 100644 --- a/e2e/tests/existing-blocks.spec.ts +++ b/e2e/tests/existing-blocks.spec.ts @@ -1,7 +1,24 @@ /* eslint-disable jest/no-disabled-tests */ +import fs from 'fs' +import path from 'path' import { test, expect } from 'e2e/test-utils' -test.skip( process.env.WP_TEST_POSTID === undefined, 'For existing test page only' ) +const readSeededPostId = () => { + if ( process.env.WP_TEST_POSTID ) { + return process.env.WP_TEST_POSTID + } + try { + const envPath = path.join( __dirname, '../.auth/test-env.json' ) + const env = JSON.parse( fs.readFileSync( envPath, 'utf8' ) ) + return env.WP_TEST_POSTID + } catch { + return undefined + } +} + +const postId = readSeededPostId() + +test.skip( postId === undefined, 'Existing Blocks post not seeded by Playground blueprint' ) test( 'Existing Stackable blocks should have no errors', async ( { admin, @@ -10,7 +27,7 @@ test( 'Existing Stackable blocks should have no errors', async ( { // Start listening on console errors for block validation const blockErrors = editor.getBlockErrors() - await admin.editPost( process.env.WP_TEST_POSTID ) + await admin.editPost( postId ) expect( blockErrors ).toHaveLength( 0 ) } ) diff --git a/package-lock.json b/package-lock.json index f6cf324cdb..18d27c6594 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "stackable", - "version": "3.19.0", + "version": "3.20.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "stackable", - "version": "3.19.0", + "version": "3.20.0", "license": "GPL-3.0", "dependencies": { "@wordpress/dom-ready": "^3.2.3", @@ -52,6 +52,7 @@ "@wordpress/jest-preset-default": "^7.0.5", "@wordpress/scripts": "^18.0.1", "@wordpress/stylelint-config": "^19.1.0", + "@wp-playground/cli": "^3.1.49", "acorn": "^6.4.2", "autoprefixer": "^10.4.0", "babel-core": "^7.0.0-bridge.0", @@ -62,7 +63,6 @@ "css-mqpacker": "^7.0.0", "cssnano": "^6.0.1", "delete-empty": "^3.0.0", - "dotenv": "^16.4.7", "eslint-plugin-compat": "^3.11.1", "eslint-plugin-import": "^2.22.1", "eslint-plugin-jest": "^22.21.0", @@ -3477,6 +3477,19 @@ "integrity": "sha512-n2RC9d6XatVbWFdHLimzzUJxJ1KY8LdjqrW6YvGPiRmsHkhOUx74/Ct10x5Yo7bC/Jvqx7cDEW8IMPv/+vwEzA==", "dev": true }, + "node_modules/@nodable/entities": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@nodable/entities/-/entities-3.0.0.tgz", + "integrity": "sha512-8L9xFeTYKhm49xfIypoe2W5wV1m/3Z58kT+7kR9A8OyFxcPduI4VmxaUMQyKYrRjUoLLSXv6EKKID5Tvj9cUVw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/nodable" + } + ], + "license": "MIT" + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -3512,6 +3525,577 @@ "node": ">= 8" } }, + "node_modules/@octokit/app": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@octokit/app/-/app-14.1.0.tgz", + "integrity": "sha512-g3uEsGOQCBl1+W1rgfwoRFUIR6PtvB2T1E4RpygeUU5LrLvlOqcxrt5lfykIeRpUPpupreGJUYl70fqMDXdTpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/auth-app": "^6.0.0", + "@octokit/auth-unauthenticated": "^5.0.0", + "@octokit/core": "^5.0.0", + "@octokit/oauth-app": "^6.0.0", + "@octokit/plugin-paginate-rest": "^9.0.0", + "@octokit/types": "^12.0.0", + "@octokit/webhooks": "^12.0.4" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/auth-app": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/@octokit/auth-app/-/auth-app-6.1.4.tgz", + "integrity": "sha512-QkXkSOHZK4dA5oUqY5Dk3S+5pN2s1igPjEASNQV8/vgJgW034fQWR16u7VsNOK/EljA00eyjYF5mWNxWKWhHRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/auth-oauth-app": "^7.1.0", + "@octokit/auth-oauth-user": "^4.1.0", + "@octokit/request": "^8.3.1", + "@octokit/request-error": "^5.1.0", + "@octokit/types": "^13.1.0", + "deprecation": "^2.3.1", + "lru-cache": "npm:@wolfy1339/lru-cache@^11.0.2-patch.1", + "universal-github-app-jwt": "^1.1.2", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/auth-app/node_modules/@octokit/openapi-types": { + "version": "24.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", + "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@octokit/auth-app/node_modules/@octokit/types": { + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", + "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^24.2.0" + } + }, + "node_modules/@octokit/auth-app/node_modules/lru-cache": { + "name": "@wolfy1339/lru-cache", + "version": "11.0.2-patch.1", + "resolved": "https://registry.npmjs.org/@wolfy1339/lru-cache/-/lru-cache-11.0.2-patch.1.tgz", + "integrity": "sha512-BgYZfL2ADCXKOw2wJtkM3slhHotawWkgIRRxq4wEybnZQPjvAp71SPX35xepMykTw8gXlzWcWPTY31hlbnRsDA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "18 >=18.20 || 20 || >=22" + } + }, + "node_modules/@octokit/auth-oauth-app": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-app/-/auth-oauth-app-7.1.0.tgz", + "integrity": "sha512-w+SyJN/b0l/HEb4EOPRudo7uUOSW51jcK1jwLa+4r7PA8FPFpoxEnHBHMITqCsc/3Vo2qqFjgQfz/xUUvsSQnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/auth-oauth-device": "^6.1.0", + "@octokit/auth-oauth-user": "^4.1.0", + "@octokit/request": "^8.3.1", + "@octokit/types": "^13.0.0", + "@types/btoa-lite": "^1.0.0", + "btoa-lite": "^1.0.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/auth-oauth-app/node_modules/@octokit/openapi-types": { + "version": "24.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", + "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@octokit/auth-oauth-app/node_modules/@octokit/types": { + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", + "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^24.2.0" + } + }, + "node_modules/@octokit/auth-oauth-device": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-device/-/auth-oauth-device-6.1.0.tgz", + "integrity": "sha512-FNQ7cb8kASufd6Ej4gnJ3f1QB5vJitkoV1O0/g6e6lUsQ7+VsSNRHRmFScN2tV4IgKA12frrr/cegUs0t+0/Lw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/oauth-methods": "^4.1.0", + "@octokit/request": "^8.3.1", + "@octokit/types": "^13.0.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/auth-oauth-device/node_modules/@octokit/openapi-types": { + "version": "24.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", + "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@octokit/auth-oauth-device/node_modules/@octokit/types": { + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", + "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^24.2.0" + } + }, + "node_modules/@octokit/auth-oauth-user": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-user/-/auth-oauth-user-4.1.0.tgz", + "integrity": "sha512-FrEp8mtFuS/BrJyjpur+4GARteUCrPeR/tZJzD8YourzoVhRics7u7we/aDcKv+yywRNwNi/P4fRi631rG/OyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/auth-oauth-device": "^6.1.0", + "@octokit/oauth-methods": "^4.1.0", + "@octokit/request": "^8.3.1", + "@octokit/types": "^13.0.0", + "btoa-lite": "^1.0.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/auth-oauth-user/node_modules/@octokit/openapi-types": { + "version": "24.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", + "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@octokit/auth-oauth-user/node_modules/@octokit/types": { + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", + "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^24.2.0" + } + }, + "node_modules/@octokit/auth-token": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz", + "integrity": "sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/auth-unauthenticated": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@octokit/auth-unauthenticated/-/auth-unauthenticated-5.0.1.tgz", + "integrity": "sha512-oxeWzmBFxWd+XolxKTc4zr+h3mt+yofn4r7OfoIkR/Cj/o70eEGmPsFbueyJE2iBAGpjgTnEOKM3pnuEGVmiqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/request-error": "^5.0.0", + "@octokit/types": "^12.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/core": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.2.2.tgz", + "integrity": "sha512-/g2d4sW9nUDJOMz3mabVQvOGhVa4e/BN/Um7yca9Bb2XTzPPnfTWHWQg+IsEYO7M3Vx+EXvaM/I2pJWIMun1bg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/auth-token": "^4.0.0", + "@octokit/graphql": "^7.1.0", + "@octokit/request": "^8.4.1", + "@octokit/request-error": "^5.1.1", + "@octokit/types": "^13.0.0", + "before-after-hook": "^2.2.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/core/node_modules/@octokit/openapi-types": { + "version": "24.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", + "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@octokit/core/node_modules/@octokit/types": { + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", + "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^24.2.0" + } + }, + "node_modules/@octokit/endpoint": { + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.6.tgz", + "integrity": "sha512-H1fNTMA57HbkFESSt3Y9+FBICv+0jFceJFPWDePYlR/iMGrwM5ph+Dd4XRQs+8X+PUFURLQgX9ChPfhJ/1uNQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/types": "^13.1.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/endpoint/node_modules/@octokit/openapi-types": { + "version": "24.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", + "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@octokit/endpoint/node_modules/@octokit/types": { + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", + "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^24.2.0" + } + }, + "node_modules/@octokit/graphql": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.1.1.tgz", + "integrity": "sha512-3mkDltSfcDUoa176nlGoA32RGjeWjl3K7F/BwHwRMJUW/IteSa4bnSV8p2ThNkcIcZU2umkZWxwETSSCJf2Q7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/request": "^8.4.1", + "@octokit/types": "^13.0.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/graphql/node_modules/@octokit/openapi-types": { + "version": "24.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", + "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@octokit/graphql/node_modules/@octokit/types": { + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", + "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^24.2.0" + } + }, + "node_modules/@octokit/oauth-app": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@octokit/oauth-app/-/oauth-app-6.1.0.tgz", + "integrity": "sha512-nIn/8eUJ/BKUVzxUXd5vpzl1rwaVxMyYbQkNZjHrF7Vk/yu98/YDF/N2KeWO7uZ0g3b5EyiFXFkZI8rJ+DH1/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/auth-oauth-app": "^7.0.0", + "@octokit/auth-oauth-user": "^4.0.0", + "@octokit/auth-unauthenticated": "^5.0.0", + "@octokit/core": "^5.0.0", + "@octokit/oauth-authorization-url": "^6.0.2", + "@octokit/oauth-methods": "^4.0.0", + "@types/aws-lambda": "^8.10.83", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/oauth-authorization-url": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@octokit/oauth-authorization-url/-/oauth-authorization-url-6.0.2.tgz", + "integrity": "sha512-CdoJukjXXxqLNK4y/VOiVzQVjibqoj/xHgInekviUJV73y/BSIcwvJ/4aNHPBPKcPWFnd4/lO9uqRV65jXhcLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/oauth-methods": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@octokit/oauth-methods/-/oauth-methods-4.1.0.tgz", + "integrity": "sha512-4tuKnCRecJ6CG6gr0XcEXdZtkTDbfbnD5oaHBmLERTjTMZNi2CbfEHZxPU41xXLDG4DfKf+sonu00zvKI9NSbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/oauth-authorization-url": "^6.0.2", + "@octokit/request": "^8.3.1", + "@octokit/request-error": "^5.1.0", + "@octokit/types": "^13.0.0", + "btoa-lite": "^1.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/oauth-methods/node_modules/@octokit/openapi-types": { + "version": "24.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", + "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@octokit/oauth-methods/node_modules/@octokit/types": { + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", + "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^24.2.0" + } + }, + "node_modules/@octokit/openapi-types": { + "version": "20.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-20.0.0.tgz", + "integrity": "sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@octokit/plugin-paginate-graphql": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-graphql/-/plugin-paginate-graphql-4.0.1.tgz", + "integrity": "sha512-R8ZQNmrIKKpHWC6V2gum4x9LG2qF1RxRjo27gjQcG3j+vf2tLsEfE7I/wRWEPzYMaenr1M+qDAtNcwZve1ce1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@octokit/core": ">=5" + } + }, + "node_modules/@octokit/plugin-paginate-rest": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.2.2.tgz", + "integrity": "sha512-u3KYkGF7GcZnSD/3UP0S7K5XUFT2FkOQdcfXZGZQPGv3lm4F2Xbf71lvjldr8c1H3nNbF+33cLEkWYbokGWqiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/types": "^12.6.0" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@octokit/core": "5" + } + }, + "node_modules/@octokit/plugin-rest-endpoint-methods": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-10.4.1.tgz", + "integrity": "sha512-xV1b+ceKV9KytQe3zCVqjg+8GTGfDYwaT1ATU5isiUyVtlVAO3HNdzpS4sr4GBx4hxQ46s7ITtZrAsxG22+rVg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/types": "^12.6.0" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@octokit/core": "5" + } + }, + "node_modules/@octokit/plugin-retry": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-6.1.0.tgz", + "integrity": "sha512-WrO3bvq4E1Xh1r2mT9w6SDFg01gFmP81nIG77+p/MqW1JeXXgL++6umim3t6x0Zj5pZm3rXAN+0HEjmmdhIRig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/request-error": "^5.0.0", + "@octokit/types": "^13.0.0", + "bottleneck": "^2.15.3" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@octokit/core": "5" + } + }, + "node_modules/@octokit/plugin-retry/node_modules/@octokit/openapi-types": { + "version": "24.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", + "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@octokit/plugin-retry/node_modules/@octokit/types": { + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", + "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^24.2.0" + } + }, + "node_modules/@octokit/plugin-throttling": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-8.2.0.tgz", + "integrity": "sha512-nOpWtLayKFpgqmgD0y3GqXafMFuKcA4tRPZIfu7BArd2lEZeb1988nhWhwx4aZWmjDmUfdgVf7W+Tt4AmvRmMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/types": "^12.2.0", + "bottleneck": "^2.15.3" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@octokit/core": "^5.0.0" + } + }, + "node_modules/@octokit/request": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.4.1.tgz", + "integrity": "sha512-qnB2+SY3hkCmBxZsR/MPCybNmbJe4KAlfWErXq+rBKkQJlbjdJeS85VI9r8UqeLYLvnAenU8Q1okM/0MBsAGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/endpoint": "^9.0.6", + "@octokit/request-error": "^5.1.1", + "@octokit/types": "^13.1.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/request-error": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.1.1.tgz", + "integrity": "sha512-v9iyEQJH6ZntoENr9/yXxjuezh4My67CBSu9r6Ve/05Iu5gNgnisNWOsoJHTP6k0Rr0+HQIpnH+kyammu90q/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/types": "^13.1.0", + "deprecation": "^2.0.0", + "once": "^1.4.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/request-error/node_modules/@octokit/openapi-types": { + "version": "24.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", + "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@octokit/request-error/node_modules/@octokit/types": { + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", + "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^24.2.0" + } + }, + "node_modules/@octokit/request/node_modules/@octokit/openapi-types": { + "version": "24.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", + "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@octokit/request/node_modules/@octokit/types": { + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", + "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^24.2.0" + } + }, + "node_modules/@octokit/types": { + "version": "12.6.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.6.0.tgz", + "integrity": "sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^20.0.0" + } + }, + "node_modules/@octokit/webhooks": { + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/@octokit/webhooks/-/webhooks-12.3.2.tgz", + "integrity": "sha512-exj1MzVXoP7xnAcAB3jZ97pTvVPkQF9y6GA/dvYC47HV7vLv+24XRS6b/v/XnyikpEuvMhugEXdGtAlU086WkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/request-error": "^5.0.0", + "@octokit/webhooks-methods": "^4.1.0", + "@octokit/webhooks-types": "7.6.1", + "aggregate-error": "^3.1.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/webhooks-methods": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@octokit/webhooks-methods/-/webhooks-methods-4.1.0.tgz", + "integrity": "sha512-zoQyKw8h9STNPqtm28UGOYFE7O6D4Il8VJwhAtMHFt2C4L0VQT1qGKLeefUOqHNs1mNRYSadVv7x0z8U2yyeWQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/webhooks-types": { + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/@octokit/webhooks-types/-/webhooks-types-7.6.1.tgz", + "integrity": "sha512-S8u2cJzklBC0FgTwWVLaM8tMrDuDMVE4xiTK4EYXM9GntyvrdbSoxqDQa+Fh57CCNApyIpyeqPhhFEmHPfrXgw==", + "dev": true, + "license": "MIT" + }, "node_modules/@paulirish/trace_engine": { "version": "0.0.39", "resolved": "https://registry.npmjs.org/@paulirish/trace_engine/-/trace_engine-0.0.39.tgz", @@ -3521,6 +4105,521 @@ "third-party-web": "latest" } }, + "node_modules/@php-wasm/cli-util": { + "version": "3.1.49", + "resolved": "https://registry.npmjs.org/@php-wasm/cli-util/-/cli-util-3.1.49.tgz", + "integrity": "sha512-JD/Gsvv2ZL3XfanCUJ2S3gTRiICxbSMy0xhhjGxDPxQpOuhtzeRNzD412ZQmgGAimr0hfZLj/dL9DNCNOUCjAw==", + "dev": true, + "license": "GPL-2.0-or-later", + "dependencies": { + "@php-wasm/util": "3.1.49", + "fast-xml-parser": "^5.8.0", + "jsonc-parser": "3.3.1" + }, + "engines": { + "node": ">=20.10.0", + "npm": ">=10.2.3" + } + }, + "node_modules/@php-wasm/cli-util/node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@php-wasm/logger": { + "version": "3.1.49", + "resolved": "https://registry.npmjs.org/@php-wasm/logger/-/logger-3.1.49.tgz", + "integrity": "sha512-/RJiOaXXfxNxIuw2zNBPGl84T2kTiQ/61k1uvTMpkx6Jop+jvhxy+MUHql8CKbos5osTHiXp58G/NyR8Z1775w==", + "dev": true, + "license": "GPL-2.0-or-later", + "engines": { + "node": ">=20.10.0", + "npm": ">=10.2.3" + } + }, + "node_modules/@php-wasm/node": { + "version": "3.1.49", + "resolved": "https://registry.npmjs.org/@php-wasm/node/-/node-3.1.49.tgz", + "integrity": "sha512-r2kvEFMb6eiljNUWDurjugyTaz3tKBQeAual4pAQuOSoZoHN6hZ175Fj5MIIrJvJwY+LDhbukKCAQ0cU1Q8zow==", + "dev": true, + "license": "GPL-2.0-or-later", + "dependencies": { + "@php-wasm/cli-util": "3.1.49", + "@php-wasm/logger": "3.1.49", + "@php-wasm/node-5-2": "3.1.49", + "@php-wasm/node-7-4": "3.1.49", + "@php-wasm/node-8-0": "3.1.49", + "@php-wasm/node-8-1": "3.1.49", + "@php-wasm/node-8-2": "3.1.49", + "@php-wasm/node-8-3": "3.1.49", + "@php-wasm/node-8-4": "3.1.49", + "@php-wasm/node-8-5": "3.1.49", + "@php-wasm/universal": "3.1.49", + "@php-wasm/util": "3.1.49", + "fs-ext-extra-prebuilt": "2.2.7", + "wasm-feature-detect": "1.8.0", + "ws": "8.21.0" + }, + "engines": { + "node": ">=20.10.0", + "npm": ">=10.2.3" + } + }, + "node_modules/@php-wasm/node-5-2": { + "version": "3.1.49", + "resolved": "https://registry.npmjs.org/@php-wasm/node-5-2/-/node-5-2-3.1.49.tgz", + "integrity": "sha512-rEixe4llnrSvRaDi5snANBUfAjgCth30doXdYYKfvDSoSW3+KGO0OQif2PgZ3pXM2xGLpE5jB6TSEg8oHUbZzw==", + "dev": true, + "license": "GPL-2.0-or-later", + "dependencies": { + "@php-wasm/universal": "3.1.49", + "wasm-feature-detect": "1.8.0" + }, + "engines": { + "node": ">=20.10.0", + "npm": ">=10.2.3" + } + }, + "node_modules/@php-wasm/node-7-4": { + "version": "3.1.49", + "resolved": "https://registry.npmjs.org/@php-wasm/node-7-4/-/node-7-4-3.1.49.tgz", + "integrity": "sha512-q/ZiCSg0uQdm/rcsfUosQgTZQck2Fff4RrR7xIrK3OomZiT/xq0x5RSbWFMI7Pr9CgOuACT7c9H2Vmwl5U487w==", + "dev": true, + "license": "GPL-2.0-or-later", + "dependencies": { + "@php-wasm/universal": "3.1.49", + "wasm-feature-detect": "1.8.0" + }, + "engines": { + "node": ">=20.10.0", + "npm": ">=10.2.3" + } + }, + "node_modules/@php-wasm/node-8-0": { + "version": "3.1.49", + "resolved": "https://registry.npmjs.org/@php-wasm/node-8-0/-/node-8-0-3.1.49.tgz", + "integrity": "sha512-7WiRXRc20WhLVZp6AsBjYAOSx0ZXVfVSxiCcSyPfTwtFUBg6u8nZK12Yh28PLLLXXFCBIMV//AJclxyqecx3KA==", + "dev": true, + "license": "GPL-2.0-or-later", + "dependencies": { + "@php-wasm/universal": "3.1.49", + "wasm-feature-detect": "1.8.0" + }, + "engines": { + "node": ">=20.10.0", + "npm": ">=10.2.3" + } + }, + "node_modules/@php-wasm/node-8-1": { + "version": "3.1.49", + "resolved": "https://registry.npmjs.org/@php-wasm/node-8-1/-/node-8-1-3.1.49.tgz", + "integrity": "sha512-VryPbG+4wbvcasnyDl8sqMiixrZR95AYzKVCu4KnUfujkyCfG1mfDzw5SJ5dO4/U21HWCL80NZVNr7RmxMAv1w==", + "dev": true, + "license": "GPL-2.0-or-later", + "dependencies": { + "@php-wasm/universal": "3.1.49", + "wasm-feature-detect": "1.8.0" + }, + "engines": { + "node": ">=20.10.0", + "npm": ">=10.2.3" + } + }, + "node_modules/@php-wasm/node-8-2": { + "version": "3.1.49", + "resolved": "https://registry.npmjs.org/@php-wasm/node-8-2/-/node-8-2-3.1.49.tgz", + "integrity": "sha512-rDG4H5CCWhqUv5k1WWFI2C4JAjB77PpxcRBi9Ca2IlBGEZ8fXuvMQuAQY6h8YI5I/MuUcLMhCIzJ9bG6Vs6yZg==", + "dev": true, + "license": "GPL-2.0-or-later", + "dependencies": { + "@php-wasm/universal": "3.1.49", + "wasm-feature-detect": "1.8.0" + }, + "engines": { + "node": ">=20.10.0", + "npm": ">=10.2.3" + } + }, + "node_modules/@php-wasm/node-8-3": { + "version": "3.1.49", + "resolved": "https://registry.npmjs.org/@php-wasm/node-8-3/-/node-8-3-3.1.49.tgz", + "integrity": "sha512-11xU6CF9I8dsw8OOZalYqCoHekbqV+h6AVv0O6wuKJGL+cOPGyKkE0kXmbSOl0/lROn7wxmVH/vnCTbr2A+YRw==", + "dev": true, + "license": "GPL-2.0-or-later", + "dependencies": { + "@php-wasm/universal": "3.1.49", + "wasm-feature-detect": "1.8.0" + }, + "engines": { + "node": ">=20.10.0", + "npm": ">=10.2.3" + } + }, + "node_modules/@php-wasm/node-8-4": { + "version": "3.1.49", + "resolved": "https://registry.npmjs.org/@php-wasm/node-8-4/-/node-8-4-3.1.49.tgz", + "integrity": "sha512-mAJgfE/NxYfW56fhg99haR5dfADD2cLDSur1RfOM/oSiZlBUv/e7pILbupYH+mvrlBdcuQ7Dt5+ACwMlMqVqUw==", + "dev": true, + "license": "GPL-2.0-or-later", + "dependencies": { + "@php-wasm/universal": "3.1.49", + "wasm-feature-detect": "1.8.0" + }, + "engines": { + "node": ">=20.10.0", + "npm": ">=10.2.3" + } + }, + "node_modules/@php-wasm/node-8-5": { + "version": "3.1.49", + "resolved": "https://registry.npmjs.org/@php-wasm/node-8-5/-/node-8-5-3.1.49.tgz", + "integrity": "sha512-9bFS1V5NaC5VoUU85hh0FqLDYKe3IK3hcvdlxxbqXHG+nMhqZmvFmuYPn2c8DNVapoaV3bTQpyZY3jBeTFgwAw==", + "dev": true, + "license": "GPL-2.0-or-later", + "dependencies": { + "@php-wasm/universal": "3.1.49", + "wasm-feature-detect": "1.8.0" + }, + "engines": { + "node": ">=20.10.0", + "npm": ">=10.2.3" + } + }, + "node_modules/@php-wasm/node/node_modules/ws": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", + "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", + "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/@php-wasm/progress": { + "version": "3.1.49", + "resolved": "https://registry.npmjs.org/@php-wasm/progress/-/progress-3.1.49.tgz", + "integrity": "sha512-krTHFF0C/nNkTBKpU98YESh+DSLWtfAKGqou2RnXBls81Y3SJtdpbSjI2UW5HynpVEnp7ZZRZjAhkL/U99LjtA==", + "dev": true, + "license": "GPL-2.0-or-later", + "dependencies": { + "@php-wasm/logger": "3.1.49" + }, + "engines": { + "node": ">=20.10.0", + "npm": ">=10.2.3" + } + }, + "node_modules/@php-wasm/scopes": { + "version": "3.1.49", + "resolved": "https://registry.npmjs.org/@php-wasm/scopes/-/scopes-3.1.49.tgz", + "integrity": "sha512-Dc66sU3t3SYvEXNSyKivVWvzQsMyiR0kgmpYiY7RfrfeYytv2fM4DpnGNGUCWOv3aKDUDmZZIHituyMvMmqLNA==", + "dev": true, + "license": "GPL-2.0-or-later", + "engines": { + "node": ">=20.10.0", + "npm": ">=10.2.3" + } + }, + "node_modules/@php-wasm/stream-compression": { + "version": "3.1.49", + "resolved": "https://registry.npmjs.org/@php-wasm/stream-compression/-/stream-compression-3.1.49.tgz", + "integrity": "sha512-o/CS8simUWDqT/F6hhKrOiUp4war8gRAJEz9TvjZVuSBunm8qxmjDRVgx6SYBDjUXKNoFPk7VkqwiP2mzAwGkw==", + "dev": true, + "license": "GPL-2.0-or-later", + "dependencies": { + "@php-wasm/util": "3.1.49" + } + }, + "node_modules/@php-wasm/universal": { + "version": "3.1.49", + "resolved": "https://registry.npmjs.org/@php-wasm/universal/-/universal-3.1.49.tgz", + "integrity": "sha512-h0uDqNoR7n0m66RVWLSeENwWdUgaPQGhmJ//AVTg6TfgN9+iyYx246uD6V1R3QNJe0pkEdMzFgL+GWbKW5D5ww==", + "dev": true, + "license": "GPL-2.0-or-later", + "dependencies": { + "@php-wasm/logger": "3.1.49", + "@php-wasm/progress": "3.1.49", + "@php-wasm/stream-compression": "3.1.49", + "@php-wasm/util": "3.1.49", + "ini": "4.1.2" + }, + "engines": { + "node": ">=20.10.0", + "npm": ">=10.2.3" + } + }, + "node_modules/@php-wasm/universal/node_modules/ini": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.2.tgz", + "integrity": "sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@php-wasm/util": { + "version": "3.1.49", + "resolved": "https://registry.npmjs.org/@php-wasm/util/-/util-3.1.49.tgz", + "integrity": "sha512-5xU6CAx2AKNpGcEruBAWsGdOwdiBI4v4p7T19MxPbBnw2v58HxY9sZqBFZMkyBkiov+Ke2ahKVAqQQeBkR7O0g==", + "dev": true, + "engines": { + "node": ">=20.10.0", + "npm": ">=10.2.3" + } + }, + "node_modules/@php-wasm/web-service-worker": { + "version": "3.1.49", + "resolved": "https://registry.npmjs.org/@php-wasm/web-service-worker/-/web-service-worker-3.1.49.tgz", + "integrity": "sha512-i9wU3CWLeUYd16RSihcbv5+rty85E6C2VmtkKhbJq2SPip3K6g77yzCC89bcjsQmtSBFRS0c9BcdLVRb9SMP8A==", + "dev": true, + "license": "GPL-2.0-or-later", + "dependencies": { + "@php-wasm/scopes": "3.1.49", + "@php-wasm/universal": "3.1.49" + }, + "engines": { + "node": ">=20.10.0", + "npm": ">=10.2.3" + } + }, + "node_modules/@php-wasm/xdebug-bridge": { + "version": "3.1.49", + "resolved": "https://registry.npmjs.org/@php-wasm/xdebug-bridge/-/xdebug-bridge-3.1.49.tgz", + "integrity": "sha512-0nNzvdCm33MWZDzeayNR3Y3CkRRNk0Ex1wJOTPvxubdsizRRL2sD8kB6Or0x781Gi8kkx79/762dvfq/c7EvdQ==", + "dev": true, + "license": "GPL-2.0-or-later", + "dependencies": { + "@php-wasm/logger": "3.1.49", + "@php-wasm/universal": "3.1.49", + "ws": "8.21.0", + "xml2js": "0.6.2", + "yargs": "17.7.2" + }, + "bin": { + "xdebug-bridge": "xdebug-bridge.js" + }, + "engines": { + "node": ">=20.10.0", + "npm": ">=10.2.3" + } + }, + "node_modules/@php-wasm/xdebug-bridge/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/@php-wasm/xdebug-bridge/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/@php-wasm/xdebug-bridge/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/@php-wasm/xdebug-bridge/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/@php-wasm/xdebug-bridge/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/@php-wasm/xdebug-bridge/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/@php-wasm/xdebug-bridge/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/@php-wasm/xdebug-bridge/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/@php-wasm/xdebug-bridge/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/@php-wasm/xdebug-bridge/node_modules/ws": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", + "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", + "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/@php-wasm/xdebug-bridge/node_modules/xml2js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", + "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", + "dev": true, + "license": "MIT", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/@php-wasm/xdebug-bridge/node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@php-wasm/xdebug-bridge/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/@php-wasm/xdebug-bridge/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/@php-wasm/xdebug-bridge/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/@playwright/test": { "version": "1.49.1", "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.49.1.tgz", @@ -4595,6 +5694,13 @@ "integrity": "sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig==", "dev": true }, + "node_modules/@types/aws-lambda": { + "version": "8.10.162", + "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.162.tgz", + "integrity": "sha512-Fn658grtLOci1oxi1391vvDWJRKNGWRSqfxRkmN/Iy3c0tQH1USMKEXcPYHLvope+ZgTFocx9FRQJx1muBL6qw==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/babel__core": { "version": "7.1.16", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.16.tgz", @@ -4636,6 +5742,13 @@ "@babel/types": "^7.3.0" } }, + "node_modules/@types/btoa-lite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/btoa-lite/-/btoa-lite-1.0.2.tgz", + "integrity": "sha512-ZYbcE2x7yrvNFJiU7xJGrpF/ihpkM7zKgw8bha3LNJSesvTtUNxbpzaT7WXBIryf6jovisrxTBvymxMeLLj1Mg==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/cacheable-request": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz", @@ -4901,6 +6014,17 @@ "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", "dev": true }, + "node_modules/@types/jsonwebtoken": { + "version": "9.0.10", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.10.tgz", + "integrity": "sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/ms": "*", + "@types/node": "*" + } + }, "node_modules/@types/keyv": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.3.tgz", @@ -4943,6 +6067,13 @@ "integrity": "sha512-zTqjvgCUT5EoXqbqmd8iJMb4NJqyV/V7pK7AIKq7qcaAsJIpGlTVJS1HQM6YkdHCdnkNSbhcQI7MXYxFfE3iCA==", "dev": true }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/node": { "version": "22.10.2", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.2.tgz", @@ -7604,6 +8735,340 @@ "node": ">=12" } }, + "node_modules/@wp-playground/blueprints": { + "version": "3.1.49", + "resolved": "https://registry.npmjs.org/@wp-playground/blueprints/-/blueprints-3.1.49.tgz", + "integrity": "sha512-8tAAviJQS8SUi+Ndz198q90/53FEGKoHMarpbgvZ9Q12A+RvIG3jVRQDiQ+wvRWYfhJMMXmb6W4j9bwZX7/fKw==", + "dev": true, + "dependencies": { + "@php-wasm/logger": "3.1.49", + "@php-wasm/progress": "3.1.49", + "@php-wasm/stream-compression": "3.1.49", + "@php-wasm/universal": "3.1.49", + "@php-wasm/util": "3.1.49", + "@php-wasm/web-service-worker": "3.1.49", + "@wp-playground/common": "3.1.49", + "@wp-playground/storage": "3.1.49", + "@wp-playground/wordpress": "3.1.49", + "ajv": "8.18.0" + }, + "engines": { + "node": ">=20.10.0", + "npm": ">=10.2.3" + } + }, + "node_modules/@wp-playground/blueprints/node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@wp-playground/blueprints/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/@wp-playground/cli": { + "version": "3.1.49", + "resolved": "https://registry.npmjs.org/@wp-playground/cli/-/cli-3.1.49.tgz", + "integrity": "sha512-JVo1xFtSGgug15PCWy7Qiajmwt4DondaRuhCL/jZe/s0tDTZ+LDM6r9/F6A6bHKqfyGUYd06NCuk0H7G0gOr2w==", + "dev": true, + "license": "GPL-2.0-or-later", + "dependencies": { + "@php-wasm/cli-util": "3.1.49", + "@php-wasm/logger": "3.1.49", + "@php-wasm/node": "3.1.49", + "@php-wasm/progress": "3.1.49", + "@php-wasm/universal": "3.1.49", + "@php-wasm/util": "3.1.49", + "@php-wasm/xdebug-bridge": "3.1.49", + "@wp-playground/blueprints": "3.1.49", + "@wp-playground/common": "3.1.49", + "@wp-playground/storage": "3.1.49", + "@wp-playground/tools": "3.1.49", + "@wp-playground/wordpress": "3.1.49", + "express": "4.22.2", + "fs-extra": "11.1.1", + "tmp-promise": "3.0.3", + "wasm-feature-detect": "1.8.0", + "yargs": "17.7.2" + }, + "bin": { + "wp-playground-cli": "wp-playground.js" + } + }, + "node_modules/@wp-playground/cli/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/@wp-playground/cli/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/@wp-playground/cli/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/@wp-playground/cli/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/@wp-playground/cli/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/@wp-playground/cli/node_modules/fs-extra": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", + "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@wp-playground/cli/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/@wp-playground/cli/node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@wp-playground/cli/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/@wp-playground/cli/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/@wp-playground/cli/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/@wp-playground/cli/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/@wp-playground/cli/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/@wp-playground/cli/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/@wp-playground/cli/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/@wp-playground/common": { + "version": "3.1.49", + "resolved": "https://registry.npmjs.org/@wp-playground/common/-/common-3.1.49.tgz", + "integrity": "sha512-Zps9DvdO/bbejcHLjc6m8Mae7Aj60N7lEavf3OXs0NppGk3FAdora1FQ9S85Mah2MK70X7EJCyHzinuCknzzhg==", + "dev": true, + "license": "GPL-2.0-or-later", + "dependencies": { + "@php-wasm/universal": "3.1.49", + "@php-wasm/util": "3.1.49" + }, + "engines": { + "node": ">=20.10.0", + "npm": ">=10.2.3" + } + }, + "node_modules/@wp-playground/storage": { + "version": "3.1.49", + "resolved": "https://registry.npmjs.org/@wp-playground/storage/-/storage-3.1.49.tgz", + "integrity": "sha512-QJOAjduNWlFuTAeM0Ns+JmOP0d18lP4fMndcDbnHTbsHzbc0HdFJClYTZqzughipkcK93nnCG5sj3WUn6Qp9oQ==", + "dev": true, + "license": "GPL-2.0-or-later", + "dependencies": { + "@php-wasm/stream-compression": "3.1.49", + "@php-wasm/universal": "3.1.49", + "@php-wasm/util": "3.1.49", + "@zip.js/zip.js": "2.7.57", + "isomorphic-git": "1.37.6", + "octokit": "3.1.2", + "pako": "^1.0.10", + "sha.js": "2.4.12" + } + }, + "node_modules/@wp-playground/tools": { + "version": "3.1.49", + "resolved": "https://registry.npmjs.org/@wp-playground/tools/-/tools-3.1.49.tgz", + "integrity": "sha512-mR7Aer7f9kdR8v7oj012G19OuTjUH9FA2WchRjlyEB6K1X+dvNwCRivI9AqgGtyNUVBeIO2xguDroQGD0b49LQ==", + "dev": true, + "license": "GPL-2.0-or-later", + "dependencies": { + "@php-wasm/util": "3.1.49", + "@wp-playground/blueprints": "3.1.49" + }, + "engines": { + "node": ">=20.10.0", + "npm": ">=10.2.3" + } + }, + "node_modules/@wp-playground/wordpress": { + "version": "3.1.49", + "resolved": "https://registry.npmjs.org/@wp-playground/wordpress/-/wordpress-3.1.49.tgz", + "integrity": "sha512-VfDtC8gInOomj6RBPUiX3m+Kuml8tJL4HeCnoUjIRfLjikYFKG7ye7VCfvwK0JxqhCHIcBOzV31tzmtzdA8LzA==", + "dev": true, + "license": "GPL-2.0-or-later", + "dependencies": { + "@php-wasm/logger": "3.1.49", + "@php-wasm/universal": "3.1.49", + "@php-wasm/util": "3.1.49", + "@wp-playground/common": "3.1.49", + "zstddec": "^0.2.0" + }, + "engines": { + "node": ">=20.10.0", + "npm": ">=10.2.3" + } + }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", @@ -7616,12 +9081,51 @@ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true }, + "node_modules/@zip.js/zip.js": { + "version": "2.7.57", + "resolved": "https://registry.npmjs.org/@zip.js/zip.js/-/zip.js-2.7.57.tgz", + "integrity": "sha512-BtonQ1/jDnGiMed6OkV6rZYW78gLmLswkHOzyMrMb+CAR7CZO8phOHO6c2qw6qb1g1betN7kwEHhhZk30dv+NA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "bun": ">=0.7.0", + "deno": ">=1.0.0", + "node": ">=16.5.0" + } + }, "node_modules/abab": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", "dev": true }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dev": true, + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/acorn": { "version": "6.4.2", "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", @@ -7909,6 +9413,19 @@ "node": ">= 8" } }, + "node_modules/anynum": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/anynum/-/anynum-1.0.1.tgz", + "integrity": "sha512-N6//FLET/tXYNM/F6ABca1oH6fWB+KlTt909Le28WMDBk8oaT4vY17DCrwg2MvmuqUKt3Ni4N5dGJ/EoBgcO6A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, "node_modules/append-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", @@ -8071,6 +9588,13 @@ "node": ">=0.10.0" } }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true, + "license": "MIT" + }, "node_modules/array-includes": { "version": "3.1.4", "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz", @@ -8343,6 +9867,13 @@ "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", "dev": true }, + "node_modules/async-lock": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.4.1.tgz", + "integrity": "sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==", + "dev": true, + "license": "MIT" + }, "node_modules/async-settle": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz", @@ -8406,6 +9937,22 @@ "integrity": "sha512-5yxLQ22O0fCRGoxGfeLSNt3J8LB1v+umtpMnPW6XjkTWXKoN0AmXAIhelJcDtFT/Y/wYWmfE+oqU10Q0b8FhaQ==", "dev": true }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/aws-sdk": { "version": "2.1034.0", "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1034.0.tgz", @@ -9050,6 +10597,13 @@ "node": ">=10.0.0" } }, + "node_modules/before-after-hook": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", + "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", + "dev": true, + "license": "Apache-2.0" + }, "node_modules/big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -9487,6 +11041,87 @@ "safe-json-parse": "~1.0.1" } }, + "node_modules/body-parser": { + "version": "1.20.6", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.6.tgz", + "integrity": "sha512-p5tAzS57i5MV9fZFDj9LeIiTZEufbSe2eDozP+ElheSUq1m74CRq1jI4mYNDdVs9vQztXFLuk/Gd6BWTdwRJ5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.15.1", + "raw-body": "~2.5.3", + "type-is": "~1.6.18", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/body-parser/node_modules/raw-body": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/body-scroll-lock": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/body-scroll-lock/-/body-scroll-lock-3.1.5.tgz", @@ -9499,6 +11134,13 @@ "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", "dev": true }, + "node_modules/bottleneck": { + "version": "2.19.5", + "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz", + "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==", + "dev": true, + "license": "MIT" + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -9570,6 +11212,13 @@ "node-int64": "^0.4.0" } }, + "node_modules/btoa-lite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/btoa-lite/-/btoa-lite-1.0.0.tgz", + "integrity": "sha512-gvW7InbIyF8AicrqWoptdW08pUxuhq8BEgowNajy9RhiE86fmGAGl+bLKo6oB8QP0CkqHLowfN0oJdKC/J6LbA==", + "dev": true, + "license": "MIT" + }, "node_modules/buffer": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", @@ -9628,6 +11277,13 @@ "node": ">=0.4.0" } }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "dev": true, + "license": "BSD-3-Clause" + }, "node_modules/buffer-fill": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", @@ -9753,13 +11409,50 @@ } }, "node_modules/call-bind": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "get-intrinsic": "^1.3.0", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "dev": true, + "license": "MIT", "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -10359,6 +12052,13 @@ "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz", "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==" }, + "node_modules/clean-git-ref": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/clean-git-ref/-/clean-git-ref-2.0.1.tgz", + "integrity": "sha512-bLSptAy2P0s6hU4PzuIMKmMJJSE6gLXGH1cntDu7bWJUksvuM+7ReOK61mozULErYvP6a15rnYl0zFDef+pyPw==", + "dev": true, + "license": "Apache-2.0" + }, "node_modules/clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", @@ -11045,17 +12745,49 @@ } }, "node_modules/content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dev": true, + "license": "MIT", "dependencies": { - "safe-buffer": "5.1.2" + "safe-buffer": "5.2.1" }, "engines": { "node": ">= 0.6" } }, + "node_modules/content-disposition/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "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/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/continuable-cache": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/continuable-cache/-/continuable-cache-0.3.1.tgz", @@ -11071,6 +12803,23 @@ "safe-buffer": "~5.1.1" } }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", + "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", + "dev": true, + "license": "MIT" + }, "node_modules/copy-descriptor": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", @@ -11169,6 +12918,19 @@ "resolved": "https://registry.npmjs.org/counterup2/-/counterup2-2.0.2.tgz", "integrity": "sha512-+drmqOOcOa17KJG9o5+wGuEgLVh4wdb2pkpGlCu3MtQ2idB73V8yJEb8WyINZ1+Fjy7dLiWKa0wihvYzk/n32A==" }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", @@ -12079,6 +13841,24 @@ "node": ">=10" } }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/define-lazy-prop": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", @@ -12277,6 +14057,34 @@ "rimraf": "bin.js" } }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/deprecation": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", + "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, "node_modules/detect-file": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", @@ -12319,6 +14127,13 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/diff3": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/diff3/-/diff3-0.0.3.tgz", + "integrity": "sha512-iSq8ngPOt0K53A6eVr4d5Kn6GNrM2nQZtC740pzIriHtn4pOQ2lyzEXQMBeVcWERN0ye7fhBsk9PbLLQOnUx/g==", + "dev": true, + "license": "MIT" + }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -12685,18 +14500,6 @@ "node": ">=8" } }, - "node_modules/dotenv": { - "version": "16.4.7", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", - "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, "node_modules/download": { "version": "6.2.5", "resolved": "https://registry.npmjs.org/download/-/download-6.2.5.tgz", @@ -12837,6 +14640,21 @@ "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "dev": true }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/duplexer": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", @@ -12928,6 +14746,23 @@ "object.defaults": "^1.1.0" } }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true, + "license": "MIT" + }, "node_modules/electron-to-chromium": { "version": "1.4.392", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.392.tgz", @@ -12979,6 +14814,16 @@ "node": ">= 0.10.0" } }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/encoding": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", @@ -13170,12 +15015,45 @@ "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", "dev": true }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-module-lexer": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", "dev": true }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", @@ -13246,6 +15124,13 @@ "node": ">=6" } }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true, + "license": "MIT" + }, "node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -14271,6 +16156,26 @@ "node": ">=0.10.0" } }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", @@ -14545,6 +16450,91 @@ "node": ">=8" } }, + "node_modules/express": { + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.2.tgz", + "integrity": "sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "~1.20.5", + "content-disposition": "~0.5.4", + "content-type": "~1.0.4", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "~0.1.12", + "proxy-addr": "~2.0.7", + "qs": "~6.15.1", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "~0.19.0", + "serve-static": "~1.16.2", + "setprototypeof": "1.2.0", + "statuses": "~2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/express/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "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/ext": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/ext/-/ext-1.6.0.tgz", @@ -14798,6 +16788,64 @@ "integrity": "sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw==", "dev": true }, + "node_modules/fast-uri": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.5.tgz", + "integrity": "sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fast-xml-builder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.3.0.tgz", + "integrity": "sha512-F74cZEdCvuw9P41GAC3rod4X04jjWGM1JPEv/GWSqFTWLsdyMSBMBMlm9Hk3GLBgLBbdBNY8yee0pQh2RBVESQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "path-expression-matcher": "^1.6.2", + "xml-naming": "^0.3.0" + } + }, + "node_modules/fast-xml-parser": { + "version": "5.10.1", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.10.1.tgz", + "integrity": "sha512-IEMIf7298kXuZSRFoGfMYrl7is8LpavODgbNz1cwIudv7KwVFnuU+UsMporfq6PD6aXSlawZlARiA3UywCTfMw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "@nodable/entities": "^3.0.0", + "fast-xml-builder": "^1.2.0", + "is-unsafe": "^2.0.0", + "path-expression-matcher": "^1.6.2", + "strnum": "^2.4.1", + "xml-naming": "^0.3.0" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, "node_modules/fastest-levenshtein": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", @@ -14960,6 +17008,42 @@ "node": ">=8" } }, + "node_modules/finalhandler": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", + "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "statuses": "~2.0.2", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, "node_modules/find-cache-dir": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", @@ -15484,6 +17568,22 @@ } } }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -15519,6 +17619,16 @@ "node": ">= 6" } }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/fraction.js": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.2.tgz", @@ -15590,6 +17700,16 @@ "tslib": "^2.1.0" } }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/from2": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", @@ -15639,6 +17759,20 @@ "node": ">=0.10.0" } }, + "node_modules/fs-ext-extra-prebuilt": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/fs-ext-extra-prebuilt/-/fs-ext-extra-prebuilt-2.2.7.tgz", + "integrity": "sha512-Q7rayYRBDIvDF01HWOwSSjoaP+05N1g+o3BXL1Zf8Frw2JkjSmi4EtvCBITuW30l6hB2m2TW1pehdh8wyU/+gw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "nan": "^2.24.0" + }, + "engines": { + "node": ">= 8.0.0" + } + }, "node_modules/fs-extra": { "version": "0.26.7", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.26.7.tgz", @@ -15707,10 +17841,14 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/function.prototype.name": { "version": "1.1.5", @@ -15764,14 +17902,25 @@ } }, "node_modules/get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dev": true, + "license": "MIT", "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -15804,6 +17953,20 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-proxy": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/get-proxy/-/get-proxy-2.1.0.tgz", @@ -16419,6 +18582,19 @@ "delegate": "^3.1.2" } }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/got": { "version": "11.8.5", "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz", @@ -17233,6 +19409,19 @@ "node": ">=4" } }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-symbol-support-x": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", @@ -17243,10 +19432,11 @@ } }, "node_modules/has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -17267,12 +19457,13 @@ } }, "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, + "license": "MIT", "dependencies": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -17344,6 +19535,19 @@ "node": ">=0.10.0" } }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/header-case": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", @@ -17513,6 +19717,27 @@ "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", "dev": true }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/http-link-header": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/http-link-header/-/http-link-header-1.1.3.tgz", @@ -18296,6 +20521,16 @@ "node": ">= 12" } }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/irregular-plurals": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-3.3.0.tgz", @@ -18418,10 +20653,11 @@ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, "node_modules/is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -18877,6 +21113,22 @@ "integrity": "sha512-LAYzo9kMT1b2p19L/1ATGt2XcSilnzNlyvq6c0pbPRVisLbAPpLqr53tIJS00kvrTkj0HtR8U7+u8X0yR8lPSw==", "dev": true }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -18907,6 +21159,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-unsafe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-unsafe/-/is-unsafe-2.0.0.tgz", + "integrity": "sha512-2LdV822R+wmI86unXA93WCFpL6g+av8ynWk0nrHyJqGop5VoocYsSLFgN8jrfalT6iGeLNM4KXuVSsULP53kEA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, "node_modules/is-utf8": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", @@ -18976,6 +21241,74 @@ "node": ">=0.10.0" } }, + "node_modules/isomorphic-git": { + "version": "1.37.6", + "resolved": "https://registry.npmjs.org/isomorphic-git/-/isomorphic-git-1.37.6.tgz", + "integrity": "sha512-qr1NFCPsVTZ6YGqTXw0CzamnsHyH9QQ1OTEfeXIweSljRUMzuHFCJdUn0wc6OcjtTDns6knxjPb7N6LmJeftOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-lock": "^1.4.1", + "clean-git-ref": "^2.0.1", + "crc-32": "^1.2.0", + "diff3": "0.0.3", + "ignore": "^5.1.4", + "minimisted": "^2.0.0", + "pako": "^1.0.10", + "pify": "^4.0.1", + "readable-stream": "^4.0.0", + "sha.js": "^2.4.12", + "simple-get": "^4.0.1" + }, + "bin": { + "isogit": "cli.cjs" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/isomorphic-git/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "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.2.1" + } + }, + "node_modules/isomorphic-git/node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "dev": true, + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, "node_modules/istanbul-lib-coverage": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", @@ -23104,6 +25437,42 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/jsonwebtoken": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", + "integrity": "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==", + "dev": true, + "license": "MIT", + "dependencies": { + "jws": "^4.0.1", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jsonwebtoken/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/jsx-ast-utils": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.1.tgz", @@ -23132,6 +25501,29 @@ "integrity": "sha512-qpcRocdkUmf+UTNBYx5w6dexX5J31AKK1OmPwH630a83DdVVUIngk55RSAiIGpQyoH0dlr872VHfPjnQnK1qDQ==", "dev": true }, + "node_modules/jwa": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", + "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "^1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", + "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jwa": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, "node_modules/keyv": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz", @@ -24287,12 +26679,54 @@ "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", "dev": true }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", + "dev": true, + "license": "MIT" + }, "node_modules/lodash.isequal": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=", "dev": true }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "dev": true, + "license": "MIT" + }, "node_modules/lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -24305,6 +26739,13 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "dev": true, + "license": "MIT" + }, "node_modules/lodash.template": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", @@ -24986,6 +27427,16 @@ "node": ">=0.10.0" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/mathml-tag-names": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", @@ -25063,6 +27514,16 @@ "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", "dev": true }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/memize": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/memize/-/memize-1.1.0.tgz", @@ -25226,6 +27687,16 @@ "node": ">=0.10.0" } }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -25247,6 +27718,16 @@ "integrity": "sha512-EoYJ8xfjQ6kpe9VbVHvZTZHiOl4HL1Z18CrZ+qahvLXT7ZO4YTC2JMyt5FaUp9JJp6J4Ybb/z7IsCXZt86/QkQ==", "dev": true }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/micromark": { "version": "2.11.4", "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.11.4.tgz", @@ -25453,6 +27934,16 @@ "node": ">=0.10.0" } }, + "node_modules/minimisted": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/minimisted/-/minimisted-2.0.1.tgz", + "integrity": "sha512-1oPjfuLQa2caorJUM8HV8lGgWCc0qqAO1MNv/k05G4qslmsndV/5WdNZrqCiyqiz3wohia2Ij2B7w2Dr7/IyrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5" + } + }, "node_modules/mitt": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", @@ -25604,11 +28095,11 @@ } }, "node_modules/nan": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", - "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", + "version": "2.28.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.28.0.tgz", + "integrity": "sha512-fTsDz99OTq2sVePhGdp4qQhggZFtKr64ZNVyVajRKtMOkJxYekplBh577PiJB12v/D3s2E5cGtOI45LWp6rnLQ==", "dev": true, - "optional": true + "license": "MIT" }, "node_modules/nanoid": { "version": "3.2.0", @@ -25672,6 +28163,16 @@ "url": "https://nearley.js.org/#give-to-nearley" } }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", @@ -26119,10 +28620,14 @@ "dev": true }, "node_modules/object-inspect": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", - "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -26349,6 +28854,41 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/octokit": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/octokit/-/octokit-3.1.2.tgz", + "integrity": "sha512-MG5qmrTL5y8KYwFgE1A4JWmgfQBaIETE/lOlfwNYx1QOtCQHGVxkRJmdUJltFc1HVn73d61TlMhMyNTOtMl+ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/app": "^14.0.2", + "@octokit/core": "^5.0.0", + "@octokit/oauth-app": "^6.0.0", + "@octokit/plugin-paginate-graphql": "^4.0.0", + "@octokit/plugin-paginate-rest": "^9.0.0", + "@octokit/plugin-rest-endpoint-methods": "^10.0.0", + "@octokit/plugin-retry": "^6.0.0", + "@octokit/plugin-throttling": "^8.0.0", + "@octokit/request-error": "^5.0.0", + "@octokit/types": "^12.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -26803,6 +29343,13 @@ "node": ">= 14" } }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true, + "license": "(MIT AND Zlib)" + }, "node_modules/param-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", @@ -26913,6 +29460,16 @@ "parse5": "^6.0.1" } }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/pascal-case": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", @@ -26955,6 +29512,22 @@ "node": ">=4" } }, + "node_modules/path-expression-matcher": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.6.2.tgz", + "integrity": "sha512-enSlaiat05iasnzmgNxRj8reFdj3puY2QpNgP1aPIaVfT6nn9ICuPoFlKHk8EN22HcwewshO+mN2DGbkCEOtqQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -27015,6 +29588,13 @@ "node": ">=8" } }, + "node_modules/path-to-regexp": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz", + "integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==", + "dev": true, + "license": "MIT" + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -27430,6 +30010,16 @@ "node": ">=0.10.0" } }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/postcss": { "version": "8.3.11", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.11.tgz", @@ -28594,6 +31184,16 @@ "node": ">= 0.8" } }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -28649,6 +31249,20 @@ "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", "dev": true }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/proxy-agent": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz", @@ -28918,12 +31532,14 @@ } }, "node_modules/qs": { - "version": "6.10.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", - "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", + "version": "6.15.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", + "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.0.4" + "es-define-property": "^1.0.1", + "side-channel": "^1.1.1" }, "engines": { "node": ">=0.6" @@ -29028,6 +31644,16 @@ "safe-buffer": "^5.1.0" } }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/raw-body": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.1.7.tgz", @@ -29088,6 +31714,7 @@ "version": "17.0.2", "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "dev": true, "dependencies": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1" @@ -29199,6 +31826,7 @@ "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", + "dev": true, "dependencies": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", @@ -30569,6 +33197,7 @@ "version": "0.20.2", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "dev": true, "dependencies": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1" @@ -30673,6 +33302,68 @@ "semver": "bin/semver" } }, + "node_modules/send": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.4.1", + "range-parser": "~1.2.1", + "statuses": "~2.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/send/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/sentence-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", @@ -30692,12 +33383,46 @@ "randombytes": "^2.1.0" } }, + "node_modules/serve-static": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "~0.19.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/set-value": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", @@ -30725,6 +33450,55 @@ "node": ">=0.10.0" } }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true, + "license": "ISC" + }, + "node_modules/sha.js": { + "version": "2.4.12", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.12.tgz", + "integrity": "sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==", + "dev": true, + "license": "(MIT AND BSD-3-Clause)", + "dependencies": { + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1", + "to-buffer": "^1.2.0" + }, + "bin": { + "sha.js": "bin.js" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sha.js/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "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/shallow-clone": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz", @@ -30807,14 +33581,76 @@ } }, "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -30826,6 +33662,82 @@ "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", "dev": true }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "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/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "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": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/simple-get/node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/simple-get/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/simple-html-tokenizer": { "version": "0.5.11", "resolved": "https://registry.npmjs.org/simple-html-tokenizer/-/simple-html-tokenizer-0.5.11.tgz", @@ -31450,6 +34362,16 @@ "node": ">=0.10.0" } }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/stream-exhaust": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", @@ -31751,6 +34673,22 @@ "resolved": "https://registry.npmjs.org/striptags/-/striptags-3.2.0.tgz", "integrity": "sha512-g45ZOGzHDMe2bdYMdIvdAfCQkCTDMGBazSw1ypMowwGIee7ZQ5dU0rBJ8Jqgl+jAKIv4dbeE1jscZq9wid1Tkw==" }, + "node_modules/strnum": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.4.1.tgz", + "integrity": "sha512-M9eUSMT2dCB2cTNPG7UYj6KuK7RJR2SN2+yCV/fTW3xzTCS6EaGZ5pSMgDIjB7r8zSfTGk+dvvn9rTjpVS9Mwg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "anynum": "^1.0.1" + } + }, "node_modules/style-search": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz", @@ -32927,6 +35865,26 @@ "tldts-core": "^6.1.70" } }, + "node_modules/tmp": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.7.tgz", + "integrity": "sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.14" + } + }, + "node_modules/tmp-promise": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", + "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tmp": "^0.2.0" + } + }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -32947,10 +35905,47 @@ } }, "node_modules/to-buffer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", - "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", - "dev": true + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.2.tgz", + "integrity": "sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "isarray": "^2.0.5", + "safe-buffer": "^5.2.1", + "typed-array-buffer": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/to-buffer/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/to-buffer/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "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/to-fast-properties": { "version": "2.0.0", @@ -33024,6 +36019,16 @@ "node": ">= 0.10" } }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, "node_modules/totalist": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", @@ -33215,6 +36220,35 @@ "node": ">=8" } }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/typed-query-selector": { "version": "2.12.0", "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.0.tgz", @@ -33236,20 +36270,6 @@ "is-typedarray": "^1.0.0" } }, - "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "dev": true, - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, "node_modules/uc.micro": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", @@ -33495,6 +36515,24 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/universal-github-app-jwt": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/universal-github-app-jwt/-/universal-github-app-jwt-1.2.0.tgz", + "integrity": "sha512-dncpMpnsKBk0eetwfN8D8OUHGfiDhhJ+mtsbMl+7PfW7mYjiH8LIcqRmYMtzYLgSh47HjfdBtrBwIQ/gizKR3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/jsonwebtoken": "^9.0.0", + "jsonwebtoken": "^9.0.2" + } + }, + "node_modules/universal-user-agent": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", + "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", + "dev": true, + "license": "ISC" + }, "node_modules/universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", @@ -33504,6 +36542,16 @@ "node": ">= 4.0.0" } }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/unquote": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", @@ -33751,6 +36799,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", @@ -33820,6 +36878,16 @@ "node": ">= 0.10" } }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/vfile": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", @@ -34067,6 +37135,13 @@ "loose-envify": "^1.0.0" } }, + "node_modules/wasm-feature-detect": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/wasm-feature-detect/-/wasm-feature-detect-1.8.0.tgz", + "integrity": "sha512-zksaLKM2fVlnB5jQQDqKXXwYHLQUVH9es+5TOOHwGOVJOCeRBCiPjwSg+3tN2AdTCzjgli4jijCH290kXb/zWQ==", + "dev": true, + "license": "Apache-2.0" + }, "node_modules/watchpack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.2.0.tgz", @@ -34659,6 +37734,28 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, + "node_modules/which-typed-array": { + "version": "1.1.22", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.22.tgz", + "integrity": "sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/wildcard": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", @@ -34742,6 +37839,22 @@ "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", "dev": true }, + "node_modules/xml-naming": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/xml-naming/-/xml-naming-0.3.0.tgz", + "integrity": "sha512-ghig2TBE/H11aOVgmahA3MhimvkBr6JIYknH/Dhdk10nXwdbIqBJsbfMxpvFPG8bAw77gN29aQWvKpmVoPlvPQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/xml2js": { "version": "0.4.19", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", @@ -34875,6 +37988,13 @@ "url": "https://github.com/sponsors/colinhacks" } }, + "node_modules/zstddec": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/zstddec/-/zstddec-0.2.0.tgz", + "integrity": "sha512-oyPnDa1X5c13+Y7mA/FDMNJrn4S8UNBe0KCqtDmor40Re7ALrPN6npFwyYVRRh+PqozZQdeg23QtbcamZnG5rA==", + "dev": true, + "license": "MIT AND BSD-3-Clause" + }, "node_modules/zwitch": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", @@ -37375,6 +40495,12 @@ "integrity": "sha512-n2RC9d6XatVbWFdHLimzzUJxJ1KY8LdjqrW6YvGPiRmsHkhOUx74/Ct10x5Yo7bC/Jvqx7cDEW8IMPv/+vwEzA==", "dev": true }, + "@nodable/entities": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@nodable/entities/-/entities-3.0.0.tgz", + "integrity": "sha512-8L9xFeTYKhm49xfIypoe2W5wV1m/3Z58kT+7kR9A8OyFxcPduI4VmxaUMQyKYrRjUoLLSXv6EKKID5Tvj9cUVw==", + "dev": true + }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -37401,6 +40527,466 @@ "fastq": "^1.6.0" } }, + "@octokit/app": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@octokit/app/-/app-14.1.0.tgz", + "integrity": "sha512-g3uEsGOQCBl1+W1rgfwoRFUIR6PtvB2T1E4RpygeUU5LrLvlOqcxrt5lfykIeRpUPpupreGJUYl70fqMDXdTpw==", + "dev": true, + "requires": { + "@octokit/auth-app": "^6.0.0", + "@octokit/auth-unauthenticated": "^5.0.0", + "@octokit/core": "^5.0.0", + "@octokit/oauth-app": "^6.0.0", + "@octokit/plugin-paginate-rest": "^9.0.0", + "@octokit/types": "^12.0.0", + "@octokit/webhooks": "^12.0.4" + } + }, + "@octokit/auth-app": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/@octokit/auth-app/-/auth-app-6.1.4.tgz", + "integrity": "sha512-QkXkSOHZK4dA5oUqY5Dk3S+5pN2s1igPjEASNQV8/vgJgW034fQWR16u7VsNOK/EljA00eyjYF5mWNxWKWhHRQ==", + "dev": true, + "requires": { + "@octokit/auth-oauth-app": "^7.1.0", + "@octokit/auth-oauth-user": "^4.1.0", + "@octokit/request": "^8.3.1", + "@octokit/request-error": "^5.1.0", + "@octokit/types": "^13.1.0", + "deprecation": "^2.3.1", + "lru-cache": "npm:@wolfy1339/lru-cache@^11.0.2-patch.1", + "universal-github-app-jwt": "^1.1.2", + "universal-user-agent": "^6.0.0" + }, + "dependencies": { + "@octokit/openapi-types": { + "version": "24.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", + "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", + "dev": true + }, + "@octokit/types": { + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", + "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", + "dev": true, + "requires": { + "@octokit/openapi-types": "^24.2.0" + } + }, + "lru-cache": { + "version": "npm:@wolfy1339/lru-cache@11.0.2-patch.1", + "resolved": "https://registry.npmjs.org/@wolfy1339/lru-cache/-/lru-cache-11.0.2-patch.1.tgz", + "integrity": "sha512-BgYZfL2ADCXKOw2wJtkM3slhHotawWkgIRRxq4wEybnZQPjvAp71SPX35xepMykTw8gXlzWcWPTY31hlbnRsDA==", + "dev": true + } + } + }, + "@octokit/auth-oauth-app": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-app/-/auth-oauth-app-7.1.0.tgz", + "integrity": "sha512-w+SyJN/b0l/HEb4EOPRudo7uUOSW51jcK1jwLa+4r7PA8FPFpoxEnHBHMITqCsc/3Vo2qqFjgQfz/xUUvsSQnA==", + "dev": true, + "requires": { + "@octokit/auth-oauth-device": "^6.1.0", + "@octokit/auth-oauth-user": "^4.1.0", + "@octokit/request": "^8.3.1", + "@octokit/types": "^13.0.0", + "@types/btoa-lite": "^1.0.0", + "btoa-lite": "^1.0.0", + "universal-user-agent": "^6.0.0" + }, + "dependencies": { + "@octokit/openapi-types": { + "version": "24.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", + "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", + "dev": true + }, + "@octokit/types": { + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", + "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", + "dev": true, + "requires": { + "@octokit/openapi-types": "^24.2.0" + } + } + } + }, + "@octokit/auth-oauth-device": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-device/-/auth-oauth-device-6.1.0.tgz", + "integrity": "sha512-FNQ7cb8kASufd6Ej4gnJ3f1QB5vJitkoV1O0/g6e6lUsQ7+VsSNRHRmFScN2tV4IgKA12frrr/cegUs0t+0/Lw==", + "dev": true, + "requires": { + "@octokit/oauth-methods": "^4.1.0", + "@octokit/request": "^8.3.1", + "@octokit/types": "^13.0.0", + "universal-user-agent": "^6.0.0" + }, + "dependencies": { + "@octokit/openapi-types": { + "version": "24.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", + "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", + "dev": true + }, + "@octokit/types": { + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", + "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", + "dev": true, + "requires": { + "@octokit/openapi-types": "^24.2.0" + } + } + } + }, + "@octokit/auth-oauth-user": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-user/-/auth-oauth-user-4.1.0.tgz", + "integrity": "sha512-FrEp8mtFuS/BrJyjpur+4GARteUCrPeR/tZJzD8YourzoVhRics7u7we/aDcKv+yywRNwNi/P4fRi631rG/OyQ==", + "dev": true, + "requires": { + "@octokit/auth-oauth-device": "^6.1.0", + "@octokit/oauth-methods": "^4.1.0", + "@octokit/request": "^8.3.1", + "@octokit/types": "^13.0.0", + "btoa-lite": "^1.0.0", + "universal-user-agent": "^6.0.0" + }, + "dependencies": { + "@octokit/openapi-types": { + "version": "24.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", + "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", + "dev": true + }, + "@octokit/types": { + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", + "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", + "dev": true, + "requires": { + "@octokit/openapi-types": "^24.2.0" + } + } + } + }, + "@octokit/auth-token": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz", + "integrity": "sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==", + "dev": true + }, + "@octokit/auth-unauthenticated": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@octokit/auth-unauthenticated/-/auth-unauthenticated-5.0.1.tgz", + "integrity": "sha512-oxeWzmBFxWd+XolxKTc4zr+h3mt+yofn4r7OfoIkR/Cj/o70eEGmPsFbueyJE2iBAGpjgTnEOKM3pnuEGVmiqg==", + "dev": true, + "requires": { + "@octokit/request-error": "^5.0.0", + "@octokit/types": "^12.0.0" + } + }, + "@octokit/core": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.2.2.tgz", + "integrity": "sha512-/g2d4sW9nUDJOMz3mabVQvOGhVa4e/BN/Um7yca9Bb2XTzPPnfTWHWQg+IsEYO7M3Vx+EXvaM/I2pJWIMun1bg==", + "dev": true, + "requires": { + "@octokit/auth-token": "^4.0.0", + "@octokit/graphql": "^7.1.0", + "@octokit/request": "^8.4.1", + "@octokit/request-error": "^5.1.1", + "@octokit/types": "^13.0.0", + "before-after-hook": "^2.2.0", + "universal-user-agent": "^6.0.0" + }, + "dependencies": { + "@octokit/openapi-types": { + "version": "24.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", + "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", + "dev": true + }, + "@octokit/types": { + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", + "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", + "dev": true, + "requires": { + "@octokit/openapi-types": "^24.2.0" + } + } + } + }, + "@octokit/endpoint": { + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.6.tgz", + "integrity": "sha512-H1fNTMA57HbkFESSt3Y9+FBICv+0jFceJFPWDePYlR/iMGrwM5ph+Dd4XRQs+8X+PUFURLQgX9ChPfhJ/1uNQw==", + "dev": true, + "requires": { + "@octokit/types": "^13.1.0", + "universal-user-agent": "^6.0.0" + }, + "dependencies": { + "@octokit/openapi-types": { + "version": "24.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", + "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", + "dev": true + }, + "@octokit/types": { + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", + "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", + "dev": true, + "requires": { + "@octokit/openapi-types": "^24.2.0" + } + } + } + }, + "@octokit/graphql": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.1.1.tgz", + "integrity": "sha512-3mkDltSfcDUoa176nlGoA32RGjeWjl3K7F/BwHwRMJUW/IteSa4bnSV8p2ThNkcIcZU2umkZWxwETSSCJf2Q7g==", + "dev": true, + "requires": { + "@octokit/request": "^8.4.1", + "@octokit/types": "^13.0.0", + "universal-user-agent": "^6.0.0" + }, + "dependencies": { + "@octokit/openapi-types": { + "version": "24.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", + "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", + "dev": true + }, + "@octokit/types": { + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", + "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", + "dev": true, + "requires": { + "@octokit/openapi-types": "^24.2.0" + } + } + } + }, + "@octokit/oauth-app": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@octokit/oauth-app/-/oauth-app-6.1.0.tgz", + "integrity": "sha512-nIn/8eUJ/BKUVzxUXd5vpzl1rwaVxMyYbQkNZjHrF7Vk/yu98/YDF/N2KeWO7uZ0g3b5EyiFXFkZI8rJ+DH1/g==", + "dev": true, + "requires": { + "@octokit/auth-oauth-app": "^7.0.0", + "@octokit/auth-oauth-user": "^4.0.0", + "@octokit/auth-unauthenticated": "^5.0.0", + "@octokit/core": "^5.0.0", + "@octokit/oauth-authorization-url": "^6.0.2", + "@octokit/oauth-methods": "^4.0.0", + "@types/aws-lambda": "^8.10.83", + "universal-user-agent": "^6.0.0" + } + }, + "@octokit/oauth-authorization-url": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@octokit/oauth-authorization-url/-/oauth-authorization-url-6.0.2.tgz", + "integrity": "sha512-CdoJukjXXxqLNK4y/VOiVzQVjibqoj/xHgInekviUJV73y/BSIcwvJ/4aNHPBPKcPWFnd4/lO9uqRV65jXhcLA==", + "dev": true + }, + "@octokit/oauth-methods": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@octokit/oauth-methods/-/oauth-methods-4.1.0.tgz", + "integrity": "sha512-4tuKnCRecJ6CG6gr0XcEXdZtkTDbfbnD5oaHBmLERTjTMZNi2CbfEHZxPU41xXLDG4DfKf+sonu00zvKI9NSbw==", + "dev": true, + "requires": { + "@octokit/oauth-authorization-url": "^6.0.2", + "@octokit/request": "^8.3.1", + "@octokit/request-error": "^5.1.0", + "@octokit/types": "^13.0.0", + "btoa-lite": "^1.0.0" + }, + "dependencies": { + "@octokit/openapi-types": { + "version": "24.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", + "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", + "dev": true + }, + "@octokit/types": { + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", + "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", + "dev": true, + "requires": { + "@octokit/openapi-types": "^24.2.0" + } + } + } + }, + "@octokit/openapi-types": { + "version": "20.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-20.0.0.tgz", + "integrity": "sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==", + "dev": true + }, + "@octokit/plugin-paginate-graphql": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-graphql/-/plugin-paginate-graphql-4.0.1.tgz", + "integrity": "sha512-R8ZQNmrIKKpHWC6V2gum4x9LG2qF1RxRjo27gjQcG3j+vf2tLsEfE7I/wRWEPzYMaenr1M+qDAtNcwZve1ce1A==", + "dev": true + }, + "@octokit/plugin-paginate-rest": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.2.2.tgz", + "integrity": "sha512-u3KYkGF7GcZnSD/3UP0S7K5XUFT2FkOQdcfXZGZQPGv3lm4F2Xbf71lvjldr8c1H3nNbF+33cLEkWYbokGWqiQ==", + "dev": true, + "requires": { + "@octokit/types": "^12.6.0" + } + }, + "@octokit/plugin-rest-endpoint-methods": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-10.4.1.tgz", + "integrity": "sha512-xV1b+ceKV9KytQe3zCVqjg+8GTGfDYwaT1ATU5isiUyVtlVAO3HNdzpS4sr4GBx4hxQ46s7ITtZrAsxG22+rVg==", + "dev": true, + "requires": { + "@octokit/types": "^12.6.0" + } + }, + "@octokit/plugin-retry": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-6.1.0.tgz", + "integrity": "sha512-WrO3bvq4E1Xh1r2mT9w6SDFg01gFmP81nIG77+p/MqW1JeXXgL++6umim3t6x0Zj5pZm3rXAN+0HEjmmdhIRig==", + "dev": true, + "requires": { + "@octokit/request-error": "^5.0.0", + "@octokit/types": "^13.0.0", + "bottleneck": "^2.15.3" + }, + "dependencies": { + "@octokit/openapi-types": { + "version": "24.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", + "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", + "dev": true + }, + "@octokit/types": { + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", + "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", + "dev": true, + "requires": { + "@octokit/openapi-types": "^24.2.0" + } + } + } + }, + "@octokit/plugin-throttling": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-8.2.0.tgz", + "integrity": "sha512-nOpWtLayKFpgqmgD0y3GqXafMFuKcA4tRPZIfu7BArd2lEZeb1988nhWhwx4aZWmjDmUfdgVf7W+Tt4AmvRmMQ==", + "dev": true, + "requires": { + "@octokit/types": "^12.2.0", + "bottleneck": "^2.15.3" + } + }, + "@octokit/request": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.4.1.tgz", + "integrity": "sha512-qnB2+SY3hkCmBxZsR/MPCybNmbJe4KAlfWErXq+rBKkQJlbjdJeS85VI9r8UqeLYLvnAenU8Q1okM/0MBsAGXw==", + "dev": true, + "requires": { + "@octokit/endpoint": "^9.0.6", + "@octokit/request-error": "^5.1.1", + "@octokit/types": "^13.1.0", + "universal-user-agent": "^6.0.0" + }, + "dependencies": { + "@octokit/openapi-types": { + "version": "24.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", + "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", + "dev": true + }, + "@octokit/types": { + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", + "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", + "dev": true, + "requires": { + "@octokit/openapi-types": "^24.2.0" + } + } + } + }, + "@octokit/request-error": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.1.1.tgz", + "integrity": "sha512-v9iyEQJH6ZntoENr9/yXxjuezh4My67CBSu9r6Ve/05Iu5gNgnisNWOsoJHTP6k0Rr0+HQIpnH+kyammu90q/g==", + "dev": true, + "requires": { + "@octokit/types": "^13.1.0", + "deprecation": "^2.0.0", + "once": "^1.4.0" + }, + "dependencies": { + "@octokit/openapi-types": { + "version": "24.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", + "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", + "dev": true + }, + "@octokit/types": { + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", + "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", + "dev": true, + "requires": { + "@octokit/openapi-types": "^24.2.0" + } + } + } + }, + "@octokit/types": { + "version": "12.6.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.6.0.tgz", + "integrity": "sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==", + "dev": true, + "requires": { + "@octokit/openapi-types": "^20.0.0" + } + }, + "@octokit/webhooks": { + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/@octokit/webhooks/-/webhooks-12.3.2.tgz", + "integrity": "sha512-exj1MzVXoP7xnAcAB3jZ97pTvVPkQF9y6GA/dvYC47HV7vLv+24XRS6b/v/XnyikpEuvMhugEXdGtAlU086WkQ==", + "dev": true, + "requires": { + "@octokit/request-error": "^5.0.0", + "@octokit/webhooks-methods": "^4.1.0", + "@octokit/webhooks-types": "7.6.1", + "aggregate-error": "^3.1.0" + } + }, + "@octokit/webhooks-methods": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@octokit/webhooks-methods/-/webhooks-methods-4.1.0.tgz", + "integrity": "sha512-zoQyKw8h9STNPqtm28UGOYFE7O6D4Il8VJwhAtMHFt2C4L0VQT1qGKLeefUOqHNs1mNRYSadVv7x0z8U2yyeWQ==", + "dev": true + }, + "@octokit/webhooks-types": { + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/@octokit/webhooks-types/-/webhooks-types-7.6.1.tgz", + "integrity": "sha512-S8u2cJzklBC0FgTwWVLaM8tMrDuDMVE4xiTK4EYXM9GntyvrdbSoxqDQa+Fh57CCNApyIpyeqPhhFEmHPfrXgw==", + "dev": true + }, "@paulirish/trace_engine": { "version": "0.0.39", "resolved": "https://registry.npmjs.org/@paulirish/trace_engine/-/trace_engine-0.0.39.tgz", @@ -37410,6 +40996,345 @@ "third-party-web": "latest" } }, + "@php-wasm/cli-util": { + "version": "3.1.49", + "resolved": "https://registry.npmjs.org/@php-wasm/cli-util/-/cli-util-3.1.49.tgz", + "integrity": "sha512-JD/Gsvv2ZL3XfanCUJ2S3gTRiICxbSMy0xhhjGxDPxQpOuhtzeRNzD412ZQmgGAimr0hfZLj/dL9DNCNOUCjAw==", + "dev": true, + "requires": { + "@php-wasm/util": "3.1.49", + "fast-xml-parser": "^5.8.0", + "jsonc-parser": "3.3.1" + }, + "dependencies": { + "jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "dev": true + } + } + }, + "@php-wasm/logger": { + "version": "3.1.49", + "resolved": "https://registry.npmjs.org/@php-wasm/logger/-/logger-3.1.49.tgz", + "integrity": "sha512-/RJiOaXXfxNxIuw2zNBPGl84T2kTiQ/61k1uvTMpkx6Jop+jvhxy+MUHql8CKbos5osTHiXp58G/NyR8Z1775w==", + "dev": true + }, + "@php-wasm/node": { + "version": "3.1.49", + "resolved": "https://registry.npmjs.org/@php-wasm/node/-/node-3.1.49.tgz", + "integrity": "sha512-r2kvEFMb6eiljNUWDurjugyTaz3tKBQeAual4pAQuOSoZoHN6hZ175Fj5MIIrJvJwY+LDhbukKCAQ0cU1Q8zow==", + "dev": true, + "requires": { + "@php-wasm/cli-util": "3.1.49", + "@php-wasm/logger": "3.1.49", + "@php-wasm/node-5-2": "3.1.49", + "@php-wasm/node-7-4": "3.1.49", + "@php-wasm/node-8-0": "3.1.49", + "@php-wasm/node-8-1": "3.1.49", + "@php-wasm/node-8-2": "3.1.49", + "@php-wasm/node-8-3": "3.1.49", + "@php-wasm/node-8-4": "3.1.49", + "@php-wasm/node-8-5": "3.1.49", + "@php-wasm/universal": "3.1.49", + "@php-wasm/util": "3.1.49", + "fs-ext-extra-prebuilt": "2.2.7", + "wasm-feature-detect": "1.8.0", + "ws": "8.21.0" + }, + "dependencies": { + "ws": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", + "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", + "dev": true + } + } + }, + "@php-wasm/node-5-2": { + "version": "3.1.49", + "resolved": "https://registry.npmjs.org/@php-wasm/node-5-2/-/node-5-2-3.1.49.tgz", + "integrity": "sha512-rEixe4llnrSvRaDi5snANBUfAjgCth30doXdYYKfvDSoSW3+KGO0OQif2PgZ3pXM2xGLpE5jB6TSEg8oHUbZzw==", + "dev": true, + "requires": { + "@php-wasm/universal": "3.1.49", + "wasm-feature-detect": "1.8.0" + } + }, + "@php-wasm/node-7-4": { + "version": "3.1.49", + "resolved": "https://registry.npmjs.org/@php-wasm/node-7-4/-/node-7-4-3.1.49.tgz", + "integrity": "sha512-q/ZiCSg0uQdm/rcsfUosQgTZQck2Fff4RrR7xIrK3OomZiT/xq0x5RSbWFMI7Pr9CgOuACT7c9H2Vmwl5U487w==", + "dev": true, + "requires": { + "@php-wasm/universal": "3.1.49", + "wasm-feature-detect": "1.8.0" + } + }, + "@php-wasm/node-8-0": { + "version": "3.1.49", + "resolved": "https://registry.npmjs.org/@php-wasm/node-8-0/-/node-8-0-3.1.49.tgz", + "integrity": "sha512-7WiRXRc20WhLVZp6AsBjYAOSx0ZXVfVSxiCcSyPfTwtFUBg6u8nZK12Yh28PLLLXXFCBIMV//AJclxyqecx3KA==", + "dev": true, + "requires": { + "@php-wasm/universal": "3.1.49", + "wasm-feature-detect": "1.8.0" + } + }, + "@php-wasm/node-8-1": { + "version": "3.1.49", + "resolved": "https://registry.npmjs.org/@php-wasm/node-8-1/-/node-8-1-3.1.49.tgz", + "integrity": "sha512-VryPbG+4wbvcasnyDl8sqMiixrZR95AYzKVCu4KnUfujkyCfG1mfDzw5SJ5dO4/U21HWCL80NZVNr7RmxMAv1w==", + "dev": true, + "requires": { + "@php-wasm/universal": "3.1.49", + "wasm-feature-detect": "1.8.0" + } + }, + "@php-wasm/node-8-2": { + "version": "3.1.49", + "resolved": "https://registry.npmjs.org/@php-wasm/node-8-2/-/node-8-2-3.1.49.tgz", + "integrity": "sha512-rDG4H5CCWhqUv5k1WWFI2C4JAjB77PpxcRBi9Ca2IlBGEZ8fXuvMQuAQY6h8YI5I/MuUcLMhCIzJ9bG6Vs6yZg==", + "dev": true, + "requires": { + "@php-wasm/universal": "3.1.49", + "wasm-feature-detect": "1.8.0" + } + }, + "@php-wasm/node-8-3": { + "version": "3.1.49", + "resolved": "https://registry.npmjs.org/@php-wasm/node-8-3/-/node-8-3-3.1.49.tgz", + "integrity": "sha512-11xU6CF9I8dsw8OOZalYqCoHekbqV+h6AVv0O6wuKJGL+cOPGyKkE0kXmbSOl0/lROn7wxmVH/vnCTbr2A+YRw==", + "dev": true, + "requires": { + "@php-wasm/universal": "3.1.49", + "wasm-feature-detect": "1.8.0" + } + }, + "@php-wasm/node-8-4": { + "version": "3.1.49", + "resolved": "https://registry.npmjs.org/@php-wasm/node-8-4/-/node-8-4-3.1.49.tgz", + "integrity": "sha512-mAJgfE/NxYfW56fhg99haR5dfADD2cLDSur1RfOM/oSiZlBUv/e7pILbupYH+mvrlBdcuQ7Dt5+ACwMlMqVqUw==", + "dev": true, + "requires": { + "@php-wasm/universal": "3.1.49", + "wasm-feature-detect": "1.8.0" + } + }, + "@php-wasm/node-8-5": { + "version": "3.1.49", + "resolved": "https://registry.npmjs.org/@php-wasm/node-8-5/-/node-8-5-3.1.49.tgz", + "integrity": "sha512-9bFS1V5NaC5VoUU85hh0FqLDYKe3IK3hcvdlxxbqXHG+nMhqZmvFmuYPn2c8DNVapoaV3bTQpyZY3jBeTFgwAw==", + "dev": true, + "requires": { + "@php-wasm/universal": "3.1.49", + "wasm-feature-detect": "1.8.0" + } + }, + "@php-wasm/progress": { + "version": "3.1.49", + "resolved": "https://registry.npmjs.org/@php-wasm/progress/-/progress-3.1.49.tgz", + "integrity": "sha512-krTHFF0C/nNkTBKpU98YESh+DSLWtfAKGqou2RnXBls81Y3SJtdpbSjI2UW5HynpVEnp7ZZRZjAhkL/U99LjtA==", + "dev": true, + "requires": { + "@php-wasm/logger": "3.1.49" + } + }, + "@php-wasm/scopes": { + "version": "3.1.49", + "resolved": "https://registry.npmjs.org/@php-wasm/scopes/-/scopes-3.1.49.tgz", + "integrity": "sha512-Dc66sU3t3SYvEXNSyKivVWvzQsMyiR0kgmpYiY7RfrfeYytv2fM4DpnGNGUCWOv3aKDUDmZZIHituyMvMmqLNA==", + "dev": true + }, + "@php-wasm/stream-compression": { + "version": "3.1.49", + "resolved": "https://registry.npmjs.org/@php-wasm/stream-compression/-/stream-compression-3.1.49.tgz", + "integrity": "sha512-o/CS8simUWDqT/F6hhKrOiUp4war8gRAJEz9TvjZVuSBunm8qxmjDRVgx6SYBDjUXKNoFPk7VkqwiP2mzAwGkw==", + "dev": true, + "requires": { + "@php-wasm/util": "3.1.49" + } + }, + "@php-wasm/universal": { + "version": "3.1.49", + "resolved": "https://registry.npmjs.org/@php-wasm/universal/-/universal-3.1.49.tgz", + "integrity": "sha512-h0uDqNoR7n0m66RVWLSeENwWdUgaPQGhmJ//AVTg6TfgN9+iyYx246uD6V1R3QNJe0pkEdMzFgL+GWbKW5D5ww==", + "dev": true, + "requires": { + "@php-wasm/logger": "3.1.49", + "@php-wasm/progress": "3.1.49", + "@php-wasm/stream-compression": "3.1.49", + "@php-wasm/util": "3.1.49", + "ini": "4.1.2" + }, + "dependencies": { + "ini": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.2.tgz", + "integrity": "sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw==", + "dev": true + } + } + }, + "@php-wasm/util": { + "version": "3.1.49", + "resolved": "https://registry.npmjs.org/@php-wasm/util/-/util-3.1.49.tgz", + "integrity": "sha512-5xU6CAx2AKNpGcEruBAWsGdOwdiBI4v4p7T19MxPbBnw2v58HxY9sZqBFZMkyBkiov+Ke2ahKVAqQQeBkR7O0g==", + "dev": true + }, + "@php-wasm/web-service-worker": { + "version": "3.1.49", + "resolved": "https://registry.npmjs.org/@php-wasm/web-service-worker/-/web-service-worker-3.1.49.tgz", + "integrity": "sha512-i9wU3CWLeUYd16RSihcbv5+rty85E6C2VmtkKhbJq2SPip3K6g77yzCC89bcjsQmtSBFRS0c9BcdLVRb9SMP8A==", + "dev": true, + "requires": { + "@php-wasm/scopes": "3.1.49", + "@php-wasm/universal": "3.1.49" + } + }, + "@php-wasm/xdebug-bridge": { + "version": "3.1.49", + "resolved": "https://registry.npmjs.org/@php-wasm/xdebug-bridge/-/xdebug-bridge-3.1.49.tgz", + "integrity": "sha512-0nNzvdCm33MWZDzeayNR3Y3CkRRNk0Ex1wJOTPvxubdsizRRL2sD8kB6Or0x781Gi8kkx79/762dvfq/c7EvdQ==", + "dev": true, + "requires": { + "@php-wasm/logger": "3.1.49", + "@php-wasm/universal": "3.1.49", + "ws": "8.21.0", + "xml2js": "0.6.2", + "yargs": "17.7.2" + }, + "dependencies": { + "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 + }, + "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, + "requires": { + "color-convert": "^2.0.1" + } + }, + "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, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + }, + "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, + "requires": { + "color-name": "~1.1.4" + } + }, + "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 + }, + "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 + }, + "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, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "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, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "ws": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", + "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", + "dev": true + }, + "xml2js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", + "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", + "dev": true, + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + } + }, + "xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "dev": true + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "requires": { + "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" + } + }, + "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 + } + } + }, "@playwright/test": { "version": "1.49.1", "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.49.1.tgz", @@ -38198,6 +42123,12 @@ "integrity": "sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig==", "dev": true }, + "@types/aws-lambda": { + "version": "8.10.162", + "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.162.tgz", + "integrity": "sha512-Fn658grtLOci1oxi1391vvDWJRKNGWRSqfxRkmN/Iy3c0tQH1USMKEXcPYHLvope+ZgTFocx9FRQJx1muBL6qw==", + "dev": true + }, "@types/babel__core": { "version": "7.1.16", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.16.tgz", @@ -38239,6 +42170,12 @@ "@babel/types": "^7.3.0" } }, + "@types/btoa-lite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/btoa-lite/-/btoa-lite-1.0.2.tgz", + "integrity": "sha512-ZYbcE2x7yrvNFJiU7xJGrpF/ihpkM7zKgw8bha3LNJSesvTtUNxbpzaT7WXBIryf6jovisrxTBvymxMeLLj1Mg==", + "dev": true + }, "@types/cacheable-request": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz", @@ -38472,6 +42409,16 @@ "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", "dev": true }, + "@types/jsonwebtoken": { + "version": "9.0.10", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.10.tgz", + "integrity": "sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==", + "dev": true, + "requires": { + "@types/ms": "*", + "@types/node": "*" + } + }, "@types/keyv": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.3.tgz", @@ -38514,6 +42461,12 @@ "integrity": "sha512-zTqjvgCUT5EoXqbqmd8iJMb4NJqyV/V7pK7AIKq7qcaAsJIpGlTVJS1HQM6YkdHCdnkNSbhcQI7MXYxFfE3iCA==", "dev": true }, + "@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "dev": true + }, "@types/node": { "version": "22.10.2", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.2.tgz", @@ -38567,8 +42520,7 @@ "version": "17.0.26", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.26.tgz", "integrity": "sha512-Z+2VcYXJwOqQ79HreLU/1fyQ88eXSSFh6I3JdrEHQIfYSI0kCQpTGvOrbE6jFGGYXKsHuwY9tBa/w5Uo6KzrEg==", - "dev": true, - "requires": {} + "dev": true }, "@types/responselike": { "version": "1.0.0", @@ -38997,8 +42949,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.1.0.tgz", "integrity": "sha512-ttOkEkoalEHa7RaFYpM0ErK1xc4twg3Am9hfHhL7MVqlHebnkYd2wuI/ZqTDj0cVzZho6PdinY0phFZV3O0Mzg==", - "dev": true, - "requires": {} + "dev": true }, "@webpack-cli/info": { "version": "1.4.0", @@ -39013,8 +42964,7 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.6.0.tgz", "integrity": "sha512-ZkVeqEmRpBV2GHvjjUZqEai2PpUbuq8Bqd//vEYsp63J8WyexI8ppCqVS3Zs0QADf6aWuPdU+0XsPI647PVlQA==", - "dev": true, - "requires": {} + "dev": true }, "@wojtekmaj/enzyme-adapter-react-17": { "version": "0.6.5", @@ -39088,8 +43038,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/@wordpress/babel-plugin-import-jsx-pragma/-/babel-plugin-import-jsx-pragma-3.1.0.tgz", "integrity": "sha512-518mL3goaSeXtJCQcPK9OYHUUiA0sjXuoGWHBwRalkyTIQZZy5ZZzlwrlSc9ESZcOw9BZ+Uo8CJRjV2OWnx+Zw==", - "dev": true, - "requires": {} + "dev": true }, "@wordpress/babel-preset-default": { "version": "6.4.1", @@ -39559,8 +43508,7 @@ "@types/react-dom": { "version": "18.3.7", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", - "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", - "requires": {} + "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==" }, "@wordpress/element": { "version": "6.31.0", @@ -39702,8 +43650,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/@wordpress/npm-package-json-lint-config/-/npm-package-json-lint-config-4.1.0.tgz", "integrity": "sha512-FjXL5GbpmI/wXXcpCf2sKosVIVuWjUuHmDbwcMzd0SClcudo9QjDRdVe35We+js8eQLPgB9hsG4Cty6cAFFxsQ==", - "dev": true, - "requires": {} + "dev": true }, "@wordpress/postcss-plugins-preset": { "version": "3.2.5", @@ -39746,8 +43693,7 @@ "version": "18.3.7", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", - "dev": true, - "requires": {} + "dev": true }, "@wordpress/element": { "version": "5.35.0", @@ -40072,8 +44018,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", - "dev": true, - "requires": {} + "dev": true }, "dom-serializer": { "version": "1.4.1", @@ -40195,29 +44140,25 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", - "dev": true, - "requires": {} + "dev": true }, "postcss-discard-duplicates": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", - "dev": true, - "requires": {} + "dev": true }, "postcss-discard-empty": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", - "dev": true, - "requires": {} + "dev": true }, "postcss-discard-overridden": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", - "dev": true, - "requires": {} + "dev": true }, "postcss-merge-longhand": { "version": "5.1.7", @@ -40285,8 +44226,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", - "dev": true, - "requires": {} + "dev": true }, "postcss-normalize-display-values": { "version": "5.1.0", @@ -40537,6 +44477,252 @@ "lodash": "^4.17.21" } }, + "@wp-playground/blueprints": { + "version": "3.1.49", + "resolved": "https://registry.npmjs.org/@wp-playground/blueprints/-/blueprints-3.1.49.tgz", + "integrity": "sha512-8tAAviJQS8SUi+Ndz198q90/53FEGKoHMarpbgvZ9Q12A+RvIG3jVRQDiQ+wvRWYfhJMMXmb6W4j9bwZX7/fKw==", + "dev": true, + "requires": { + "@php-wasm/logger": "3.1.49", + "@php-wasm/progress": "3.1.49", + "@php-wasm/stream-compression": "3.1.49", + "@php-wasm/universal": "3.1.49", + "@php-wasm/util": "3.1.49", + "@php-wasm/web-service-worker": "3.1.49", + "@wp-playground/common": "3.1.49", + "@wp-playground/storage": "3.1.49", + "@wp-playground/wordpress": "3.1.49", + "ajv": "8.18.0" + }, + "dependencies": { + "ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + } + } + }, + "@wp-playground/cli": { + "version": "3.1.49", + "resolved": "https://registry.npmjs.org/@wp-playground/cli/-/cli-3.1.49.tgz", + "integrity": "sha512-JVo1xFtSGgug15PCWy7Qiajmwt4DondaRuhCL/jZe/s0tDTZ+LDM6r9/F6A6bHKqfyGUYd06NCuk0H7G0gOr2w==", + "dev": true, + "requires": { + "@php-wasm/cli-util": "3.1.49", + "@php-wasm/logger": "3.1.49", + "@php-wasm/node": "3.1.49", + "@php-wasm/progress": "3.1.49", + "@php-wasm/universal": "3.1.49", + "@php-wasm/util": "3.1.49", + "@php-wasm/xdebug-bridge": "3.1.49", + "@wp-playground/blueprints": "3.1.49", + "@wp-playground/common": "3.1.49", + "@wp-playground/storage": "3.1.49", + "@wp-playground/tools": "3.1.49", + "@wp-playground/wordpress": "3.1.49", + "express": "4.22.2", + "fs-extra": "11.1.1", + "tmp-promise": "3.0.3", + "wasm-feature-detect": "1.8.0", + "yargs": "17.7.2" + }, + "dependencies": { + "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 + }, + "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, + "requires": { + "color-convert": "^2.0.1" + } + }, + "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, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + }, + "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, + "requires": { + "color-name": "~1.1.4" + } + }, + "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 + }, + "fs-extra": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", + "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "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 + }, + "jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "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, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "requires": { + "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" + } + }, + "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 + } + } + }, + "@wp-playground/common": { + "version": "3.1.49", + "resolved": "https://registry.npmjs.org/@wp-playground/common/-/common-3.1.49.tgz", + "integrity": "sha512-Zps9DvdO/bbejcHLjc6m8Mae7Aj60N7lEavf3OXs0NppGk3FAdora1FQ9S85Mah2MK70X7EJCyHzinuCknzzhg==", + "dev": true, + "requires": { + "@php-wasm/universal": "3.1.49", + "@php-wasm/util": "3.1.49" + } + }, + "@wp-playground/storage": { + "version": "3.1.49", + "resolved": "https://registry.npmjs.org/@wp-playground/storage/-/storage-3.1.49.tgz", + "integrity": "sha512-QJOAjduNWlFuTAeM0Ns+JmOP0d18lP4fMndcDbnHTbsHzbc0HdFJClYTZqzughipkcK93nnCG5sj3WUn6Qp9oQ==", + "dev": true, + "requires": { + "@php-wasm/stream-compression": "3.1.49", + "@php-wasm/universal": "3.1.49", + "@php-wasm/util": "3.1.49", + "@zip.js/zip.js": "2.7.57", + "isomorphic-git": "1.37.6", + "octokit": "3.1.2", + "pako": "^1.0.10", + "sha.js": "2.4.12" + } + }, + "@wp-playground/tools": { + "version": "3.1.49", + "resolved": "https://registry.npmjs.org/@wp-playground/tools/-/tools-3.1.49.tgz", + "integrity": "sha512-mR7Aer7f9kdR8v7oj012G19OuTjUH9FA2WchRjlyEB6K1X+dvNwCRivI9AqgGtyNUVBeIO2xguDroQGD0b49LQ==", + "dev": true, + "requires": { + "@php-wasm/util": "3.1.49", + "@wp-playground/blueprints": "3.1.49" + } + }, + "@wp-playground/wordpress": { + "version": "3.1.49", + "resolved": "https://registry.npmjs.org/@wp-playground/wordpress/-/wordpress-3.1.49.tgz", + "integrity": "sha512-VfDtC8gInOomj6RBPUiX3m+Kuml8tJL4HeCnoUjIRfLjikYFKG7ye7VCfvwK0JxqhCHIcBOzV31tzmtzdA8LzA==", + "dev": true, + "requires": { + "@php-wasm/logger": "3.1.49", + "@php-wasm/universal": "3.1.49", + "@php-wasm/util": "3.1.49", + "@wp-playground/common": "3.1.49", + "zstddec": "^0.2.0" + } + }, "@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", @@ -40549,12 +44735,37 @@ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true }, + "@zip.js/zip.js": { + "version": "2.7.57", + "resolved": "https://registry.npmjs.org/@zip.js/zip.js/-/zip.js-2.7.57.tgz", + "integrity": "sha512-BtonQ1/jDnGiMed6OkV6rZYW78gLmLswkHOzyMrMb+CAR7CZO8phOHO6c2qw6qb1g1betN7kwEHhhZk30dv+NA==", + "dev": true + }, "abab": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", "dev": true }, + "abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dev": true, + "requires": { + "event-target-shim": "^5.0.0" + } + }, + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, "acorn": { "version": "6.4.2", "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", @@ -40583,15 +44794,13 @@ "version": "1.8.0", "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "dev": true, - "requires": {} + "dev": true }, "acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} + "dev": true }, "acorn-walk": { "version": "7.2.0", @@ -40651,8 +44860,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "dev": true, - "requires": {} + "dev": true }, "ajv-formats": { "version": "2.1.1", @@ -40687,8 +44895,7 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "requires": {} + "dev": true }, "almost-equal": { "version": "1.1.0", @@ -40764,6 +44971,12 @@ "picomatch": "^2.0.4" } }, + "anynum": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/anynum/-/anynum-1.0.1.tgz", + "integrity": "sha512-N6//FLET/tXYNM/F6ABca1oH6fWB+KlTt909Le28WMDBk8oaT4vY17DCrwg2MvmuqUKt3Ni4N5dGJ/EoBgcO6A==", + "dev": true + }, "append-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", @@ -40883,6 +45096,12 @@ "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", "dev": true }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true + }, "array-includes": { "version": "3.1.4", "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz", @@ -41089,6 +45308,12 @@ "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", "dev": true }, + "async-lock": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.4.1.tgz", + "integrity": "sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==", + "dev": true + }, "async-settle": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz", @@ -41130,6 +45355,15 @@ "integrity": "sha512-5yxLQ22O0fCRGoxGfeLSNt3J8LB1v+umtpMnPW6XjkTWXKoN0AmXAIhelJcDtFT/Y/wYWmfE+oqU10Q0b8FhaQ==", "dev": true }, + "available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "requires": { + "possible-typed-array-names": "^1.0.0" + } + }, "aws-sdk": { "version": "2.1034.0", "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1034.0.tgz", @@ -41215,8 +45449,7 @@ "version": "7.0.0-bridge.0", "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz", "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==", - "dev": true, - "requires": {} + "dev": true }, "babel-eslint": { "version": "10.1.0", @@ -41657,6 +45890,12 @@ "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", "dev": true }, + "before-after-hook": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", + "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", + "dev": true + }, "big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -42027,6 +46266,70 @@ "safe-json-parse": "~1.0.1" } }, + "body-parser": { + "version": "1.20.6", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.6.tgz", + "integrity": "sha512-p5tAzS57i5MV9fZFDj9LeIiTZEufbSe2eDozP+ElheSUq1m74CRq1jI4mYNDdVs9vQztXFLuk/Gd6BWTdwRJ5g==", + "dev": true, + "requires": { + "bytes": "~3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.15.1", + "raw-body": "~2.5.3", + "type-is": "~1.6.18", + "unpipe": "~1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "raw-body": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", + "dev": true, + "requires": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" + } + } + } + }, "body-scroll-lock": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/body-scroll-lock/-/body-scroll-lock-3.1.5.tgz", @@ -42039,6 +46342,12 @@ "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", "dev": true }, + "bottleneck": { + "version": "2.19.5", + "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz", + "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==", + "dev": true + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -42091,6 +46400,12 @@ "node-int64": "^0.4.0" } }, + "btoa-lite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/btoa-lite/-/btoa-lite-1.0.0.tgz", + "integrity": "sha512-gvW7InbIyF8AicrqWoptdW08pUxuhq8BEgowNajy9RhiE86fmGAGl+bLKo6oB8QP0CkqHLowfN0oJdKC/J6LbA==", + "dev": true + }, "buffer": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", @@ -42129,6 +46444,12 @@ "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", "dev": true }, + "buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "dev": true + }, "buffer-fill": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", @@ -42232,13 +46553,35 @@ } }, "call-bind": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", + "dev": true, + "requires": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "get-intrinsic": "^1.3.0", + "set-function-length": "^1.2.2" + } + }, + "call-bind-apply-helpers": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "dev": true, "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + } + }, + "call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "requires": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" } }, "caller-callsite": { @@ -42682,6 +47025,12 @@ "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz", "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==" }, + "clean-git-ref": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/clean-git-ref/-/clean-git-ref-2.0.1.tgz", + "integrity": "sha512-bLSptAy2P0s6hU4PzuIMKmMJJSE6gLXGH1cntDu7bWJUksvuM+7ReOK61mozULErYvP6a15rnYl0zFDef+pyPw==", + "dev": true + }, "clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", @@ -43278,14 +47627,28 @@ } }, "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dev": true, "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "5.2.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } } }, + "content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true + }, "continuable-cache": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/continuable-cache/-/continuable-cache-0.3.1.tgz", @@ -43301,6 +47664,18 @@ "safe-buffer": "~5.1.1" } }, + "cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "dev": true + }, + "cookie-signature": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", + "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", + "dev": true + }, "copy-descriptor": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", @@ -43379,6 +47754,12 @@ "resolved": "https://registry.npmjs.org/counterup2/-/counterup2-2.0.2.tgz", "integrity": "sha512-+drmqOOcOa17KJG9o5+wGuEgLVh4wdb2pkpGlCu3MtQ2idB73V8yJEb8WyINZ1+Fjy7dLiWKa0wihvYzk/n32A==" }, + "crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "dev": true + }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", @@ -43440,8 +47821,7 @@ "version": "6.4.0", "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.0.tgz", "integrity": "sha512-jDfsatwWMWN0MODAFuHszfjphEXfNw9JUAhmY4pLu3TyTU+ohUpsbVtbU+1MZn4a47D9kqh03i4eyOm+74+zew==", - "dev": true, - "requires": {} + "dev": true }, "css-loader": { "version": "6.5.1", @@ -43699,8 +48079,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-4.0.0.tgz", "integrity": "sha512-Z39TLP+1E0KUcd7LGyF4qMfu8ZufI0rDzhdyAMsa/8UyNUU8wpS0fhdBxbQbv32r64ea00h4878gommRVg2BHw==", - "dev": true, - "requires": {} + "dev": true }, "csso": { "version": "4.2.0", @@ -44119,6 +48498,17 @@ "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", "dev": true }, + "define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "requires": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + } + }, "define-lazy-prop": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", @@ -44277,6 +48667,24 @@ } } }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true + }, + "deprecation": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", + "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", + "dev": true + }, + "destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true + }, "detect-file": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", @@ -44307,6 +48715,12 @@ "integrity": "sha512-ag6wfpBFyNXZ0p8pcuIDS//D8H062ZQJ3fzYxjpmeKjnz8W4pekL3AI8VohmyZmsWW2PWaHgjsmqR6L13101VQ==", "dev": true }, + "diff3": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/diff3/-/diff3-0.0.3.tgz", + "integrity": "sha512-iSq8ngPOt0K53A6eVr4d5Kn6GNrM2nQZtC740pzIriHtn4pOQ2lyzEXQMBeVcWERN0ye7fhBsk9PbLLQOnUx/g==", + "dev": true + }, "dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -44592,12 +49006,6 @@ } } }, - "dotenv": { - "version": "16.4.7", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", - "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", - "dev": true - }, "download": { "version": "6.2.5", "resolved": "https://registry.npmjs.org/download/-/download-6.2.5.tgz", @@ -44712,6 +49120,17 @@ } } }, + "dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "requires": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + } + }, "duplexer": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", @@ -44807,6 +49226,21 @@ "object.defaults": "^1.1.0" } }, + "ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, "electron-to-chromium": { "version": "1.4.392", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.392.tgz", @@ -44843,6 +49277,12 @@ "integrity": "sha1-nrpoN9FtCYK1n4fYib91REPVKTE=", "dev": true }, + "encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true + }, "encoding": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", @@ -45001,12 +49441,33 @@ "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", "dev": true }, + "es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true + }, + "es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true + }, "es-module-lexer": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", "dev": true }, + "es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "dev": true, + "requires": { + "es-errors": "^1.3.0" + } + }, "es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", @@ -45068,6 +49529,12 @@ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -45331,8 +49798,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-7.2.0.tgz", "integrity": "sha512-rV4Qu0C3nfJKPOAhFujFxB7RMP+URFyQqqOZW9DMRD7ZDTFyjaIlETU3xzHELt++4ugC0+Jm084HQYkkJe+Ivg==", - "dev": true, - "requires": {} + "dev": true }, "eslint-import-resolver-node": { "version": "0.3.6", @@ -45698,8 +50164,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.3.0.tgz", "integrity": "sha512-XslZy0LnMn+84NEG9jSGR6eGqaZB3133L8xewQo3fQagbQuGt7a63gf+P1NGKZavEYEC3UXaWEAA/AqDkuN6xA==", - "dev": true, - "requires": {} + "dev": true }, "eslint-plugin-stackable": { "version": "file:eslint" @@ -45808,6 +50273,18 @@ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true + }, + "event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "dev": true + }, "events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", @@ -46028,6 +50505,68 @@ "integrity": "sha512-6Ey4Xy2xvmuQu7z7YQtMsaMV0EHJRpVxIDOd5GRrm04/I3nkTKIutELfECsLp6le+b3SSa3cXhPiw6PgqzxYWA==", "dev": true }, + "express": { + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.2.tgz", + "integrity": "sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q==", + "dev": true, + "requires": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "~1.20.5", + "content-disposition": "~0.5.4", + "content-type": "~1.0.4", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "~0.1.12", + "proxy-addr": "~2.0.7", + "qs": "~6.15.1", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "~0.19.0", + "serve-static": "~1.16.2", + "setprototypeof": "1.2.0", + "statuses": "~2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, "ext": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/ext/-/ext-1.6.0.tgz", @@ -46239,6 +50778,36 @@ "integrity": "sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw==", "dev": true }, + "fast-uri": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.5.tgz", + "integrity": "sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==", + "dev": true + }, + "fast-xml-builder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.3.0.tgz", + "integrity": "sha512-F74cZEdCvuw9P41GAC3rod4X04jjWGM1JPEv/GWSqFTWLsdyMSBMBMlm9Hk3GLBgLBbdBNY8yee0pQh2RBVESQ==", + "dev": true, + "requires": { + "path-expression-matcher": "^1.6.2", + "xml-naming": "^0.3.0" + } + }, + "fast-xml-parser": { + "version": "5.10.1", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.10.1.tgz", + "integrity": "sha512-IEMIf7298kXuZSRFoGfMYrl7is8LpavODgbNz1cwIudv7KwVFnuU+UsMporfq6PD6aXSlawZlARiA3UywCTfMw==", + "dev": true, + "requires": { + "@nodable/entities": "^3.0.0", + "fast-xml-builder": "^1.2.0", + "is-unsafe": "^2.0.0", + "path-expression-matcher": "^1.6.2", + "strnum": "^2.4.1", + "xml-naming": "^0.3.0" + } + }, "fastest-levenshtein": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", @@ -46362,6 +50931,38 @@ "to-regex-range": "^5.0.1" } }, + "finalhandler": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", + "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "statuses": "~2.0.2", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, "find-cache-dir": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", @@ -46777,6 +51378,15 @@ "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==", "dev": true }, + "for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "requires": { + "is-callable": "^1.2.7" + } + }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -46803,6 +51413,12 @@ "mime-types": "^2.1.12" } }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true + }, "fraction.js": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.2.tgz", @@ -46860,6 +51476,12 @@ "tslib": "^2.1.0" } }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true + }, "from2": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", @@ -46908,6 +51530,15 @@ "integrity": "sha1-mC1ok6+RjnLQjeyehnP/K1qNat0=", "dev": true }, + "fs-ext-extra-prebuilt": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/fs-ext-extra-prebuilt/-/fs-ext-extra-prebuilt-2.2.7.tgz", + "integrity": "sha512-Q7rayYRBDIvDF01HWOwSSjoaP+05N1g+o3BXL1Zf8Frw2JkjSmi4EtvCBITuW30l6hB2m2TW1pehdh8wyU/+gw==", + "dev": true, + "requires": { + "nan": "^2.24.0" + } + }, "fs-extra": { "version": "0.26.7", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.26.7.tgz", @@ -46965,9 +51596,9 @@ "optional": true }, "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true }, "function.prototype.name": { @@ -47007,14 +51638,21 @@ "dev": true }, "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dev": true, "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" } }, "get-own-enumerable-property-symbols": { @@ -47035,6 +51673,16 @@ "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==", "dev": true }, + "get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "requires": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + } + }, "get-proxy": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/get-proxy/-/get-proxy-2.1.0.tgz", @@ -47543,6 +52191,12 @@ "delegate": "^3.1.2" } }, + "gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true + }, "got": { "version": "11.8.5", "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz", @@ -48185,6 +52839,15 @@ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, + "has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "requires": { + "es-define-property": "^1.0.0" + } + }, "has-symbol-support-x": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", @@ -48192,9 +52855,9 @@ "dev": true }, "has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "dev": true }, "has-to-string-tag-x": { @@ -48207,12 +52870,12 @@ } }, "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, "requires": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" } }, "has-value": { @@ -48267,6 +52930,15 @@ } } }, + "hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "dev": true, + "requires": { + "function-bind": "^1.1.2" + } + }, "header-case": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", @@ -48407,6 +53079,19 @@ "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", "dev": true }, + "http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "dev": true, + "requires": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + } + }, "http-link-header": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/http-link-header/-/http-link-header-1.1.3.tgz", @@ -48585,8 +53270,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true, - "requires": {} + "dev": true }, "ieee754": { "version": "1.2.1", @@ -48985,6 +53669,12 @@ "sprintf-js": "^1.1.3" } }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true + }, "irregular-plurals": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-3.3.0.tgz", @@ -49077,9 +53767,9 @@ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, "is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true }, "is-ci": { @@ -49394,6 +54084,15 @@ "integrity": "sha512-LAYzo9kMT1b2p19L/1ATGt2XcSilnzNlyvq6c0pbPRVisLbAPpLqr53tIJS00kvrTkj0HtR8U7+u8X0yR8lPSw==", "dev": true }, + "is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "requires": { + "which-typed-array": "^1.1.16" + } + }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -49415,6 +54114,12 @@ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true }, + "is-unsafe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-unsafe/-/is-unsafe-2.0.0.tgz", + "integrity": "sha512-2LdV822R+wmI86unXA93WCFpL6g+av8ynWk0nrHyJqGop5VoocYsSLFgN8jrfalT6iGeLNM4KXuVSsULP53kEA==", + "dev": true + }, "is-utf8": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", @@ -49469,6 +54174,50 @@ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, + "isomorphic-git": { + "version": "1.37.6", + "resolved": "https://registry.npmjs.org/isomorphic-git/-/isomorphic-git-1.37.6.tgz", + "integrity": "sha512-qr1NFCPsVTZ6YGqTXw0CzamnsHyH9QQ1OTEfeXIweSljRUMzuHFCJdUn0wc6OcjtTDns6knxjPb7N6LmJeftOA==", + "dev": true, + "requires": { + "async-lock": "^1.4.1", + "clean-git-ref": "^2.0.1", + "crc-32": "^1.2.0", + "diff3": "0.0.3", + "ignore": "^5.1.4", + "minimisted": "^2.0.0", + "pako": "^1.0.10", + "pify": "^4.0.1", + "readable-stream": "^4.0.0", + "sha.js": "^2.4.12", + "simple-get": "^4.0.1" + }, + "dependencies": { + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "dev": true, + "requires": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + } + } + } + }, "istanbul-lib-coverage": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", @@ -51416,8 +56165,7 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", - "dev": true, - "requires": {} + "dev": true }, "jest-regex-util": { "version": "26.0.0", @@ -52669,6 +57417,32 @@ "universalify": "^0.1.2" } }, + "jsonwebtoken": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", + "integrity": "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==", + "dev": true, + "requires": { + "jws": "^4.0.1", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "dependencies": { + "semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "dev": true + } + } + }, "jsx-ast-utils": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.1.tgz", @@ -52691,6 +57465,27 @@ "integrity": "sha512-qpcRocdkUmf+UTNBYx5w6dexX5J31AKK1OmPwH630a83DdVVUIngk55RSAiIGpQyoH0dlr872VHfPjnQnK1qDQ==", "dev": true }, + "jwa": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", + "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", + "dev": true, + "requires": { + "buffer-equal-constant-time": "^1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", + "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", + "dev": true, + "requires": { + "jwa": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, "keyv": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz", @@ -53028,8 +57823,7 @@ "version": "8.18.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", - "dev": true, - "requires": {} + "dev": true } } }, @@ -53630,12 +58424,48 @@ "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", "dev": true }, + "lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", + "dev": true + }, + "lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", + "dev": true + }, "lodash.isequal": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=", "dev": true }, + "lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", + "dev": true + }, + "lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", + "dev": true + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "dev": true + }, "lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -53648,6 +58478,12 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "dev": true + }, "lodash.template": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", @@ -54191,6 +59027,12 @@ } } }, + "math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true + }, "mathml-tag-names": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", @@ -54252,6 +59094,12 @@ "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", "dev": true }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true + }, "memize": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/memize/-/memize-1.1.0.tgz", @@ -54376,6 +59224,12 @@ } } }, + "merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "dev": true + }, "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -54394,6 +59248,12 @@ "integrity": "sha512-EoYJ8xfjQ6kpe9VbVHvZTZHiOl4HL1Z18CrZ+qahvLXT7ZO4YTC2JMyt5FaUp9JJp6J4Ybb/z7IsCXZt86/QkQ==", "dev": true }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true + }, "micromark": { "version": "2.11.4", "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.11.4.tgz", @@ -54537,6 +59397,15 @@ } } }, + "minimisted": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/minimisted/-/minimisted-2.0.1.tgz", + "integrity": "sha512-1oPjfuLQa2caorJUM8HV8lGgWCc0qqAO1MNv/k05G4qslmsndV/5WdNZrqCiyqiz3wohia2Ij2B7w2Dr7/IyrA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, "mitt": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", @@ -54660,11 +59529,10 @@ "dev": true }, "nan": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", - "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", - "dev": true, - "optional": true + "version": "2.28.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.28.0.tgz", + "integrity": "sha512-fTsDz99OTq2sVePhGdp4qQhggZFtKr64ZNVyVajRKtMOkJxYekplBh577PiJB12v/D3s2E5cGtOI45LWp6rnLQ==", + "dev": true }, "nanoid": { "version": "3.2.0", @@ -54709,6 +59577,12 @@ "randexp": "0.4.6" } }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true + }, "neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", @@ -55063,9 +59937,9 @@ "dev": true }, "object-inspect": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", - "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "dev": true }, "object-is": { @@ -55233,6 +60107,33 @@ "es-abstract": "^1.19.1" } }, + "octokit": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/octokit/-/octokit-3.1.2.tgz", + "integrity": "sha512-MG5qmrTL5y8KYwFgE1A4JWmgfQBaIETE/lOlfwNYx1QOtCQHGVxkRJmdUJltFc1HVn73d61TlMhMyNTOtMl+ng==", + "dev": true, + "requires": { + "@octokit/app": "^14.0.2", + "@octokit/core": "^5.0.0", + "@octokit/oauth-app": "^6.0.0", + "@octokit/plugin-paginate-graphql": "^4.0.0", + "@octokit/plugin-paginate-rest": "^9.0.0", + "@octokit/plugin-rest-endpoint-methods": "^10.0.0", + "@octokit/plugin-retry": "^6.0.0", + "@octokit/plugin-throttling": "^8.0.0", + "@octokit/request-error": "^5.0.0", + "@octokit/types": "^12.0.0" + } + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -55569,6 +60470,12 @@ "netmask": "^2.0.2" } }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, "param-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", @@ -55657,6 +60564,12 @@ "parse5": "^6.0.1" } }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, "pascal-case": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", @@ -55693,6 +60606,12 @@ "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "dev": true }, + "path-expression-matcher": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.6.2.tgz", + "integrity": "sha512-enSlaiat05iasnzmgNxRj8reFdj3puY2QpNgP1aPIaVfT6nn9ICuPoFlKHk8EN22HcwewshO+mN2DGbkCEOtqQ==", + "dev": true + }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -55738,6 +60657,12 @@ "integrity": "sha512-3UHTHbJz5+NLkPafFR+2ycJOjoc4WV2e9qCZCnm71zHiWaFrm1XniLVTkZXvaRgxr1xFh9JsTdicpH2yM03nLA==", "dev": true }, + "path-to-regexp": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz", + "integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==", + "dev": true + }, "path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -56044,6 +60969,12 @@ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", "dev": true }, + "possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true + }, "postcss": { "version": "8.3.11", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.11.tgz", @@ -56091,29 +61022,25 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.0.tgz", "integrity": "sha512-p2skSGqzPMZkEQvJsgnkBhCn8gI7NzRH2683EEjrIkoMiwRELx68yoUJ3q3DGSGuQ8Ug9Gsn+OuDr46yfO+eFw==", - "dev": true, - "requires": {} + "dev": true }, "postcss-discard-duplicates": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.0.tgz", "integrity": "sha512-bU1SXIizMLtDW4oSsi5C/xHKbhLlhek/0/yCnoMQany9k3nPBq+Ctsv/9oMmyqbR96HYHxZcHyK2HR5P/mqoGA==", - "dev": true, - "requires": {} + "dev": true }, "postcss-discard-empty": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-6.0.0.tgz", "integrity": "sha512-b+h1S1VT6dNhpcg+LpyiUrdnEZfICF0my7HAKgJixJLW7BnNmpRH34+uw/etf5AhOlIhIAuXApSzzDzMI9K/gQ==", - "dev": true, - "requires": {} + "dev": true }, "postcss-discard-overridden": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-6.0.0.tgz", "integrity": "sha512-4VELwssYXDFigPYAZ8vL4yX4mUepF/oCBeeIT4OXsJPYOtvJumyz9WflmJWTfDwCUcpDR+z0zvCWBXgTx35SVw==", - "dev": true, - "requires": {} + "dev": true }, "postcss-html": { "version": "0.36.0", @@ -56293,8 +61220,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "dev": true, - "requires": {} + "dev": true }, "postcss-modules-local-by-default": { "version": "4.0.0", @@ -56329,8 +61255,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-6.0.0.tgz", "integrity": "sha512-cqundwChbu8yO/gSWkuFDmKrCZ2vJzDAocheT2JTd0sFNA4HMGoKMfbk2B+J0OmO0t5GUkiAkSM5yF2rSLUjgQ==", - "dev": true, - "requires": {} + "dev": true }, "postcss-normalize-display-values": { "version": "6.0.0", @@ -56706,8 +61631,7 @@ "version": "0.36.2", "resolved": "https://registry.npmjs.org/postcss-syntax/-/postcss-syntax-0.36.2.tgz", "integrity": "sha512-nBRg/i7E3SOHWxF3PpF5WnJM/jQ1YpY9000OaVXlAQj6Zp/kIqJxEDWIZ67tAd7NLuk7zqN4yqe9nc0oNAOs1w==", - "dev": true, - "requires": {} + "dev": true }, "postcss-unique-selectors": { "version": "6.0.0", @@ -56841,6 +61765,12 @@ "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", "dev": true }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true + }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -56890,6 +61820,16 @@ "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", "dev": true }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, "proxy-agent": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz", @@ -57085,8 +62025,7 @@ "version": "7.4.6", "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", - "dev": true, - "requires": {} + "dev": true } } }, @@ -57097,12 +62036,13 @@ "dev": true }, "qs": { - "version": "6.10.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", - "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", + "version": "6.15.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", + "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==", "dev": true, "requires": { - "side-channel": "^1.0.4" + "es-define-property": "^1.0.1", + "side-channel": "^1.1.1" } }, "query-string": { @@ -57174,6 +62114,12 @@ "safe-buffer": "^5.1.0" } }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, "raw-body": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.1.7.tgz", @@ -57225,6 +62171,7 @@ "version": "17.0.2", "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "dev": true, "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1" @@ -57274,8 +62221,7 @@ "version": "5.5.1", "resolved": "https://registry.npmjs.org/react-colorful/-/react-colorful-5.5.1.tgz", "integrity": "sha512-M1TJH2X3RXEt12sWkpa6hLc/bbYS0H6F4rIqjQZ+RxNBstpY67d9TrFXtqdZwhpmBXcCwEi7stKqFue3ZRkiOg==", - "dev": true, - "requires": {} + "dev": true }, "react-compound-slider": { "version": "3.4.0", @@ -57312,6 +62258,7 @@ "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", + "dev": true, "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", @@ -57384,8 +62331,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/react-resize-aware/-/react-resize-aware-3.1.1.tgz", "integrity": "sha512-M8IyVLBN8D6tEUss+bxQlWte3ZYtNEGhg7rBxtCVG8yEBjUlZwUo5EFLq6tnvTZXcgAbCLjsQn+NCoTJKumRYg==", - "dev": true, - "requires": {} + "dev": true }, "react-shallow-renderer": { "version": "16.14.1", @@ -57446,8 +62392,7 @@ "version": "9.1.3", "resolved": "https://registry.npmjs.org/react-use-gesture/-/react-use-gesture-9.1.3.tgz", "integrity": "sha512-CdqA2SmS/fj3kkS2W8ZU8wjTbVBAIwDWaRprX7OKaj7HlGwBasGEFggmk5qNklknqk9zK/h8D355bEJFTpqEMg==", - "dev": true, - "requires": {} + "dev": true }, "react-with-direction": { "version": "1.4.0", @@ -57620,8 +62565,7 @@ "version": "0.15.2", "resolved": "https://registry.npmjs.org/reakit-utils/-/reakit-utils-0.15.2.tgz", "integrity": "sha512-i/RYkq+W6hvfFmXw5QW7zvfJJT/K8a4qZ0hjA79T61JAFPGt23DsfxwyBbyK91GZrJ9HMrXFVXWMovsKBc1qEQ==", - "dev": true, - "requires": {} + "dev": true }, "reakit-warning": { "version": "0.6.2", @@ -58391,6 +63335,7 @@ "version": "0.20.2", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "dev": true, "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1" @@ -58471,6 +63416,58 @@ } } }, + "send": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.4.1", + "range-parser": "~1.2.1", + "statuses": "~2.0.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + } + } + }, "sentence-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", @@ -58490,12 +63487,38 @@ "randombytes": "^2.1.0" } }, + "serve-static": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", + "dev": true, + "requires": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "~0.19.1" + } + }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, + "set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "requires": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + } + }, "set-value": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", @@ -58519,6 +63542,31 @@ } } }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "sha.js": { + "version": "2.4.12", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.12.tgz", + "integrity": "sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1", + "to-buffer": "^1.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, "shallow-clone": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz", @@ -58585,14 +63633,51 @@ } }, "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", "dev": true, "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + } + }, + "side-channel-list": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "dev": true, + "requires": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + } + }, + "side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "requires": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + } + }, + "side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "requires": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" } }, "signal-exit": { @@ -58601,6 +63686,40 @@ "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", "dev": true }, + "simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "dev": true + }, + "simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "dev": true, + "requires": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + }, + "dependencies": { + "decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "requires": { + "mimic-response": "^3.1.0" + } + }, + "mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true + } + } + }, "simple-html-tokenizer": { "version": "0.5.11", "resolved": "https://registry.npmjs.org/simple-html-tokenizer/-/simple-html-tokenizer-0.5.11.tgz", @@ -59118,6 +64237,12 @@ } } }, + "statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "dev": true + }, "stream-exhaust": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", @@ -59346,6 +64471,15 @@ "resolved": "https://registry.npmjs.org/striptags/-/striptags-3.2.0.tgz", "integrity": "sha512-g45ZOGzHDMe2bdYMdIvdAfCQkCTDMGBazSw1ypMowwGIee7ZQ5dU0rBJ8Jqgl+jAKIv4dbeE1jscZq9wid1Tkw==" }, + "strnum": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.4.1.tgz", + "integrity": "sha512-M9eUSMT2dCB2cTNPG7UYj6KuK7RJR2SN2+yCV/fTW3xzTCS6EaGZ5pSMgDIjB7r8zSfTGk+dvvn9rTjpVS9Mwg==", + "dev": true, + "requires": { + "anynum": "^1.0.1" + } + }, "style-search": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz", @@ -59699,8 +64833,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-3.0.0.tgz", "integrity": "sha512-F6yTRuc06xr1h5Qw/ykb2LuFynJ2IxkKfCMf+1xqPffkxh0S09Zc902XCffcsw/XMFq/OzQ1w54fLIDtmRNHnQ==", - "dev": true, - "requires": {} + "dev": true }, "stylelint-config-recommended-scss": { "version": "4.3.0", @@ -59715,8 +64848,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-5.0.0.tgz", "integrity": "sha512-c8aubuARSu5A3vEHLBeOSJt1udOdS+1iue7BmJDTSXoCBmfEQmmWX+59vYIj3NQdJBY6a/QRv1ozVFpaB9jaqA==", - "dev": true, - "requires": {} + "dev": true } } }, @@ -60259,6 +65391,21 @@ "tldts-core": "^6.1.70" } }, + "tmp": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.7.tgz", + "integrity": "sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==", + "dev": true + }, + "tmp-promise": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", + "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", + "dev": true, + "requires": { + "tmp": "^0.2.0" + } + }, "tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -60276,10 +65423,29 @@ } }, "to-buffer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", - "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", - "dev": true + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.2.tgz", + "integrity": "sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==", + "dev": true, + "requires": { + "isarray": "^2.0.5", + "safe-buffer": "^5.2.1", + "typed-array-buffer": "^1.0.3" + }, + "dependencies": { + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } }, "to-fast-properties": { "version": "2.0.0", @@ -60337,6 +65503,12 @@ "through2": "^2.0.3" } }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true + }, "totalist": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", @@ -60489,6 +65661,27 @@ "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "requires": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + } + }, "typed-query-selector": { "version": "2.12.0", "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.0.tgz", @@ -60510,13 +65703,6 @@ "is-typedarray": "^1.0.0" } }, - "typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "dev": true, - "peer": true - }, "uc.micro": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", @@ -60700,12 +65886,34 @@ "@types/unist": "^2.0.2" } }, + "universal-github-app-jwt": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/universal-github-app-jwt/-/universal-github-app-jwt-1.2.0.tgz", + "integrity": "sha512-dncpMpnsKBk0eetwfN8D8OUHGfiDhhJ+mtsbMl+7PfW7mYjiH8LIcqRmYMtzYLgSh47HjfdBtrBwIQ/gizKR3g==", + "dev": true, + "requires": { + "@types/jsonwebtoken": "^9.0.0", + "jsonwebtoken": "^9.0.2" + } + }, + "universal-user-agent": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", + "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", + "dev": true + }, "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true + }, "unquote": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", @@ -60866,8 +66074,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/use-memo-one/-/use-memo-one-1.1.2.tgz", "integrity": "sha512-u2qFKtxLsia/r8qG0ZKkbytbztzRb317XCkT7yP8wxL0tZ/CzK2G+WWie5vWvpyeP7+YoPIwbJoIHJ4Ba4k0oQ==", - "dev": true, - "requires": {} + "dev": true }, "util-deprecate": { "version": "1.0.2", @@ -60887,6 +66094,12 @@ "object.getownpropertydescriptors": "^2.1.0" } }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true + }, "uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", @@ -60943,6 +66156,12 @@ "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=", "dev": true }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true + }, "vfile": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", @@ -61146,6 +66365,12 @@ "loose-envify": "^1.0.0" } }, + "wasm-feature-detect": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/wasm-feature-detect/-/wasm-feature-detect-1.8.0.tgz", + "integrity": "sha512-zksaLKM2fVlnB5jQQDqKXXwYHLQUVH9es+5TOOHwGOVJOCeRBCiPjwSg+3tN2AdTCzjgli4jijCH290kXb/zWQ==", + "dev": true + }, "watchpack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.2.0.tgz", @@ -61567,6 +66792,21 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, + "which-typed-array": { + "version": "1.1.22", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.22.tgz", + "integrity": "sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + } + }, "wildcard": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", @@ -61612,8 +66852,7 @@ "version": "7.5.5", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.5.tgz", "integrity": "sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w==", - "dev": true, - "requires": {} + "dev": true }, "xdg-basedir": { "version": "4.0.0", @@ -61627,6 +66866,12 @@ "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", "dev": true }, + "xml-naming": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/xml-naming/-/xml-naming-0.3.0.tgz", + "integrity": "sha512-ghig2TBE/H11aOVgmahA3MhimvkBr6JIYknH/Dhdk10nXwdbIqBJsbfMxpvFPG8bAw77gN29aQWvKpmVoPlvPQ==", + "dev": true + }, "xml2js": { "version": "0.4.19", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", @@ -61741,6 +66986,12 @@ "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", "dev": true }, + "zstddec": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/zstddec/-/zstddec-0.2.0.tgz", + "integrity": "sha512-oyPnDa1X5c13+Y7mA/FDMNJrn4S8UNBe0KCqtDmor40Re7ALrPN6npFwyYVRRh+PqozZQdeg23QtbcamZnG5rA==", + "dev": true + }, "zwitch": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", diff --git a/package.json b/package.json index c52b5b8f75..ea830254dc 100644 --- a/package.json +++ b/package.json @@ -57,6 +57,7 @@ "@wordpress/jest-preset-default": "^7.0.5", "@wordpress/scripts": "^18.0.1", "@wordpress/stylelint-config": "^19.1.0", + "@wp-playground/cli": "^3.1.49", "acorn": "^6.4.2", "autoprefixer": "^10.4.0", "babel-core": "^7.0.0-bridge.0", @@ -67,7 +68,6 @@ "css-mqpacker": "^7.0.0", "cssnano": "^6.0.1", "delete-empty": "^3.0.0", - "dotenv": "^16.4.7", "eslint-plugin-compat": "^3.11.1", "eslint-plugin-import": "^2.22.1", "eslint-plugin-jest": "^22.21.0", @@ -130,8 +130,13 @@ "prebuild": "node ./tools/ensure-version-number && npm run build:translations-js", "build": "npm run build:translations && npm run clean && npm run update-build-type && concurrently --raw \"npm:build:js\" \"npm:build:css\" \"npm:build:sub-builds\" \"npm:build:translations-php\" && npm run package", "build:no-translate": "npm run clean && npm run update-build-type && concurrently --raw \"npm:build:js\" \"npm:build:css\" \"npm:build:sub-builds\" && npm run package", - "test": "npx playwright test --config e2e/playwright.config.ts", - "test:debug": "npx playwright test --config e2e/playwright.config.ts --ui", + "build:e2e": "npm run build:no-translate", + "build:e2e:premium": "cd pro__premium_only && npm run build:no-translate", + "test": "npm run test:e2e", + "test:e2e": "npx playwright test", + "test:e2e:premium": "npx playwright test -c playwright.premium.config.js", + "test:debug": "npx playwright test --ui", + "test:debug:premium": "npx playwright test -c playwright.premium.config.js --ui", "test-old": "jest --no-cache --watchAll", "test:coverage": "jest --no-cache --coverage", "test:fast": "npm run clean:build && jest", diff --git a/playwright.config.js b/playwright.config.js new file mode 100644 index 0000000000..5d0053c33b --- /dev/null +++ b/playwright.config.js @@ -0,0 +1,74 @@ +/** + * Playwright config for Stackable's free e2e suite. + * + * WordPress is provided by `@wp-playground/cli` (WASM PHP + SQLite) via + * `webServer` — no Docker, MySQL, or local WP install required. + * + * `WP_BASE_URL` must be set before `@wordpress/e2e-test-utils-playwright` is + * first imported (it reads `process.env.WP_BASE_URL` at module load time). + * + * See e2e/readme.md. + */ +const path = require( 'path' ) +const { defineConfig, devices } = require( '@playwright/test' ) + +// Distinct from Cimo (9410) / Ahentic (9400) so suites can run together locally. +const PORT = process.env.WP_PORT || '9420' +const baseURL = process.env.WP_BASE_URL || `http://127.0.0.1:${ PORT }` +process.env.WP_BASE_URL = baseURL +process.env.WP_USERNAME = process.env.WP_USERNAME || 'admin' +process.env.WP_PASSWORD = process.env.WP_PASSWORD || 'password' +process.env.STACKABLE_SLUG = process.env.STACKABLE_SLUG || 'stackable/plugin' + +const STORAGE_STATE_PATH = path.join( __dirname, 'e2e/.auth/admin.json' ) +process.env.STORAGE_STATE_PATH = STORAGE_STATE_PATH + +const PLAYGROUND_BLUEPRINT = path.join( __dirname, 'e2e/playground-blueprint.json' ) +const PHP_VERSION = process.env.WP_PHP_VERSION || '8.2' +const WP_VERSION = process.env.WP_VERSION || 'latest' + +const E2E_META_MU = path.join( + __dirname, + 'e2e/config/stackable-e2e-mu-plugin.php' +) + +module.exports = defineConfig( { + testDir: './e2e/tests', + globalSetup: require.resolve( './e2e/config/global-setup.js' ), + fullyParallel: false, + forbidOnly: !! process.env.CI, + retries: process.env.CI ? 1 : 0, + workers: 1, + timeout: 90_000, + reporter: process.env.CI + ? [ [ './e2e/config/reporter.ts', { outputFolder: './playwright-stk' } ], [ 'github' ], [ 'html', { open: 'never' } ] ] + : [ [ 'list' ], [ 'html', { outputFolder: 'playwright-report', open: 'never' } ] ], + reportSlowTests: null, + webServer: { + command: [ + 'npx @wp-playground/cli server', + '--mount=.:/wordpress/wp-content/plugins/stackable', + `--mount=${ E2E_META_MU }:/wordpress/wp-content/mu-plugins/stackable-e2e.php`, + `--blueprint=${ PLAYGROUND_BLUEPRINT }`, + `--php=${ PHP_VERSION }`, + `--wp=${ WP_VERSION }`, + `--port=${ PORT }`, + '--workers=1', + ].join( ' ' ), + // Use `port`, not `url`: Playground auto-login 302-loops cookie-less probes. + port: Number( PORT ), + reuseExistingServer: ! process.env.CI, + timeout: 180 * 1000, + stdout: 'pipe', + stderr: 'pipe', + }, + use: { + baseURL, + storageState: STORAGE_STATE_PATH, + ignoreHTTPSErrors: true, + screenshot: 'only-on-failure', + trace: 'retain-on-failure', + video: 'retain-on-failure', + ...devices[ 'Desktop Chrome' ], + }, +} ) diff --git a/playwright.premium.config.js b/playwright.premium.config.js new file mode 100644 index 0000000000..0fa081f22f --- /dev/null +++ b/playwright.premium.config.js @@ -0,0 +1,75 @@ +/** + * Playwright config for Stackable's premium e2e suite. + * + * Requires `pro__premium_only/` on disk and a prior `npm run build:e2e:premium`. + * Uses a separate Playground port and mounts the e2e premium-mock + * MU-plugin (in-memory Freemius license + exit activation mode). + * + * See e2e/readme.md. + */ +const path = require( 'path' ) +const { defineConfig, devices } = require( '@playwright/test' ) + +const PORT = process.env.WP_PORT || '9421' +const baseURL = process.env.WP_BASE_URL || `http://127.0.0.1:${ PORT }` +process.env.WP_BASE_URL = baseURL +process.env.WP_USERNAME = process.env.WP_USERNAME || 'admin' +process.env.WP_PASSWORD = process.env.WP_PASSWORD || 'password' +process.env.STACKABLE_SLUG = process.env.STACKABLE_SLUG || 'stackable/plugin' + +const STORAGE_STATE_PATH = path.join( __dirname, 'e2e/.auth/admin.premium.json' ) +process.env.STORAGE_STATE_PATH = STORAGE_STATE_PATH + +const PLAYGROUND_BLUEPRINT = path.join( __dirname, 'e2e/playground-blueprint.json' ) +const PHP_VERSION = process.env.WP_PHP_VERSION || '8.2' +const WP_VERSION = process.env.WP_VERSION || 'latest' + +const MOCK_PREMIUM_MU = path.join( + __dirname, + 'pro__premium_only/e2e/mu-plugins/stackable-e2e-mock-premium.php' +) +const E2E_META_MU = path.join( + __dirname, + 'e2e/config/stackable-e2e-mu-plugin.php' +) + +module.exports = defineConfig( { + testDir: './pro__premium_only/e2e/tests', + globalSetup: require.resolve( './e2e/config/global-setup.js' ), + fullyParallel: false, + forbidOnly: !! process.env.CI, + retries: process.env.CI ? 1 : 0, + workers: 1, + timeout: 120_000, + reporter: process.env.CI + ? [ [ './e2e/config/reporter.ts', { outputFolder: './playwright-stk-premium' } ], [ 'github' ], [ 'html', { outputFolder: 'playwright-report-premium', open: 'never' } ] ] + : [ [ 'list' ], [ 'html', { outputFolder: 'playwright-report-premium', open: 'never' } ] ], + reportSlowTests: null, + webServer: { + command: [ + 'npx @wp-playground/cli server', + '--mount=.:/wordpress/wp-content/plugins/stackable', + `--mount=${ E2E_META_MU }:/wordpress/wp-content/mu-plugins/stackable-e2e.php`, + `--mount=${ MOCK_PREMIUM_MU }:/wordpress/wp-content/mu-plugins/stackable-e2e-mock-premium.php`, + `--blueprint=${ PLAYGROUND_BLUEPRINT }`, + `--php=${ PHP_VERSION }`, + `--wp=${ WP_VERSION }`, + `--port=${ PORT }`, + '--workers=1', + ].join( ' ' ), + port: Number( PORT ), + reuseExistingServer: ! process.env.CI, + timeout: 180 * 1000, + stdout: 'pipe', + stderr: 'pipe', + }, + use: { + baseURL, + storageState: STORAGE_STATE_PATH, + ignoreHTTPSErrors: true, + screenshot: 'only-on-failure', + trace: 'retain-on-failure', + video: 'retain-on-failure', + ...devices[ 'Desktop Chrome' ], + }, +} ) diff --git a/tools/playwright-test-matrix.js b/tools/playwright-test-matrix.js index 30a756bc01..818e7d5292 100644 --- a/tools/playwright-test-matrix.js +++ b/tools/playwright-test-matrix.js @@ -18,8 +18,8 @@ const PLAYWRIGHT_MATRIX_START = '# stackable-playwright-matrix-start' const PLAYWRIGHT_MATRIX_END = '# stackable-playwright-matrix-end' const PLAYWRIGHT_WORKFLOW_PATHS = [ - '.github/workflows/playwright.yml', - 'pro__premium_only/.github/workflows/playwright.yml', + '.github/workflows/e2e-tests.yml', + 'pro__premium_only/.github/workflows/e2e-tests.yml', ] /** @@ -29,7 +29,7 @@ const PLAYWRIGHT_WORKFLOW_PATHS = [ const LATEST_WP_MAX_PHP = '8.5' /** - * Normalize API values like "7.2.24" to wp-env/readme form "7.2". + * Normalize API values like "7.2.24" to Playground/readme form "7.2". * * @param {string} phpVersion * @return {string} Normalized PHP version @@ -116,6 +116,14 @@ const resolveLatestWordPressPatch = ( versionString, releases ) => { return matches.sort( ( a, b ) => compareVersions( b.version, a.version ) )[ 0 ].version } +/** + * Playground CLI accepts major.minor (or latest/nightly), not patch builds. + * + * @param {string} versionString + * @return {string} Playground --wp value + */ +const toPlaygroundWpVersion = versionString => getMinorKey( versionString ) + /** * @param {Object} options * @param {string} options.testedUpTo Readme "Tested up to" value (synced from WP API during build). @@ -130,9 +138,15 @@ const buildPlaywrightMatrix = ( { subtractMinorVersions( testedUpTo, 2 ), subtractMinorVersions( testedUpTo, 1 ), testedUpTo, - ].map( version => resolveLatestWordPressPatch( version, releases ) ) + ].map( version => toPlaygroundWpVersion( resolveLatestWordPressPatch( version, releases ) ) ) + + // Dedupe after collapsing patches to major.minor. + const uniqueVersions = [ ...new Set( supportedVersions ) ] + while ( uniqueVersions.length < 3 ) { + uniqueVersions.unshift( uniqueVersions[ 0 ] ) + } - const latestWp = supportedVersions[ 2 ] + const latestWp = uniqueVersions[ uniqueVersions.length - 1 ] const include = [ { @@ -145,10 +159,10 @@ const buildPlaywrightMatrix = ( { }, ] - for ( let i = 0; i < 2; i++ ) { + for ( let i = 0; i < Math.min( 2, uniqueVersions.length - 1 ); i++ ) { include.push( { php_version: minPhp, - wp_version: supportedVersions[ i ], + wp_version: uniqueVersions[ i ], } ) } @@ -228,4 +242,5 @@ module.exports = { subtractMinorVersions, syncPlaywrightTestMatrix, syncPlaywrightWorkflowFile, + toPlaygroundWpVersion, } diff --git a/tools/update-build-type.js b/tools/update-build-type.js index 8e292cfccf..8bfcf19317 100644 --- a/tools/update-build-type.js +++ b/tools/update-build-type.js @@ -6,16 +6,18 @@ const path = require( 'path' ) const replace = require( 'replace-in-file' ) -const replaceConstant = build => { - replace( { +const replaceConstant = async build => { + const changes = await replace( { files: path.resolve( __dirname, '../plugin.php' ), from: /define\((.*)?STACKABLE_BUILD(.*)?,(.*)?['"]?([a-zA-Z\d\-.])*['"]?(.*)?\)/, to: `define( 'STACKABLE_BUILD', '${ build }' )`, - } ).then( changes => { - if ( changes.length ) { - console.log( `Updated STACKABLE_BUILD const to ${ build }...` ) // eslint-disable-line - } } ) + if ( changes.length ) { + console.log( `Updated STACKABLE_BUILD const to ${ build }...` ) // eslint-disable-line + } } -replaceConstant( process.argv[ 2 ] || 'free' ) +replaceConstant( process.argv[ 2 ] || 'free' ).catch( error => { + console.error( error ) // eslint-disable-line + process.exit( 1 ) +} ) From 3369efd556c504c2688c2d9f1ed7fc0f853f044c Mon Sep 17 00:00:00 2001 From: bfintal Date: Thu, 13 Aug 2026 18:18:34 +0800 Subject: [PATCH 02/13] ci: run compressed-size action on Node LTS Playground CLI needs Node 20+ native addons, so drop the Node 14 workaround and install with --legacy-peer-deps. --- .github/workflows/compressed-diff.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/compressed-diff.yml b/.github/workflows/compressed-diff.yml index e2dcef9d3f..2c1bda7686 100644 --- a/.github/workflows/compressed-diff.yml +++ b/.github/workflows/compressed-diff.yml @@ -19,13 +19,14 @@ jobs: - name: Install Composer Dependencies run: | composer install --prefer-dist --no-progress --ignore-platform-reqs - - name: Setup Node # Fix because we can't do npm ci --legacy-peer-deps - uses: actions/setup-node@v1 + - name: Setup Node + uses: actions/setup-node@v4 with: - node-version: 14.x + node-version: lts/* - uses: preactjs/compressed-size-action@v2 with: repo-token: "${{ secrets.GITHUB_TOKEN }}" + install-script: "npm ci --legacy-peer-deps" build-script: "build:no-translate" clean-script: "clean" pattern: "./build/stackable/**" From a9c4f3426b9381706a70ae974b38924705457028 Mon Sep 17 00:00:00 2001 From: bfintal Date: Thu, 13 Aug 2026 18:34:12 +0800 Subject: [PATCH 03/13] updated e2e tests --- .github/workflows/e2e-tests.yml | 47 +++++ .gitignore | 4 + AGENTS.md | 1 + e2e/config/blocks-catalog.d.ts | 1 + e2e/config/blocks-catalog.js | 54 ++++++ e2e/config/global-setup-upgrade.js | 24 +++ e2e/config/upgrade-blueprint.js | 46 +++++ e2e/config/upgrade-from.d.ts | 4 + e2e/config/upgrade-from.js | 11 ++ e2e/readme.md | 79 ++++++++- e2e/test-utils/block-recovery.ts | 22 +++ e2e/test-utils/catalog.ts | 37 ++++ e2e/test-utils/editor.ts | 13 -- e2e/test-utils/frontend.ts | 50 ++++++ e2e/test-utils/index.ts | 5 + e2e/test-utils/inspector.ts | 40 +++++ e2e/test-utils/requestUtils.ts | 13 +- e2e/test-utils/stackable.ts | 29 ++++ .../upgrade-from-old-version.spec.ts | 53 ++++++ e2e/tests/admin.spec.ts | 26 +++ e2e/tests/block-catalog.spec.ts | 51 ++++++ e2e/tests/existing-blocks.spec.ts | 10 +- e2e/tests/frontend-interactive.spec.ts | 164 ++++++++++++++++++ e2e/tests/global-settings.spec.ts | 53 ++++++ package.json | 2 + playwright.upgrade.config.js | 77 ++++++++ .../font-family-control/google-fonts.json | 12 +- src/dynamic-breakpoints.php | 2 +- 28 files changed, 897 insertions(+), 33 deletions(-) create mode 100644 e2e/config/blocks-catalog.d.ts create mode 100644 e2e/config/blocks-catalog.js create mode 100644 e2e/config/global-setup-upgrade.js create mode 100644 e2e/config/upgrade-blueprint.js create mode 100644 e2e/config/upgrade-from.d.ts create mode 100644 e2e/config/upgrade-from.js create mode 100644 e2e/test-utils/block-recovery.ts create mode 100644 e2e/test-utils/catalog.ts create mode 100644 e2e/test-utils/frontend.ts create mode 100644 e2e/test-utils/inspector.ts create mode 100644 e2e/tests-upgrade/upgrade-from-old-version.spec.ts create mode 100644 e2e/tests/block-catalog.spec.ts create mode 100644 e2e/tests/frontend-interactive.spec.ts create mode 100644 playwright.upgrade.config.js diff --git a/.github/workflows/e2e-tests.yml b/.github/workflows/e2e-tests.yml index 8b35a223d4..b5e49a7b99 100644 --- a/.github/workflows/e2e-tests.yml +++ b/.github/workflows/e2e-tests.yml @@ -104,3 +104,50 @@ jobs: run: | echo "${{ steps.mto.outputs.body }}" >> $GITHUB_STEP_SUMMARY echo "Report: [playwright-report-php_${{ matrix.php_version }}-wp_${{ matrix.wp_version }}-${{ env.VERSION_SUFFIX }}.zip](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}/artifacts/${{ steps.artifact-upload-step.outputs.artifact-id }})" >> $GITHUB_STEP_SUMMARY + + upgrade: + needs: build + timeout-minutes: 60 + runs-on: ubuntu-latest + name: Upgrade e2e (3.19.0 to current) + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: lts/* + cache: npm + cache-dependency-path: package-lock.json + - name: Restore plugin build + uses: actions/download-artifact@v4 + with: + name: stackable-e2e-build + - name: Extract plugin build + run: tar -xzf stackable-e2e-build.tar.gz + - name: Install dependencies + run: npm ci --legacy-peer-deps + - name: Cache Playwright Browsers + uses: actions/cache@v4 + with: + path: ~/.cache/ms-playwright + key: ${{ runner.os }}-playwright-${{ hashFiles('package-lock.json') }} + restore-keys: | + ${{ runner.os }}-playwright- + - name: Install Playwright Browsers + timeout-minutes: 15 + run: | + for attempt in 1 2 3; do + npx playwright install chromium --with-deps && exit 0 + echo "Playwright install failed on attempt $attempt" + sleep $((attempt * 30)) + done + exit 1 + - name: Run upgrade Playwright e2e suite + id: run-upgrade-tests + run: npm run test:e2e:upgrade + - uses: actions/upload-artifact@v4 + if: ${{ !cancelled() && steps.run-upgrade-tests.outcome == 'failure' }} + with: + name: playwright-report-upgrade + path: playwright-report-upgrade/ + overwrite: true + retention-days: 30 diff --git a/.gitignore b/.gitignore index dce847fe88..b5cea72e32 100644 --- a/.gitignore +++ b/.gitignore @@ -22,6 +22,10 @@ composer.lock /test-results/ /playwright-report/ /playwright-report-premium/ +/playwright-report-upgrade/ +/playwright-stk/ +/playwright-stk-premium/ +/playwright-stk-upgrade/ /blob-report/ /playwright/.cache/ e2e/.auth/ diff --git a/AGENTS.md b/AGENTS.md index dceb45f988..adce20d188 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -62,6 +62,7 @@ Do not apply GitHub changes (close, comment, relabel) during issue triage withou - Unit / Jest: `npm run test:scripts` / `npm run test-old` (and related coverage scripts). - Playwright e2e (WordPress Playground, no Docker): see [`e2e/readme.md`](./e2e/readme.md) (`npm run build:e2e` then `npm run test:e2e` / `npm run test:debug`). + Upgrade (3.19.0 → current, isolated port 9422): `npm run test:e2e:upgrade`. Premium: `npm run build:e2e:premium` then `npm run test:e2e:premium` with `pro__premium_only/` present. - Lint: `npm run lint` / `lint-js` / `lint-css` as appropriate for touched files. diff --git a/e2e/config/blocks-catalog.d.ts b/e2e/config/blocks-catalog.d.ts new file mode 100644 index 0000000000..4b56629739 --- /dev/null +++ b/e2e/config/blocks-catalog.d.ts @@ -0,0 +1 @@ +export const TOP_LEVEL_BLOCKS: string[] diff --git a/e2e/config/blocks-catalog.js b/e2e/config/blocks-catalog.js new file mode 100644 index 0000000000..194fe1323e --- /dev/null +++ b/e2e/config/blocks-catalog.js @@ -0,0 +1,54 @@ +/** + * Inserter-facing Stackable blocks for catalog / upgrade smokes. + * Child-only types are omitted; parent templates already include them. + * stackable/design-library is a picker, not saved content. + * + * Keep in sync with inserter-facing stackable blocks in src/block//block.json + * (parent unset, not stk-type child-only). New top-level blocks must be added here. + */ +const TOP_LEVEL_BLOCKS = [ + 'stackable/accordion', + 'stackable/blockquote', + 'stackable/button-group', + 'stackable/call-to-action', + 'stackable/card', + 'stackable/carousel', + 'stackable/columns', + 'stackable/count-up', + 'stackable/countdown', + 'stackable/divider', + 'stackable/expand', + 'stackable/feature', + 'stackable/feature-grid', + 'stackable/heading', + 'stackable/hero', + 'stackable/horizontal-scroller', + 'stackable/icon', + 'stackable/icon-box', + 'stackable/icon-label', + 'stackable/icon-list', + 'stackable/image', + 'stackable/image-box', + 'stackable/map', + 'stackable/notification', + 'stackable/number-box', + 'stackable/posts', + 'stackable/price', + 'stackable/pricing-box', + 'stackable/progress-bar', + 'stackable/progress-circle', + 'stackable/separator', + 'stackable/spacer', + 'stackable/subtitle', + 'stackable/table-of-contents', + 'stackable/tabs', + 'stackable/team-member', + 'stackable/testimonial', + 'stackable/text', + 'stackable/timeline', + 'stackable/video-popup', +] + +module.exports = { + TOP_LEVEL_BLOCKS, +} diff --git a/e2e/config/global-setup-upgrade.js b/e2e/config/global-setup-upgrade.js new file mode 100644 index 0000000000..6345d441a7 --- /dev/null +++ b/e2e/config/global-setup-upgrade.js @@ -0,0 +1,24 @@ +/** + * Auth-only global setup for the upgrade suite. + * Does not require the Existing Blocks fixture post. + */ +const fs = require( 'fs/promises' ) +const path = require( 'path' ) +const { RequestUtils } = require( '@wordpress/e2e-test-utils-playwright' ) + +module.exports = async function globalSetup() { + const storageStatePath = process.env.STORAGE_STATE_PATH + const requestUtils = await RequestUtils.setup( { + user: { + username: process.env.WP_USERNAME || 'admin', + password: process.env.WP_PASSWORD || 'password', + }, + storageStatePath, + baseURL: process.env.WP_BASE_URL, + } ) + + await requestUtils.setupRest() + + const authDir = path.dirname( storageStatePath || path.join( __dirname, '../.auth/admin.upgrade.json' ) ) + await fs.mkdir( authDir, { recursive: true } ) +} diff --git a/e2e/config/upgrade-blueprint.js b/e2e/config/upgrade-blueprint.js new file mode 100644 index 0000000000..d50a45395a --- /dev/null +++ b/e2e/config/upgrade-blueprint.js @@ -0,0 +1,46 @@ +/** + * Upgrade Playground blueprint, generated from upgrade-from.js so the WP.org + * zip URL is not pinned in a second file. + */ +const fs = require( 'fs' ) +const path = require( 'path' ) +const { OLD_PLUGIN_ZIP_URL } = require( './upgrade-from.js' ) + +const UPGRADE_BLUEPRINT = { + $schema: 'https://playground.wordpress.net/blueprint-schema.json', + features: { + networking: true, + }, + steps: [ + { + step: 'login', + username: 'admin', + password: 'password', + }, + { + step: 'installPlugin', + pluginData: { + resource: 'url', + url: OLD_PLUGIN_ZIP_URL, + }, + options: { + activate: true, + }, + }, + { + step: 'runPHP', + code: "is_registered() ) {\n\t\t$fs->skip_connection();\n\t}\n}\n", + }, + ], +} + +const writeUpgradeBlueprint = destPath => { + fs.mkdirSync( path.dirname( destPath ), { recursive: true } ) + fs.writeFileSync( destPath, `${ JSON.stringify( UPGRADE_BLUEPRINT, null, '\t' ) }\n` ) + return destPath +} + +module.exports = { + UPGRADE_BLUEPRINT, + writeUpgradeBlueprint, +} diff --git a/e2e/config/upgrade-from.d.ts b/e2e/config/upgrade-from.d.ts new file mode 100644 index 0000000000..6cda620b1d --- /dev/null +++ b/e2e/config/upgrade-from.d.ts @@ -0,0 +1,4 @@ +export const UPGRADE_FROM_VERSION: string +export const OLD_PLUGIN_SLUG: string +export const CURRENT_PLUGIN_SLUG: string +export const OLD_PLUGIN_ZIP_URL: string diff --git a/e2e/config/upgrade-from.js b/e2e/config/upgrade-from.js new file mode 100644 index 0000000000..2a8bddb772 --- /dev/null +++ b/e2e/config/upgrade-from.js @@ -0,0 +1,11 @@ +/** + * Old Stackable version used by the upgrade e2e project. + * Bump after the current in-tree version ships to WordPress.org. + */ +module.exports = { + UPGRADE_FROM_VERSION: '3.19.0', + OLD_PLUGIN_SLUG: 'stackable-ultimate-gutenberg-blocks/plugin', + CURRENT_PLUGIN_SLUG: 'stackable/plugin', + OLD_PLUGIN_ZIP_URL: + 'https://downloads.wordpress.org/plugin/stackable-ultimate-gutenberg-blocks.3.19.0.zip', +} diff --git a/e2e/readme.md b/e2e/readme.md index c942ccff2c..572dcbd7c5 100644 --- a/e2e/readme.md +++ b/e2e/readme.md @@ -1,7 +1,8 @@ # E2E Testing Stackable's end-to-end tests verify admin pages, block editor flows, global -settings, Design Library, and (premium suite) Dynamic Content / premium settings. +settings, Design Library, frontend view scripts, an old-version upgrade smoke, +and (premium suite) Design System, Global Block Styles, and gated features. WordPress is provided by [`@wp-playground/cli`](https://www.npmjs.com/package/@wp-playground/cli) (WASM PHP + SQLite, **no Docker**). Playwright's `webServer` boots it @@ -38,6 +39,28 @@ or with the Playwright UI: npm run test:debug ``` +### Upgrade suite + +Isolated project on port `9422`. +It installs WordPress.org Stackable **3.19.0**, inserts every top-level block, swaps to the mounted current plugin, and asserts Gutenberg does **not** show Attempt Block Recovery. + +```bash +npm run build:e2e +npm run test:e2e:upgrade +``` + +or with the Playwright UI: + +```bash +npm run test:debug:upgrade +``` + +The old version is pinned in `e2e/config/upgrade-from.js`. +Bump that constant after the in-tree version ships to WordPress.org. +`playwright.upgrade.config.js` writes the Playground blueprint from that pin into `e2e/.auth/upgrade-blueprint.json` (gitignored). +This suite needs network (or a cached zip) to download the old plugin. +Keep it last / isolated so a WP.org outage does not fail the free matrix. + ### Premium suite ```bash @@ -91,30 +114,58 @@ STACKABLE_SLUG=stackable/plugin | Repo | Workflow | Suites | |------|----------|--------| -| Free (`gambitph/Stackable`) | `.github/workflows/e2e-tests.yml` | Free matrix (`build:e2e` → `test:e2e`) | +| Free (`gambitph/Stackable`) | `.github/workflows/e2e-tests.yml` | Free matrix (`build:e2e` → `test:e2e`) plus an isolated upgrade job (`test:e2e:upgrade`) | | Premium (`bfintal/Stackable-Premium`) | `pro__premium_only/.github/workflows/e2e-tests.yml` | Free then premium (checks out free as root + premium as `pro__premium_only/`) | PHP/WP matrix cells are Playground `--php` / `--wp` values (major.minor). `tools/playwright-test-matrix.js` syncs both workflow files. +The upgrade job is not part of that PHP/WP matrix. ## What is covered +Assertions for invalid blocks use **Gutenberg recovery UI only** +("Attempt Block Recovery", "unexpected or invalid content", `.block-editor-warning`). +Do not listen for console `Block validation` messages. + ### Free (`e2e/tests/`) | Surface | Flow | |---------|------| -| Admin | Activate redirects to Getting Started; settings save | +| Admin | Activate redirects to Getting Started; settings save; inner tabs render | | Block editor | Insert Text block; inspector tabs; attribute updates | -| Global settings | Color / typography surfaces | -| Design Library | Open, load patterns, insert | -| Existing blocks | Fixture post from blueprint has no block validation errors | +| Block catalog | `createBlock` every inserter-facing `stackable/*`, save, reload, no recovery UI, frontend `.stk-block` | +| Global settings | Color / typography; spacing & buttons tokens; Preview Design System | +| Design Library | Open, load patterns, insert a free page/pattern | +| Existing blocks | Seeded nested layout post has no recovery UI | +| Interactive frontend | Accordion, Tabs, Carousel, Expand, Video Popup, Notification, scroller, countdown/progress, Map, Posts, TOC | + +### Upgrade (`e2e/tests-upgrade/`) + +| Surface | Flow | +|---------|------| +| 3.19.0 → current | Insert catalog under the old plugin, deactivate it, activate mounted `stackable/plugin`, reopen the post, no recovery UI, frontend `.stk-block` | + +Migrations via `deprecated.js` are allowed. +Recovery is not. ### Premium (`pro__premium_only/e2e/tests/`) +These specs must prove the **feature works**, not that an upsell panel exists. +Fail if a panel still shows `ProControl` / "Get Premium" while premium is mocked. + | Surface | Flow | |---------|------| -| Settings | Role Manager tab available when premium mock is mounted | +| Design System | Sidebar opens; Preview; Color Schemes / Font pairs / Size presets / Icon Library are live controls | +| Global Block Styles | Save a named style from one Text block, apply it to a second; canvas uses the style, inspector stays at defaults and can override | | Dynamic Content | Post title / meta / featured image resolve on the frontend | +| Conditional display | Hide-when-logged-in: absent on frontend, present in editor | +| Motion / Transform / Custom CSS | Entrance class, hover transform CSS, unique rule on frontend | +| Columns / Posts / Image / Icon / Separator | Arrangement, Offset, circle shape, gradient, extra separator layer | +| Design Library | Premium pattern inserts; Saved tab; Save to Design Library on Columns | +| Settings | Role Manager tab + toggle save; Custom Fields tab can create a field | +| Toolbar | Copy & paste styles; Save as Default | + +Premium upgrade from an old premium zip is skipped (not on WordPress.org). ## Files @@ -122,12 +173,18 @@ PHP/WP matrix cells are Playground `--php` / `--wp` values (major.minor). | --- | --- | | `../playwright.config.js` | Free suite; Playground on 9420 | | `../playwright.premium.config.js` | Premium suite; Playground on 9421 | +| `../playwright.upgrade.config.js` | Upgrade suite; Playground on 9422; writes blueprint from `upgrade-from.js` | | `playground-blueprint.json` | Shared login + activate Stackable + seed tours / existing-blocks post | +| `config/upgrade-from.js` | Pinned old version, plugin slugs, zip URL | +| `config/upgrade-blueprint.js` | Builds the upgrade Playground blueprint from `upgrade-from.js` | +| `config/blocks-catalog.js` | Top-level `stackable/*` names for catalog / upgrade | | `config/global-setup.js` | Cookie auth + write `e2e/.auth/test-env.json` | +| `config/global-setup-upgrade.js` | Cookie auth only (no Existing Blocks post) | | `config/stackable-e2e-mu-plugin.php` | DC post meta + Design Library CDN mock | | `config/fixtures/design-library-*.json` | Mock patterns/pages served via `pre_http_request` | -| `test-utils/` | Shared fixtures | +| `test-utils/` | Shared fixtures, catalog insert, recovery-UI assertions | | `tests/*.spec.ts` | Free browser specs | +| `tests-upgrade/*.spec.ts` | Upgrade browser specs | | `../pro__premium_only/e2e/tests/*.spec.ts` | Premium browser specs | | `../pro__premium_only/e2e/mu-plugins/stackable-e2e-mock-premium.php` | E2E-only Freemius license injection | | `.auth/` | Gitignored; written by global setup | @@ -145,12 +202,18 @@ PHP/WP matrix cells are Playground `--php` / `--wp` values (major.minor). Design Library REST responses in the browser as a fallback. - **Settings / editor assets missing** - run `npm run build:e2e` (or `build:e2e:premium`) so `dist/` exists for enqueue. +- **Upgrade suite cannot download 3.19.0** - Playground needs network. + Confirm `e2e/config/upgrade-from.js` still points at a published WP.org zip. - **Premium Role Manager / DC missing** - ensure `pro__premium_only/` is present, `STACKABLE_BUILD` is `premium`, and the mock MU-plugin is mounted. Kill any stale Playground on port `9421` so the blueprint re-runs. +- **Premium panels still show Get Premium** - the mock or build type is wrong, not the feature. ## Dev Notes - Pattern mirrors [Cimo e2e](https://github.com/gambitph/Cimo/tree/master/e2e) (Playground CLI + `@wordpress/e2e-test-utils-playwright`). - Gutenberg e2e workflow: https://github.com/WordPress/gutenberg/blob/trunk/.github/workflows/end2end-test.yml +- Catalog insert uses `wp.blocks.createBlock` / `insertBlocks` (faster than the inserter UI). +- Skip `stackable/design-library` and child-only types (`button`, `column`, `tab-content`, …). +- Parent templates already include inner blocks. diff --git a/e2e/test-utils/block-recovery.ts b/e2e/test-utils/block-recovery.ts new file mode 100644 index 0000000000..91accaa546 --- /dev/null +++ b/e2e/test-utils/block-recovery.ts @@ -0,0 +1,22 @@ +import { expect } from '@wordpress/e2e-test-utils-playwright' +import type { ExtendedEditor } from './editor' + +/** + * Fail when Gutenberg shows invalid-block recovery UI. + * Do not listen for console "Block validation" messages. + * + * @param editor + */ +export const assertNoBlockRecovery = async ( editor: ExtendedEditor ) => { + const canvas = editor.canvas + + await expect( canvas.locator( 'body' ) ).toBeVisible() + + const warning = canvas.locator( '.block-editor-warning' ) + const recoveryButton = canvas.getByRole( 'button', { name: /Attempt (Block )?Recovery/i } ) + const invalidCopy = canvas.getByText( /unexpected or invalid content/i ) + + await expect( warning ).toHaveCount( 0 ) + await expect( recoveryButton ).toHaveCount( 0 ) + await expect( invalidCopy ).toHaveCount( 0 ) +} diff --git a/e2e/test-utils/catalog.ts b/e2e/test-utils/catalog.ts new file mode 100644 index 0000000000..06247ea5ae --- /dev/null +++ b/e2e/test-utils/catalog.ts @@ -0,0 +1,37 @@ +import { expect } from '@wordpress/e2e-test-utils-playwright' +import { TOP_LEVEL_BLOCKS } from '../config/blocks-catalog.js' +import type { ExtendedEditor } from './editor' + +export { TOP_LEVEL_BLOCKS } + +export const waitForBlockEditor = async ( editor: ExtendedEditor ) => { + await editor.page.waitForFunction( + () => window?.wp?.blocks?.createBlock && window?.wp?.data?.dispatch + ) + await expect( editor.canvas.locator( 'body' ) ).toBeVisible() +} + +/** + * Insert default instances via the active plugin's createBlock (old or current save()). + * + * @param editor + * @param names + */ +export const insertStackableCatalog = async ( + editor: ExtendedEditor, + names: string[] = TOP_LEVEL_BLOCKS +) => { + await waitForBlockEditor( editor ) + + await editor.page.evaluate( blockNames => { + const { createBlock } = window.wp.blocks + const { insertBlocks } = window.wp.data.dispatch( 'core/block-editor' ) + insertBlocks( blockNames.map( name => createBlock( name ) ) ) + }, names ) + + for ( const name of names ) { + await expect( + editor.canvas.locator( `[data-type="${ name }"]` ).first() + ).toBeVisible( { timeout: 60_000 } ) + } +} diff --git a/e2e/test-utils/editor.ts b/e2e/test-utils/editor.ts index a378df73bc..ebf14703b4 100644 --- a/e2e/test-utils/editor.ts +++ b/e2e/test-utils/editor.ts @@ -1,8 +1,6 @@ import { Editor as BaseEditor } from '@wordpress/e2e-test-utils-playwright' class ExtendedEditor extends BaseEditor { - blockErrors: Array = [] - getBlockAttributes = async function( clientId : String ) { await this.page.waitForFunction( () => window?.wp?.blocks && window?.wp?.data @@ -14,17 +12,6 @@ class ExtendedEditor extends BaseEditor { return attributes } - - getBlockErrors() :Array { - this.blockErrors = [] - this.page.on( 'console', msg => { - if ( msg.type() === 'error' && msg.text().startsWith( 'Block validation' ) ) { - this.blockErrors.push( msg.text() ) - } - } ) - - return this.blockErrors - } } export { ExtendedEditor } diff --git a/e2e/test-utils/frontend.ts b/e2e/test-utils/frontend.ts new file mode 100644 index 0000000000..1c703a62c7 --- /dev/null +++ b/e2e/test-utils/frontend.ts @@ -0,0 +1,50 @@ +import { expect } from '@wordpress/e2e-test-utils-playwright' +import type { Page } from '@playwright/test' +import type { ExtendedRequestUtils } from './requestUtils' + +type AdminFixture = { + getPageError: () => Promise; +} + +type EditorFixture = { + page: Page; + saveDraft: () => Promise; +} + +const readPostIdFromEditor = ( page: Page ) => { + const postQuery = new URL( page.url() ).search + return new URLSearchParams( postQuery ).get( 'post' ) +} + +/** + * Publish the current editor draft via REST and open the frontend permalink. + * + * @param page + * @param editor + * @param requestUtils + * @param admin + */ +export const publishAndVisitFrontend = async ( + page: Page, + editor: EditorFixture, + requestUtils: ExtendedRequestUtils, + admin: AdminFixture +) => { + await editor.saveDraft() + const postId = readPostIdFromEditor( editor.page ) + expect( postId ).toBeTruthy() + + await requestUtils.updatePost( postId as string, { status: 'publish' } ) + const post = await requestUtils.rest( { + path: `/wp/v2/posts/${ postId }`, + } ) + + await page.goto( post.link ) + + const pageError = await admin.getPageError() + expect( pageError ).toBeNull() + + return { postId, link: post.link as string } +} + +export const getEditorPostId = readPostIdFromEditor diff --git a/e2e/test-utils/index.ts b/e2e/test-utils/index.ts index 5595bda796..939aefe5e6 100644 --- a/e2e/test-utils/index.ts +++ b/e2e/test-utils/index.ts @@ -1,4 +1,9 @@ export { test, expect } from './test' export { ExtendedRequestUtils } from './requestUtils' export { StackableFixture } from './stackable' +export { ExtendedEditor } from './editor' export * from './format' +export { assertNoBlockRecovery } from './block-recovery' +export { insertStackableCatalog, waitForBlockEditor, TOP_LEVEL_BLOCKS } from './catalog' +export { publishAndVisitFrontend, getEditorPostId } from './frontend' +export { assertNoUpsell, openInspectorPanel, openBlockStylesPopover, closeBlockStylesPopover } from './inspector' diff --git a/e2e/test-utils/inspector.ts b/e2e/test-utils/inspector.ts new file mode 100644 index 0000000000..d01f1cb0b4 --- /dev/null +++ b/e2e/test-utils/inspector.ts @@ -0,0 +1,40 @@ +import { expect } from '@wordpress/e2e-test-utils-playwright' +import type { Page } from '@playwright/test' + +export const assertNoUpsell = async ( page: Page ) => { + await expect( page.locator( '.ugb-design-control-pro-note' ) ).toHaveCount( 0 ) + await expect( page.getByRole( 'link', { name: 'Get Premium' } ) ).toHaveCount( 0 ) +} + +export const openInspectorPanel = async ( page: Page, title: string ) => { + const button = page.getByRole( 'button', { name: title, exact: true } ).first() + await expect( button ).toBeVisible() + const expanded = await button.getAttribute( 'aria-expanded' ) + if ( expanded !== 'true' ) { + await button.click() + } +} + +export const openBlockStylesPopover = async ( page: Page ) => { + const blockTab = page.getByRole( 'tab', { name: 'Block' } ) + if ( await blockTab.isVisible().catch( () => false ) ) { + await blockTab.click() + } + + const button = page.locator( '.ugb-block-styles-controls__block-style-button' ) + await expect( button ).toBeVisible( { timeout: 15_000 } ) + if ( ! await button.evaluate( el => el.classList.contains( 'is-opened' ) ) ) { + await button.click() + } + const popover = page.locator( '.ugb-block-styles-controls__popover' ) + await expect( popover ).toBeVisible( { timeout: 15_000 } ) + return popover +} + +export const closeBlockStylesPopover = async ( page: Page ) => { + const button = page.locator( '.ugb-block-styles-controls__block-style-button' ) + if ( await button.evaluate( el => el.classList.contains( 'is-opened' ) ) ) { + await button.click() + } + await expect( page.locator( '.ugb-block-styles-controls__popover' ) ).toHaveCount( 0 ) +} diff --git a/e2e/test-utils/requestUtils.ts b/e2e/test-utils/requestUtils.ts index 21000c4d3e..2983acab50 100644 --- a/e2e/test-utils/requestUtils.ts +++ b/e2e/test-utils/requestUtils.ts @@ -3,6 +3,15 @@ import { RequestUtils as BaseRequestUtils } from '@wordpress/e2e-test-utils-play const REST_NONCE_PATTERN = /^[a-zA-Z0-9_-]{2,64}$/ +/** + * WP plugin routes identify a plugin as `dir/file`. The slash must be encoded + * so it is one path segment (`dir%2Ffile`), not two. + * + * @param pluginFile Plugin file relative to wp-content/plugins, e.g. `stackable/plugin`. + */ +const pluginFileRestPath = ( pluginFile: string ) => + `/wp/v2/plugins/${ encodeURIComponent( pluginFile ) }` + class ExtendedRequestUtils extends BaseRequestUtils { /** * Same as the upstream helper, with ignoreHTTPSErrors for local HTTPS overrides. @@ -125,7 +134,7 @@ class ExtendedRequestUtils extends BaseRequestUtils { try { await this.rest( { method: 'PUT', - path: `/wp/v2/plugins/${ slug }`, + path: pluginFileRestPath( slug ), data: { status: 'inactive' }, } ) } catch ( error ) { @@ -137,7 +146,7 @@ class ExtendedRequestUtils extends BaseRequestUtils { try { await this.rest( { method: 'PUT', - path: `/wp/v2/plugins/${ slug }`, + path: pluginFileRestPath( slug ), data: { status: 'active' }, } ) } catch ( error ) { diff --git a/e2e/test-utils/stackable.ts b/e2e/test-utils/stackable.ts index 4fe0123cbf..bc09d5365b 100644 --- a/e2e/test-utils/stackable.ts +++ b/e2e/test-utils/stackable.ts @@ -60,4 +60,33 @@ export class StackableFixture { response.ok() } ).then( () => undefined ) } + + async openBlockSettings() { + const settings = this.page.getByLabel( 'Settings', { exact: true } ) + if ( await settings.isVisible() && await settings.getAttribute( 'aria-pressed' ) === 'false' ) { + await settings.click() + } + } + + async openInspectorTab( tab: 'Layout' | 'Style' | 'Advanced' ) { + await this.openBlockSettings() + await this.page.getByLabel( `${ tab } Tab` ).click() + } + + async openDesignSystem() { + const button = this.page.getByLabel( 'Stackable Design System' ) + await button.click() + } + + async dismissToursAndNotices() { + const tourClose = this.page.locator( '.ugb-tour-modal .components-modal__header button' ).first() + if ( await tourClose.isVisible().catch( () => false ) ) { + await tourClose.click() + } + + const skip = this.page.getByRole( 'link', { name: 'Skip', exact: true } ) + if ( await skip.isVisible().catch( () => false ) ) { + await skip.click() + } + } } diff --git a/e2e/tests-upgrade/upgrade-from-old-version.spec.ts b/e2e/tests-upgrade/upgrade-from-old-version.spec.ts new file mode 100644 index 0000000000..553d598170 --- /dev/null +++ b/e2e/tests-upgrade/upgrade-from-old-version.spec.ts @@ -0,0 +1,53 @@ +import { test, expect } from 'e2e/test-utils' +import { + assertNoBlockRecovery, + insertStackableCatalog, + publishAndVisitFrontend, + TOP_LEVEL_BLOCKS, +} from 'e2e/test-utils' +import { + CURRENT_PLUGIN_SLUG, + OLD_PLUGIN_SLUG, + UPGRADE_FROM_VERSION, +} from '../config/upgrade-from.js' + +test.describe( `Upgrade from Stackable ${ UPGRADE_FROM_VERSION }`, () => { + test( 'blocks saved on the old version open without recovery UI', async ( { + page, + admin, + editor, + requestUtils, + stackable, + } ) => { + await stackable.dismissToursAndNotices() + + await admin.createNewPost( { title: `Upgrade from ${ UPGRADE_FROM_VERSION }` } ) + await insertStackableCatalog( editor, TOP_LEVEL_BLOCKS ) + await editor.saveDraft() + + const postQuery = new URL( editor.page.url() ).search + const postId = new URLSearchParams( postQuery ).get( 'post' ) + expect( postId ).toBeTruthy() + + await requestUtils.deactivatePlugin( OLD_PLUGIN_SLUG ) + await requestUtils.activatePlugin( CURRENT_PLUGIN_SLUG ) + + // Activation may consume a one-shot Getting Started redirect. + await admin.visitAdminPage( 'index.php' ) + await stackable.dismissToursAndNotices() + + await admin.editPost( postId ) + await stackable.dismissToursAndNotices() + + for ( const name of TOP_LEVEL_BLOCKS ) { + await expect( + editor.canvas.locator( `[data-type="${ name }"]` ).first() + ).toBeVisible( { timeout: 60_000 } ) + } + + await assertNoBlockRecovery( editor ) + + await publishAndVisitFrontend( page, editor, requestUtils, admin ) + await expect( page.locator( '.stk-block' ).first() ).toBeVisible() + } ) +} ) diff --git a/e2e/tests/admin.spec.ts b/e2e/tests/admin.spec.ts index 293c6dcc89..b8e4d0af94 100644 --- a/e2e/tests/admin.spec.ts +++ b/e2e/tests/admin.spec.ts @@ -74,3 +74,29 @@ test( 'Stackable settings should be saved', async ( { await saveSettings await expect( _option ).toHaveAttribute( 'aria-checked', val ) } ) + +test( 'Settings inner tabs render', async ( { + page, + admin, + stackable, +} ) => { + const settings = stackable.waitForSettings() + await admin.visitAdminPage( 'admin.php?page=stackable-settings' ) + await settings + + const pageError = await admin.getPageError() + expect( pageError ).toBeNull() + + await page.getByRole( 'tab', { name: 'Editor Settings' } ).click() + await expect( page.getByRole( 'heading', { name: 'Block Widths' } ) ).toBeVisible() + + await page.getByRole( 'tab', { name: 'Global Settings' } ).click() + await expect( page.getByRole( 'heading', { name: 'Global Settings' } ) ).toBeVisible() + await expect( page.getByText( 'Force Typography Styles' ) ).toBeVisible() + + await page.getByRole( 'tab', { name: /Miscellaneous/ } ).click() + await expect( page.getByRole( 'heading', { name: 'Miscellaneous' } ) ).toBeVisible() + + await page.getByRole( 'tab', { name: 'Import/Export' } ).click() + await expect( page.getByRole( 'heading', { name: 'Import' } ) ).toBeVisible() +} ) diff --git a/e2e/tests/block-catalog.spec.ts b/e2e/tests/block-catalog.spec.ts new file mode 100644 index 0000000000..7749f8786f --- /dev/null +++ b/e2e/tests/block-catalog.spec.ts @@ -0,0 +1,51 @@ +import { test, expect } from 'e2e/test-utils' +import { + assertNoBlockRecovery, + insertStackableCatalog, + publishAndVisitFrontend, + TOP_LEVEL_BLOCKS, + getEditorPostId, +} from 'e2e/test-utils' + +test.describe( 'Block catalog', () => { + let pid = null + + test.afterEach( async ( { requestUtils } ) => { + if ( ! pid ) { + return + } + try { + await requestUtils.deletePost( pid ) + } catch { + // Best-effort cleanup. + } + } ) + + test( 'every top-level Stackable block inserts, reloads, and renders without recovery UI', async ( { + page, + admin, + editor, + requestUtils, + } ) => { + test.setTimeout( 180_000 ) + await admin.createNewPost( { title: 'Block Catalog' } ) + await insertStackableCatalog( editor, TOP_LEVEL_BLOCKS ) + await editor.saveDraft() + pid = getEditorPostId( editor.page ) + + await page.reload() + await expect( + editor.canvas.locator( '[data-type^="stackable/"]' ).first() + ).toBeVisible( { timeout: 60_000 } ) + + for ( const name of TOP_LEVEL_BLOCKS ) { + await expect( + editor.canvas.locator( `[data-type="${ name }"]` ).first() + ).toBeVisible() + } + + await assertNoBlockRecovery( editor ) + await publishAndVisitFrontend( page, editor, requestUtils, admin ) + await expect( page.locator( '.stk-block' ).first() ).toBeVisible() + } ) +} ) diff --git a/e2e/tests/existing-blocks.spec.ts b/e2e/tests/existing-blocks.spec.ts index 57610139f8..a877334e76 100644 --- a/e2e/tests/existing-blocks.spec.ts +++ b/e2e/tests/existing-blocks.spec.ts @@ -2,6 +2,7 @@ import fs from 'fs' import path from 'path' import { test, expect } from 'e2e/test-utils' +import { assertNoBlockRecovery } from 'e2e/test-utils' const readSeededPostId = () => { if ( process.env.WP_TEST_POSTID ) { @@ -24,10 +25,9 @@ test( 'Existing Stackable blocks should have no errors', async ( { admin, editor, } ) => { - // Start listening on console errors for block validation - const blockErrors = editor.getBlockErrors() - await admin.editPost( postId ) - - expect( blockErrors ).toHaveLength( 0 ) + await expect( + editor.canvas.locator( '[data-type^="stackable/"]' ).first() + ).toBeVisible( { timeout: 60_000 } ) + await assertNoBlockRecovery( editor ) } ) diff --git a/e2e/tests/frontend-interactive.spec.ts b/e2e/tests/frontend-interactive.spec.ts new file mode 100644 index 0000000000..33c5e81ff1 --- /dev/null +++ b/e2e/tests/frontend-interactive.spec.ts @@ -0,0 +1,164 @@ +import { test, expect } from 'e2e/test-utils' +import { publishAndVisitFrontend, getEditorPostId } from 'e2e/test-utils' + +test.describe( 'Interactive frontend', () => { + let pid = null + + test.beforeEach( async ( { editor, admin } ) => { + await admin.createNewPost( { title: 'Interactive Frontend' } ) + await editor.saveDraft() + pid = getEditorPostId( editor.page ) + } ) + + test.afterEach( async ( { requestUtils } ) => { + if ( ! pid ) { + return + } + try { + await requestUtils.deletePost( pid ) + } catch { + // Best-effort cleanup. + } + } ) + + test( 'Accordion opens on click', async ( { + page, editor, requestUtils, admin, + } ) => { + await editor.insertBlock( { name: 'stackable/accordion' } ) + await publishAndVisitFrontend( page, editor, requestUtils, admin ) + + const accordion = page.locator( 'details.stk-block-accordion' ).first() + await expect( accordion ).toBeVisible() + await accordion.locator( 'summary' ).first().click() + await expect( accordion ).toHaveAttribute( 'open', '' ) + } ) + + test( 'Tabs switch panels', async ( { + page, editor, requestUtils, admin, + } ) => { + await editor.insertBlock( { name: 'stackable/tabs' } ) + await publishAndVisitFrontend( page, editor, requestUtils, admin ) + + const tabs = page.locator( '.stk-block-tabs' ).first() + await expect( tabs ).toBeVisible() + const tabButtons = tabs.locator( '[role="tab"]' ) + await expect( tabButtons ).toHaveCount( 3 ) + await tabButtons.nth( 1 ).click() + await expect( tabButtons.nth( 1 ) ).toHaveAttribute( 'aria-selected', 'true' ) + } ) + + test( 'Carousel next control changes the slide', async ( { + page, editor, requestUtils, admin, + } ) => { + await editor.insertBlock( { name: 'stackable/carousel' } ) + await publishAndVisitFrontend( page, editor, requestUtils, admin ) + + const carousel = page.locator( '.stk-block-carousel' ).first() + await expect( carousel ).toBeVisible() + const next = carousel.locator( '.stk-block-carousel__button__next' ).first() + await expect( next ).toBeVisible() + const firstSlide = carousel.locator( '.stk-block-carousel__slider > .stk-block-column' ).first() + await expect( firstSlide ).toHaveAttribute( 'aria-hidden', 'false' ) + await next.click() + await expect( firstSlide ).toHaveAttribute( 'aria-hidden', 'true' ) + } ) + + test( 'Expand reveals more content', async ( { + page, editor, requestUtils, admin, + } ) => { + await editor.insertBlock( { name: 'stackable/expand' } ) + await publishAndVisitFrontend( page, editor, requestUtils, admin ) + + const expand = page.locator( '.stk-block-expand' ).first() + await expect( expand ).toBeVisible() + await expand.locator( '.stk-block-expand__show-button .stk-button' ).click() + await expect( expand.locator( '.stk-block-expand__more-text' ) ).toHaveAttribute( 'aria-hidden', 'false' ) + } ) + + test( 'Video Popup opens a dialog', async ( { + page, editor, requestUtils, admin, + } ) => { + await editor.insertBlock( { + name: 'stackable/video-popup', + attributes: { + videoLink: 'https://www.youtube.com/watch?v=dQw4w9WgXcQ', + }, + } ) + await publishAndVisitFrontend( page, editor, requestUtils, admin ) + + const popup = page.locator( '.stk-block-video-popup' ).first() + await expect( popup ).toBeVisible() + await popup.locator( 'div[role="button"], button' ).first().click() + await expect( page.locator( '.bp-container, .glightbox-container, .stk-video-popup, iframe' ).first() ).toBeVisible( { timeout: 10_000 } ) + } ) + + test( 'Notification can be dismissed', async ( { + page, editor, requestUtils, admin, + } ) => { + await editor.insertBlock( { name: 'stackable/notification' } ) + await publishAndVisitFrontend( page, editor, requestUtils, admin ) + + const notification = page.locator( '.stk-block-notification' ).first() + await expect( notification ).toBeVisible() + await notification.locator( '.stk-block-notification__close-button' ).click() + await expect( notification ).toBeHidden() + } ) + + test( 'Horizontal scroller is in the DOM', async ( { + page, editor, requestUtils, admin, + } ) => { + await editor.insertBlock( { name: 'stackable/horizontal-scroller' } ) + await publishAndVisitFrontend( page, editor, requestUtils, admin ) + await expect( page.locator( '.stk-block-horizontal-scroller' ).first() ).toBeVisible() + } ) + + test( 'Countdown, Count Up, and Progress widgets render', async ( { + page, editor, requestUtils, admin, + } ) => { + await editor.insertBlock( { name: 'stackable/countdown' } ) + await editor.insertBlock( { name: 'stackable/count-up' } ) + await editor.insertBlock( { name: 'stackable/progress-bar' } ) + await editor.insertBlock( { name: 'stackable/progress-circle' } ) + await publishAndVisitFrontend( page, editor, requestUtils, admin ) + + await expect( page.locator( '.stk-block-countdown' ).first() ).toBeVisible() + await expect( page.locator( '.stk-block-count-up' ).first() ).toBeVisible() + await expect( page.locator( '.stk-block-progress-bar' ).first() ).toBeVisible() + await expect( page.locator( '.stk-block-progress-circle' ).first() ).toBeVisible() + } ) + + test( 'Map container renders without a PHP fatal', async ( { + page, editor, requestUtils, admin, + } ) => { + await editor.insertBlock( { name: 'stackable/map' } ) + await publishAndVisitFrontend( page, editor, requestUtils, admin ) + await expect( page.locator( '.stk-block-map' ).first() ).toBeVisible() + } ) + + test( 'Posts block renders a list or empty state', async ( { + page, editor, requestUtils, admin, + } ) => { + await editor.insertBlock( { name: 'stackable/posts' } ) + await publishAndVisitFrontend( page, editor, requestUtils, admin ) + await expect( page.locator( '.stk-block-posts' ).first() ).toBeVisible() + } ) + + test( 'Table of Contents lists a heading', async ( { + page, editor, requestUtils, admin, + } ) => { + await editor.insertBlock( { + name: 'stackable/heading', + attributes: { text: 'E2E TOC Heading' }, + } ) + await editor.insertBlock( { name: 'stackable/table-of-contents' } ) + await expect( + editor.canvas.locator( '.stk-block-table-of-contents' ).getByText( 'E2E TOC Heading' ) + ).toBeVisible( { timeout: 15_000 } ) + + await publishAndVisitFrontend( page, editor, requestUtils, admin ) + + const toc = page.locator( '.stk-block-table-of-contents' ).first() + await expect( toc ).toBeVisible() + await expect( toc.getByRole( 'link', { name: 'E2E TOC Heading' } ) ).toBeVisible() + } ) +} ) diff --git a/e2e/tests/global-settings.spec.ts b/e2e/tests/global-settings.spec.ts index 9183359e71..0fe1d4c232 100644 --- a/e2e/tests/global-settings.spec.ts +++ b/e2e/tests/global-settings.spec.ts @@ -116,4 +116,57 @@ test.describe( 'Global Settings', () => { await deleteRequest await expect( resetButton ).not.toBeVisible() } ) + + test( 'Global Spacing & Borders and Buttons & Icons panels apply on the canvas', async ( { + page, + editor, + } ) => { + await editor.insertBlock( { + name: 'stackable/text', + attributes: { text: 'spacing token' }, + } ) + await editor.insertBlock( { + name: 'stackable/button-group', + } ) + + await page.getByLabel( 'Stackable Design System' ).click() + await page.getByRole( 'button', { name: 'Global Spacing & Borders' } ).click() + await expect( page.getByText( 'Block Margin Bottom' ) ).toBeVisible() + + const marginInput = page.locator( '.stk-control, .components-base-control' ) + .filter( { hasText: 'Block Margin Bottom' } ) + .getByRole( 'spinbutton' ) + .first() + await expect( marginInput ).toBeVisible() + await marginInput.fill( '40' ) + + await page.getByRole( 'button', { name: 'Global Buttons & Icons' } ).click() + await expect( page.getByText( 'Min. Button Height' ) ).toBeVisible() + + const heightInput = page.locator( '.stk-control, .components-base-control' ) + .filter( { hasText: 'Min. Button Height' } ) + .getByRole( 'spinbutton' ) + .first() + await expect( heightInput ).toBeVisible() + await heightInput.fill( '48' ) + + const textBlock = editor.canvas.locator( '[data-type="stackable/text"] .stk-block' ).first() + await expect.poll( async () => { + return textBlock.evaluate( el => getComputedStyle( el ).marginBottom ) + } ).toBe( '40px' ) + + const button = editor.canvas.locator( '[data-type="stackable/button"] .stk-button' ).first() + await expect.poll( async () => { + return button.evaluate( el => getComputedStyle( el ).minHeight ) + } ).toBe( '48px' ) + } ) + + test( 'Preview Design System opens', async ( { + page, + } ) => { + await page.getByLabel( 'Stackable Design System' ).click() + await page.getByRole( 'button', { name: 'Preview Design System' } ).click() + await expect( page.getByRole( 'button', { name: 'Close Preview' } ) ).toBeVisible() + await page.getByRole( 'button', { name: 'Close Preview' } ).click() + } ) } ) diff --git a/package.json b/package.json index ea830254dc..c1959f8c99 100644 --- a/package.json +++ b/package.json @@ -135,8 +135,10 @@ "test": "npm run test:e2e", "test:e2e": "npx playwright test", "test:e2e:premium": "npx playwright test -c playwright.premium.config.js", + "test:e2e:upgrade": "npx playwright test -c playwright.upgrade.config.js", "test:debug": "npx playwright test --ui", "test:debug:premium": "npx playwright test -c playwright.premium.config.js --ui", + "test:debug:upgrade": "npx playwright test -c playwright.upgrade.config.js --ui", "test-old": "jest --no-cache --watchAll", "test:coverage": "jest --no-cache --coverage", "test:fast": "npm run clean:build && jest", diff --git a/playwright.upgrade.config.js b/playwright.upgrade.config.js new file mode 100644 index 0000000000..f3081dd929 --- /dev/null +++ b/playwright.upgrade.config.js @@ -0,0 +1,77 @@ +/** + * Playwright config for Stackable's upgrade e2e suite. + * + * Boots Playground with WordPress.org Stackable (pinned in upgrade-from.js) + * active and the current repo mounted inactive as `stackable/`. Specs insert + * blocks, swap plugins, and assert Gutenberg does not show Attempt Block Recovery. + * + * Isolated port so plugin swaps cannot poison the free suite. + * + * See e2e/readme.md. + */ +const path = require( 'path' ) +const { defineConfig, devices } = require( '@playwright/test' ) +const { UPGRADE_FROM_VERSION } = require( './e2e/config/upgrade-from.js' ) +const { writeUpgradeBlueprint } = require( './e2e/config/upgrade-blueprint.js' ) + +const PORT = process.env.WP_PORT || '9422' +const baseURL = process.env.WP_BASE_URL || `http://127.0.0.1:${ PORT }` +process.env.WP_BASE_URL = baseURL +process.env.WP_USERNAME = process.env.WP_USERNAME || 'admin' +process.env.WP_PASSWORD = process.env.WP_PASSWORD || 'password' +process.env.STACKABLE_SLUG = process.env.STACKABLE_SLUG || 'stackable/plugin' +process.env.STACKABLE_UPGRADE_FROM = process.env.STACKABLE_UPGRADE_FROM || UPGRADE_FROM_VERSION + +const STORAGE_STATE_PATH = path.join( __dirname, 'e2e/.auth/admin.upgrade.json' ) +process.env.STORAGE_STATE_PATH = STORAGE_STATE_PATH + +const PLAYGROUND_BLUEPRINT = writeUpgradeBlueprint( + path.join( __dirname, 'e2e/.auth/upgrade-blueprint.json' ) +) +const PHP_VERSION = process.env.WP_PHP_VERSION || '8.2' +const WP_VERSION = process.env.WP_VERSION || 'latest' + +const E2E_META_MU = path.join( + __dirname, + 'e2e/config/stackable-e2e-mu-plugin.php' +) + +module.exports = defineConfig( { + testDir: './e2e/tests-upgrade', + globalSetup: require.resolve( './e2e/config/global-setup-upgrade.js' ), + fullyParallel: false, + forbidOnly: !! process.env.CI, + retries: process.env.CI ? 1 : 0, + workers: 1, + timeout: 180_000, + reporter: process.env.CI + ? [ [ './e2e/config/reporter.ts', { outputFolder: './playwright-stk-upgrade' } ], [ 'github' ], [ 'html', { outputFolder: 'playwright-report-upgrade', open: 'never' } ] ] + : [ [ 'list' ], [ 'html', { outputFolder: 'playwright-report-upgrade', open: 'never' } ] ], + reportSlowTests: null, + webServer: { + command: [ + 'npx @wp-playground/cli server', + '--mount=.:/wordpress/wp-content/plugins/stackable', + `--mount=${ E2E_META_MU }:/wordpress/wp-content/mu-plugins/stackable-e2e.php`, + `--blueprint=${ PLAYGROUND_BLUEPRINT }`, + `--php=${ PHP_VERSION }`, + `--wp=${ WP_VERSION }`, + `--port=${ PORT }`, + '--workers=1', + ].join( ' ' ), + port: Number( PORT ), + reuseExistingServer: ! process.env.CI, + timeout: 240 * 1000, + stdout: 'pipe', + stderr: 'pipe', + }, + use: { + baseURL, + storageState: STORAGE_STATE_PATH, + ignoreHTTPSErrors: true, + screenshot: 'only-on-failure', + trace: 'retain-on-failure', + video: 'retain-on-failure', + ...devices[ 'Desktop Chrome' ], + }, +} ) diff --git a/src/components/font-family-control/google-fonts.json b/src/components/font-family-control/google-fonts.json index b9b35fa5e7..08869f3d9c 100644 --- a/src/components/font-family-control/google-fonts.json +++ b/src/components/font-family-control/google-fonts.json @@ -23394,7 +23394,8 @@ "regular" ], "subsets": [ - "korean" + "korean", + "latin" ] }, { @@ -23776,7 +23777,8 @@ "regular" ], "subsets": [ - "korean" + "korean", + "latin" ] }, { @@ -24401,7 +24403,8 @@ "regular" ], "subsets": [ - "korean" + "korean", + "latin" ] }, { @@ -24456,7 +24459,8 @@ "700" ], "subsets": [ - "korean" + "korean", + "latin" ] }, { diff --git a/src/dynamic-breakpoints.php b/src/dynamic-breakpoints.php index 24e1c651ca..3258186898 100644 --- a/src/dynamic-breakpoints.php +++ b/src/dynamic-breakpoints.php @@ -15,7 +15,7 @@ function stackable_get_responsive_css() { // NOTE: THE VALUE BELOW IS AUTOMATICALLY GENERATED BY THE BUILD PROCESS. return <<*>.stk-row{flex-wrap:var(--stk-feature-flex-wrap,nowrap)}.stk-row{flex-wrap:nowrap}.stk--hide-desktop,.stk--hide-desktop.stk-block{display:none!important}}@media only screen and (min-width:768px){:where(body:not(.wp-admin) .stk-block-column:first-child:nth-last-child(2)){flex:1 1 calc(50% - var(--stk-column-gap, 0px)*1/2)!important}:where(body:not(.wp-admin) .stk-block-column:nth-child(2):last-child){flex:1 1 calc(50% - var(--stk-column-gap, 0px)*1/2)!important}:where(body:not(.wp-admin) .stk-block-column:first-child:nth-last-child(3)){flex:1 1 calc(33.33333% - var(--stk-column-gap, 0px)*2/3)!important}:where(body:not(.wp-admin) .stk-block-column:nth-child(2):nth-last-child(2)){flex:1 1 calc(33.33333% - var(--stk-column-gap, 0px)*2/3)!important}:where(body:not(.wp-admin) .stk-block-column:nth-child(3):last-child){flex:1 1 calc(33.33333% - var(--stk-column-gap, 0px)*2/3)!important}:where(body:not(.wp-admin) .stk-block-column:first-child:nth-last-child(4)){flex:1 1 calc(25% - var(--stk-column-gap, 0px)*3/4)!important}:where(body:not(.wp-admin) .stk-block-column:nth-child(2):nth-last-child(3)){flex:1 1 calc(25% - var(--stk-column-gap, 0px)*3/4)!important}:where(body:not(.wp-admin) .stk-block-column:nth-child(3):nth-last-child(2)){flex:1 1 calc(25% - var(--stk-column-gap, 0px)*3/4)!important}:where(body:not(.wp-admin) .stk-block-column:nth-child(4):last-child){flex:1 1 calc(25% - var(--stk-column-gap, 0px)*3/4)!important}:where(body:not(.wp-admin) .stk-block-column:first-child:nth-last-child(5)){flex:1 1 calc(20% - var(--stk-column-gap, 0px)*4/5)!important}:where(body:not(.wp-admin) .stk-block-column:nth-child(2):nth-last-child(4)){flex:1 1 calc(20% - var(--stk-column-gap, 0px)*4/5)!important}:where(body:not(.wp-admin) .stk-block-column:nth-child(3):nth-last-child(3)){flex:1 1 calc(20% - var(--stk-column-gap, 0px)*4/5)!important}:where(body:not(.wp-admin) .stk-block-column:nth-child(4):nth-last-child(2)){flex:1 1 calc(20% - var(--stk-column-gap, 0px)*4/5)!important}:where(body:not(.wp-admin) .stk-block-column:nth-child(5):last-child){flex:1 1 calc(20% - var(--stk-column-gap, 0px)*4/5)!important}:where(body:not(.wp-admin) .stk-block-column:first-child:nth-last-child(6)){flex:1 1 calc(16.66667% - var(--stk-column-gap, 0px)*5/6)!important}:where(body:not(.wp-admin) .stk-block-column:nth-child(2):nth-last-child(5)){flex:1 1 calc(16.66667% - var(--stk-column-gap, 0px)*5/6)!important}:where(body:not(.wp-admin) .stk-block-column:nth-child(3):nth-last-child(4)){flex:1 1 calc(16.66667% - var(--stk-column-gap, 0px)*5/6)!important}:where(body:not(.wp-admin) .stk-block-column:nth-child(4):nth-last-child(3)){flex:1 1 calc(16.66667% - var(--stk-column-gap, 0px)*5/6)!important}:where(body:not(.wp-admin) .stk-block-column:nth-child(5):nth-last-child(2)){flex:1 1 calc(16.66667% - var(--stk-column-gap, 0px)*5/6)!important}:where(body:not(.wp-admin) .stk-block-column:nth-child(6):last-child){flex:1 1 calc(16.66667% - var(--stk-column-gap, 0px)*5/6)!important}.stk-block-tabs>.stk-inner-blocks.stk-block-tabs--vertical{grid-template-columns:auto 1fr auto}.stk-block-tabs>.stk-inner-blocks.stk-block-tabs--vertical>.stk-block-tab-labels:first-child{grid-column:1/2}.stk-block-tabs>.stk-inner-blocks.stk-block-tabs--vertical>.stk-block-tab-content:last-child{grid-column:2/4}.stk-block-tabs>.stk-inner-blocks.stk-block-tabs--vertical>.stk-block-tab-content:first-child{grid-column:1/3}.stk-block-tabs>.stk-inner-blocks.stk-block-tabs--vertical>.stk-block-tab-labels:last-child{grid-column:3/4}.stk-block .stk-block.aligncenter,.stk-block-carousel:is(.aligncenter,.alignwide,.alignfull)>:where(.stk-block-carousel__content-wrapper)>.stk-content-align:not(.alignwide):not(.alignfull),.stk-block:is(.aligncenter,.alignwide,.alignfull)>.stk-content-align:not(.alignwide):not(.alignfull){margin-left:auto;margin-right:auto;max-width:var(--stk-block-default-width,var(--stk-block-width-default-detected,900px));width:100%}.stk-block .stk-block.alignwide,.stk-block-carousel:is(.aligncenter,.alignwide,.alignfull)>:where(.stk-block-carousel__content-wrapper)>.stk-content-align.alignwide,.stk-block:is(.aligncenter,.alignwide,.alignfull)>.stk-content-align.alignwide{margin-left:auto;margin-right:auto;max-width:var(--stk-block-wide-width,var(--stk-block-width-wide-detected,80vw));width:100%}.stk-row.stk-columns-2>.stk-column{flex:1 1 50%;max-width:50%}.stk-row.stk-columns-3>.stk-column{flex:1 1 33.3333333333%;max-width:33.3333333333%}.stk-row.stk-columns-4>.stk-column{flex:1 1 25%;max-width:25%}.stk-row.stk-columns-5>.stk-column{flex:1 1 20%;max-width:20%}.stk-row.stk-columns-6>.stk-column{flex:1 1 16.6666666667%;max-width:16.6666666667%}.stk-row.stk-columns-7>.stk-column{flex:1 1 14.2857142857%;max-width:14.2857142857%}.stk-row.stk-columns-8>.stk-column{flex:1 1 12.5%;max-width:12.5%}.stk-row.stk-columns-9>.stk-column{flex:1 1 11.1111111111%;max-width:11.1111111111%}.stk-row.stk-columns-10>.stk-column{flex:1 1 10%;max-width:10%}}@media only screen and (min-width:768px) and (max-width:1023px){.stk-button-group:is(.stk--collapse-on-tablet)>.block-editor-inner-blocks>.block-editor-block-list__layout>[data-block]{margin-inline-end:var(--stk-alignment-margin-right);margin-inline-start:var(--stk-alignment-margin-left)}:where(.has-text-align-left-tablet) .stk-block-divider{--stk-dots-margin-left:0;--stk-dots-margin-right:auto}:where(.has-text-align-right-tablet) .stk-block-divider{--stk-dots-margin-right:0;--stk-dots-margin-left:auto}:where(.has-text-align-center-tablet) .stk-block-divider{--stk-dots-margin-right:auto;--stk-dots-margin-left:auto}.stk--hide-tablet,.stk--hide-tablet.stk-block{display:none!important}.stk-button-group:is(.stk--collapse-on-tablet) .stk-block:is(.stk-block-button,.stk-block-icon-button){margin-inline-end:var(--stk-alignment-margin-right);margin-inline-start:var(--stk-alignment-margin-left)}}@media only screen and (max-width:1023px){.stk-block-button{min-width:-moz-fit-content;min-width:fit-content}.stk-block.stk-block-divider.has-text-align-center-tablet{--stk-dots-margin-right:auto;--stk-dots-margin-left:auto}.stk-block.stk-block-divider.has-text-align-right-tablet{--stk-dots-margin-right:0;--stk-dots-margin-left:auto}.stk-block.stk-block-divider.has-text-align-left-tablet{--stk-dots-margin-left:0;--stk-dots-margin-right:auto}.stk-block-timeline.stk-block-timeline__ios-polyfill{--fixed-bg:linear-gradient(to bottom,var(--line-accent-bg-color,#000) 0,var(--line-accent-bg-color-2,#000) var(--line-accent-bg-location,50%))}.has-text-align-center-tablet{--stk-alignment-padding-left:0;--stk-alignment-justify-content:center;--stk-alignment-text-align:center;--stk-alignment-margin-left:auto;--stk-alignment-margin-right:auto;text-align:var(--stk-alignment-text-align,start)}.has-text-align-left-tablet{--stk-alignment-justify-content:flex-start;--stk-alignment-text-align:start;--stk-alignment-margin-left:0;--stk-alignment-margin-right:auto;text-align:var(--stk-alignment-text-align,start)}.has-text-align-right-tablet{--stk-alignment-justify-content:flex-end;--stk-alignment-text-align:end;--stk-alignment-margin-left:auto;--stk-alignment-margin-right:0;text-align:var(--stk-alignment-text-align,start)}.has-text-align-justify-tablet{--stk-alignment-text-align:justify}.has-text-align-space-between-tablet{--stk-alignment-justify-content:space-between}.has-text-align-space-around-tablet{--stk-alignment-justify-content:space-around}.has-text-align-space-evenly-tablet{--stk-alignment-justify-content:space-evenly}}@media only screen and (max-width:767px){.stk-button-group:is(.stk--collapse-on-mobile)>.block-editor-inner-blocks>.block-editor-block-list__layout>[data-block],.stk-button-group:is(.stk--collapse-on-tablet)>.block-editor-inner-blocks>.block-editor-block-list__layout>[data-block]{margin-inline-end:var(--stk-alignment-margin-right);margin-inline-start:var(--stk-alignment-margin-left)}.stk-block-carousel.stk--hide-mobile-arrows>.stk-block-carousel__content-wrapper>*>.stk-block-carousel__buttons,.stk-block-carousel.stk--hide-mobile-dots>.stk-block-carousel__content-wrapper>.stk-block-carousel__dots{display:none}:where(.has-text-align-left-mobile) .stk-block-divider{--stk-dots-margin-left:0;--stk-dots-margin-right:auto}:where(.has-text-align-right-mobile) .stk-block-divider{--stk-dots-margin-right:0;--stk-dots-margin-left:auto}:where(.has-text-align-center-mobile) .stk-block-divider{--stk-dots-margin-right:auto;--stk-dots-margin-left:auto}.stk-block.stk-block-divider.has-text-align-center-mobile{--stk-dots-margin-right:auto;--stk-dots-margin-left:auto}.stk-block.stk-block-divider.has-text-align-right-mobile{--stk-dots-margin-right:0;--stk-dots-margin-left:auto}.stk-block.stk-block-divider.has-text-align-left-mobile{--stk-dots-margin-left:0;--stk-dots-margin-right:auto}.stk-block.stk-block-feature:is(.is-style-default,.is-style-horizontal)>.stk-container>.stk-inner-blocks.stk-block-content{flex-direction:column-reverse}.stk-block-posts{--stk-columns:1}.stk-block-tab-labels:not(.stk-block-tab-labels--wrap-mobile){overflow-x:auto!important;width:100%}.stk-block-tab-labels:not(.stk-block-tab-labels--wrap-mobile)::-webkit-scrollbar{height:0!important}.stk-block-tab-labels:not(.stk-block-tab-labels--wrap-mobile) .stk-block-tab-labels__wrapper{flex-wrap:nowrap;min-width:-webkit-fill-available;min-width:fill-available;width:max-content}.stk-block-tabs>.stk-inner-blocks{grid-template-columns:1fr}.stk-block-tabs>.stk-inner-blocks>.stk-block-tab-labels:last-child{grid-row:1/2}.stk-block.stk-block-timeline{--content-line:0!important;padding-top:0}.stk-block-timeline>.stk-inner-blocks{align-items:flex-start;grid-template-columns:var(--line-dot-size,16px) 1fr;grid-template-rows:auto 1fr;padding-left:16px}.stk-block-timeline>.stk-inner-blocks:after{inset-inline-start:calc(var(--line-dot-size, 16px)/2 - var(--line-bg-width, 3px)/2 + 16px)}.stk-block-timeline .stk-block-timeline__middle{inset-block-start:8px;inset-inline-start:16px;position:absolute}.stk-block-timeline .stk-block-timeline__content{grid-column:2/3;grid-row:2/3;text-align:start}.stk-block-timeline .stk-block-timeline__date{grid-column:2/3;grid-row:1/2;text-align:start}.stk-block-timeline>.stk-inner-blocks:after{bottom:calc(100% - var(--line-dot-size, 16px)/2 - .5em);top:calc(var(--line-dot-size, 16px)/2 + .5em)}.stk-block-timeline+.stk-block-timeline>.stk-inner-blocks:after{top:-16px}:root{--stk-block-margin-bottom:16px;--stk-column-margin:8px;--stk-container-padding:24px;--stk-container-padding-large:32px 24px;--stk-container-padding-small:8px 24px;--stk-block-background-padding:16px}.stk-block .stk-block:is(.aligncenter,.alignwide),.stk-block:is(.aligncenter,.alignwide,.alignfull)>.stk-content-align.alignwide,.stk-block:is(.aligncenter,.alignwide,.alignfull)>.stk-content-align:not(.alignwide):not(.alignfull){width:100%}.stk-column{flex:1 1 100%;max-width:100%}.stk--hide-mobile,.stk--hide-mobile.stk-block{display:none!important}.stk-button-group:is(.stk--collapse-on-mobile) .stk-block:is(.stk-block-button,.stk-block-icon-button),.stk-button-group:is(.stk--collapse-on-tablet) .stk-block:is(.stk-block-button,.stk-block-icon-button){margin-inline-end:var(--stk-alignment-margin-right);margin-inline-start:var(--stk-alignment-margin-left)}.has-text-align-center-mobile{--stk-alignment-padding-left:0;--stk-alignment-justify-content:center;--stk-alignment-text-align:center;--stk-alignment-margin-left:auto;--stk-alignment-margin-right:auto;text-align:var(--stk-alignment-text-align,start)}.has-text-align-left-mobile{--stk-alignment-justify-content:flex-start;--stk-alignment-text-align:start;--stk-alignment-margin-left:0;--stk-alignment-margin-right:auto;text-align:var(--stk-alignment-text-align,start)}.has-text-align-right-mobile{--stk-alignment-justify-content:flex-end;--stk-alignment-text-align:end;--stk-alignment-margin-left:auto;--stk-alignment-margin-right:0;text-align:var(--stk-alignment-text-align,start)}.has-text-align-justify-mobile{--stk-alignment-text-align:justify}.has-text-align-space-between-mobile{--stk-alignment-justify-content:space-between}.has-text-align-space-around-mobile{--stk-alignment-justify-content:space-around}.has-text-align-space-evenly-mobile{--stk-alignment-justify-content:space-evenly}.entry-content .stk-block.stk-has-top-separator{padding-top:23vw}.entry-content .stk-block.stk-has-bottom-separator{padding-bottom:23vw}.entry-content .stk-block .stk-separator__wrapper{height:23vw}}#end-resizable-editor-section{display:none} +#start-resizable-editor-section{display:none}@media only screen and (min-width:1024px){:where(.has-text-align-left) .stk-block-divider{--stk-dots-margin-left:0;--stk-dots-margin-right:auto}:where(.has-text-align-right) .stk-block-divider{--stk-dots-margin-right:0;--stk-dots-margin-left:auto}:where(.has-text-align-center) .stk-block-divider{--stk-dots-margin-right:auto;--stk-dots-margin-left:auto}.stk-block.stk-block-divider.has-text-align-center{--stk-dots-margin-right:auto;--stk-dots-margin-left:auto}.stk-block.stk-block-divider.has-text-align-right{--stk-dots-margin-right:0;--stk-dots-margin-left:auto}.stk-block.stk-block-divider.has-text-align-left{--stk-dots-margin-left:0;--stk-dots-margin-right:auto}.stk-block-feature>*>.stk-row{flex-wrap:var(--stk-feature-flex-wrap,nowrap)}.stk-row{flex-wrap:nowrap}.stk--hide-desktop,.stk--hide-desktop.stk-block{display:none!important}}@media only screen and (min-width:768px){:where(body:not(.wp-admin) .stk-block-column:first-child:nth-last-child(2)){flex:1 1 calc(50% - var(--stk-column-gap, 0px)*1/2)!important}:where(body:not(.wp-admin) .stk-block-column:nth-child(2):last-child){flex:1 1 calc(50% - var(--stk-column-gap, 0px)*1/2)!important}:where(body:not(.wp-admin) .stk-block-column:first-child:nth-last-child(3)){flex:1 1 calc(33.33333% - var(--stk-column-gap, 0px)*2/3)!important}:where(body:not(.wp-admin) .stk-block-column:nth-child(2):nth-last-child(2)){flex:1 1 calc(33.33333% - var(--stk-column-gap, 0px)*2/3)!important}:where(body:not(.wp-admin) .stk-block-column:nth-child(3):last-child){flex:1 1 calc(33.33333% - var(--stk-column-gap, 0px)*2/3)!important}:where(body:not(.wp-admin) .stk-block-column:first-child:nth-last-child(4)){flex:1 1 calc(25% - var(--stk-column-gap, 0px)*3/4)!important}:where(body:not(.wp-admin) .stk-block-column:nth-child(2):nth-last-child(3)){flex:1 1 calc(25% - var(--stk-column-gap, 0px)*3/4)!important}:where(body:not(.wp-admin) .stk-block-column:nth-child(3):nth-last-child(2)){flex:1 1 calc(25% - var(--stk-column-gap, 0px)*3/4)!important}:where(body:not(.wp-admin) .stk-block-column:nth-child(4):last-child){flex:1 1 calc(25% - var(--stk-column-gap, 0px)*3/4)!important}:where(body:not(.wp-admin) .stk-block-column:first-child:nth-last-child(5)){flex:1 1 calc(20% - var(--stk-column-gap, 0px)*4/5)!important}:where(body:not(.wp-admin) .stk-block-column:nth-child(2):nth-last-child(4)){flex:1 1 calc(20% - var(--stk-column-gap, 0px)*4/5)!important}:where(body:not(.wp-admin) .stk-block-column:nth-child(3):nth-last-child(3)){flex:1 1 calc(20% - var(--stk-column-gap, 0px)*4/5)!important}:where(body:not(.wp-admin) .stk-block-column:nth-child(4):nth-last-child(2)){flex:1 1 calc(20% - var(--stk-column-gap, 0px)*4/5)!important}:where(body:not(.wp-admin) .stk-block-column:nth-child(5):last-child){flex:1 1 calc(20% - var(--stk-column-gap, 0px)*4/5)!important}:where(body:not(.wp-admin) .stk-block-column:first-child:nth-last-child(6)){flex:1 1 calc(16.66667% - var(--stk-column-gap, 0px)*5/6)!important}:where(body:not(.wp-admin) .stk-block-column:nth-child(2):nth-last-child(5)){flex:1 1 calc(16.66667% - var(--stk-column-gap, 0px)*5/6)!important}:where(body:not(.wp-admin) .stk-block-column:nth-child(3):nth-last-child(4)){flex:1 1 calc(16.66667% - var(--stk-column-gap, 0px)*5/6)!important}:where(body:not(.wp-admin) .stk-block-column:nth-child(4):nth-last-child(3)){flex:1 1 calc(16.66667% - var(--stk-column-gap, 0px)*5/6)!important}:where(body:not(.wp-admin) .stk-block-column:nth-child(5):nth-last-child(2)){flex:1 1 calc(16.66667% - var(--stk-column-gap, 0px)*5/6)!important}:where(body:not(.wp-admin) .stk-block-column:nth-child(6):last-child){flex:1 1 calc(16.66667% - var(--stk-column-gap, 0px)*5/6)!important}.stk-block-tabs>.stk-inner-blocks.stk-block-tabs--vertical{grid-template-columns:auto 1fr auto}.stk-block-tabs>.stk-inner-blocks.stk-block-tabs--vertical>.stk-block-tab-labels:first-child{grid-column:1/2}.stk-block-tabs>.stk-inner-blocks.stk-block-tabs--vertical>.stk-block-tab-content:last-child{grid-column:2/4}.stk-block-tabs>.stk-inner-blocks.stk-block-tabs--vertical>.stk-block-tab-content:first-child{grid-column:1/3}.stk-block-tabs>.stk-inner-blocks.stk-block-tabs--vertical>.stk-block-tab-labels:last-child{grid-column:3/4}.stk-block .stk-block.aligncenter,.stk-block-carousel:is(.aligncenter,.alignwide,.alignfull)>:where(.stk-block-carousel__content-wrapper)>.stk-content-align:not(.alignwide):not(.alignfull),.stk-block:is(.aligncenter,.alignwide,.alignfull)>.stk-content-align:not(.alignwide):not(.alignfull){margin-left:auto;margin-right:auto;max-width:var(--stk-block-default-width,var(--stk-block-width-default-detected,900px));width:100%}.stk-block .stk-block.alignwide,.stk-block-carousel:is(.aligncenter,.alignwide,.alignfull)>:where(.stk-block-carousel__content-wrapper)>.stk-content-align.alignwide,.stk-block:is(.aligncenter,.alignwide,.alignfull)>.stk-content-align.alignwide{margin-left:auto;margin-right:auto;max-width:var(--stk-block-wide-width,var(--stk-block-width-wide-detected,80vw));width:100%}.stk-row.stk-columns-2>.stk-column{flex:1 1 50%;max-width:50%}.stk-row.stk-columns-3>.stk-column{flex:1 1 33.3333333333%;max-width:33.3333333333%}.stk-row.stk-columns-4>.stk-column{flex:1 1 25%;max-width:25%}.stk-row.stk-columns-5>.stk-column{flex:1 1 20%;max-width:20%}.stk-row.stk-columns-6>.stk-column{flex:1 1 16.6666666667%;max-width:16.6666666667%}.stk-row.stk-columns-7>.stk-column{flex:1 1 14.2857142857%;max-width:14.2857142857%}.stk-row.stk-columns-8>.stk-column{flex:1 1 12.5%;max-width:12.5%}.stk-row.stk-columns-9>.stk-column{flex:1 1 11.1111111111%;max-width:11.1111111111%}.stk-row.stk-columns-10>.stk-column{flex:1 1 10%;max-width:10%}}@media only screen and (min-width:768px) and (max-width:1023px){.stk-button-group:is(.stk--collapse-on-tablet)>.block-editor-inner-blocks>.block-editor-block-list__layout>[data-block]{margin-inline-end:var(--stk-alignment-margin-right);margin-inline-start:var(--stk-alignment-margin-left)}:where(.has-text-align-left-tablet) .stk-block-divider{--stk-dots-margin-left:0;--stk-dots-margin-right:auto}:where(.has-text-align-right-tablet) .stk-block-divider{--stk-dots-margin-right:0;--stk-dots-margin-left:auto}:where(.has-text-align-center-tablet) .stk-block-divider{--stk-dots-margin-right:auto;--stk-dots-margin-left:auto}.stk--hide-tablet,.stk--hide-tablet.stk-block{display:none!important}.stk-button-group:is(.stk--collapse-on-tablet) .stk-block:is(.stk-block-button,.stk-block-icon-button){margin-inline-end:var(--stk-alignment-margin-right);margin-inline-start:var(--stk-alignment-margin-left)}}@media only screen and (max-width:1023px){.stk-block-button{min-width:-moz-fit-content;min-width:fit-content}.stk-block.stk-block-divider.has-text-align-center-tablet{--stk-dots-margin-right:auto;--stk-dots-margin-left:auto}.stk-block.stk-block-divider.has-text-align-right-tablet{--stk-dots-margin-right:0;--stk-dots-margin-left:auto}.stk-block.stk-block-divider.has-text-align-left-tablet{--stk-dots-margin-left:0;--stk-dots-margin-right:auto}.has-text-align-center-tablet{--stk-alignment-padding-left:0;--stk-alignment-justify-content:center;--stk-alignment-text-align:center;--stk-alignment-margin-left:auto;--stk-alignment-margin-right:auto;text-align:var(--stk-alignment-text-align,start)}.has-text-align-left-tablet{--stk-alignment-justify-content:flex-start;--stk-alignment-text-align:start;--stk-alignment-margin-left:0;--stk-alignment-margin-right:auto;text-align:var(--stk-alignment-text-align,start)}.has-text-align-right-tablet{--stk-alignment-justify-content:flex-end;--stk-alignment-text-align:end;--stk-alignment-margin-left:auto;--stk-alignment-margin-right:0;text-align:var(--stk-alignment-text-align,start)}.has-text-align-justify-tablet{--stk-alignment-text-align:justify}.has-text-align-space-between-tablet{--stk-alignment-justify-content:space-between}.has-text-align-space-around-tablet{--stk-alignment-justify-content:space-around}.has-text-align-space-evenly-tablet{--stk-alignment-justify-content:space-evenly}.stk-block-timeline.stk-block-timeline__ios-polyfill{--fixed-bg:linear-gradient(to bottom,var(--line-accent-bg-color,#000) 0,var(--line-accent-bg-color-2,#000) var(--line-accent-bg-location,50%))}}@media only screen and (max-width:767px){.stk-button-group:is(.stk--collapse-on-mobile)>.block-editor-inner-blocks>.block-editor-block-list__layout>[data-block],.stk-button-group:is(.stk--collapse-on-tablet)>.block-editor-inner-blocks>.block-editor-block-list__layout>[data-block]{margin-inline-end:var(--stk-alignment-margin-right);margin-inline-start:var(--stk-alignment-margin-left)}.entry-content .stk-block.stk-has-top-separator{padding-top:23vw}.entry-content .stk-block.stk-has-bottom-separator{padding-bottom:23vw}.entry-content .stk-block .stk-separator__wrapper{height:23vw}.stk-block-carousel.stk--hide-mobile-arrows>.stk-block-carousel__content-wrapper>*>.stk-block-carousel__buttons,.stk-block-carousel.stk--hide-mobile-dots>.stk-block-carousel__content-wrapper>.stk-block-carousel__dots{display:none}:where(.has-text-align-left-mobile) .stk-block-divider{--stk-dots-margin-left:0;--stk-dots-margin-right:auto}:where(.has-text-align-right-mobile) .stk-block-divider{--stk-dots-margin-right:0;--stk-dots-margin-left:auto}:where(.has-text-align-center-mobile) .stk-block-divider{--stk-dots-margin-right:auto;--stk-dots-margin-left:auto}.stk-block.stk-block-divider.has-text-align-center-mobile{--stk-dots-margin-right:auto;--stk-dots-margin-left:auto}.stk-block.stk-block-divider.has-text-align-right-mobile{--stk-dots-margin-right:0;--stk-dots-margin-left:auto}.stk-block.stk-block-divider.has-text-align-left-mobile{--stk-dots-margin-left:0;--stk-dots-margin-right:auto}.stk-block.stk-block-feature:is(.is-style-default,.is-style-horizontal)>.stk-container>.stk-inner-blocks.stk-block-content{flex-direction:column-reverse}.stk-block-posts{--stk-columns:1}.stk-block-tab-labels:not(.stk-block-tab-labels--wrap-mobile){overflow-x:auto!important;width:100%}.stk-block-tab-labels:not(.stk-block-tab-labels--wrap-mobile)::-webkit-scrollbar{height:0!important}.stk-block-tab-labels:not(.stk-block-tab-labels--wrap-mobile) .stk-block-tab-labels__wrapper{flex-wrap:nowrap;min-width:-webkit-fill-available;min-width:fill-available;width:max-content}.stk-block-tabs>.stk-inner-blocks{grid-template-columns:1fr}.stk-block-tabs>.stk-inner-blocks>.stk-block-tab-labels:last-child{grid-row:1/2}:root{--stk-block-margin-bottom:16px;--stk-column-margin:8px;--stk-container-padding:24px;--stk-container-padding-large:32px 24px;--stk-container-padding-small:8px 24px;--stk-block-background-padding:16px}.stk-block .stk-block:is(.aligncenter,.alignwide),.stk-block:is(.aligncenter,.alignwide,.alignfull)>.stk-content-align.alignwide,.stk-block:is(.aligncenter,.alignwide,.alignfull)>.stk-content-align:not(.alignwide):not(.alignfull){width:100%}.stk-column{flex:1 1 100%;max-width:100%}.stk--hide-mobile,.stk--hide-mobile.stk-block{display:none!important}.stk-button-group:is(.stk--collapse-on-mobile) .stk-block:is(.stk-block-button,.stk-block-icon-button),.stk-button-group:is(.stk--collapse-on-tablet) .stk-block:is(.stk-block-button,.stk-block-icon-button){margin-inline-end:var(--stk-alignment-margin-right);margin-inline-start:var(--stk-alignment-margin-left)}.has-text-align-center-mobile{--stk-alignment-padding-left:0;--stk-alignment-justify-content:center;--stk-alignment-text-align:center;--stk-alignment-margin-left:auto;--stk-alignment-margin-right:auto;text-align:var(--stk-alignment-text-align,start)}.has-text-align-left-mobile{--stk-alignment-justify-content:flex-start;--stk-alignment-text-align:start;--stk-alignment-margin-left:0;--stk-alignment-margin-right:auto;text-align:var(--stk-alignment-text-align,start)}.has-text-align-right-mobile{--stk-alignment-justify-content:flex-end;--stk-alignment-text-align:end;--stk-alignment-margin-left:auto;--stk-alignment-margin-right:0;text-align:var(--stk-alignment-text-align,start)}.has-text-align-justify-mobile{--stk-alignment-text-align:justify}.has-text-align-space-between-mobile{--stk-alignment-justify-content:space-between}.has-text-align-space-around-mobile{--stk-alignment-justify-content:space-around}.has-text-align-space-evenly-mobile{--stk-alignment-justify-content:space-evenly}.stk-block.stk-block-timeline{--content-line:0!important;padding-top:0}.stk-block-timeline>.stk-inner-blocks{align-items:flex-start;grid-template-columns:var(--line-dot-size,16px) 1fr;grid-template-rows:auto 1fr;padding-left:16px}.stk-block-timeline>.stk-inner-blocks:after{inset-inline-start:calc(var(--line-dot-size, 16px)/2 - var(--line-bg-width, 3px)/2 + 16px)}.stk-block-timeline .stk-block-timeline__middle{inset-block-start:8px;inset-inline-start:16px;position:absolute}.stk-block-timeline .stk-block-timeline__content{grid-column:2/3;grid-row:2/3;text-align:start}.stk-block-timeline .stk-block-timeline__date{grid-column:2/3;grid-row:1/2;text-align:start}.stk-block-timeline>.stk-inner-blocks:after{bottom:calc(100% - var(--line-dot-size, 16px)/2 - .5em);top:calc(var(--line-dot-size, 16px)/2 + .5em)}.stk-block-timeline+.stk-block-timeline>.stk-inner-blocks:after{top:-16px}}#end-resizable-editor-section{display:none} STK_RESPONSIVE_CSS; } } From bf2273d7eb06c626f1beb383b4da8396ba85aa34 Mon Sep 17 00:00:00 2001 From: bfintal Date: Thu, 13 Aug 2026 18:37:25 +0800 Subject: [PATCH 04/13] Cover Global Block Styles rename, update, and delete in e2e. --- e2e/readme.md | 2 +- e2e/test-utils/index.ts | 11 ++++++- e2e/test-utils/inspector.ts | 57 +++++++++++++++++++++++++++++++++++++ 3 files changed, 68 insertions(+), 2 deletions(-) diff --git a/e2e/readme.md b/e2e/readme.md index 572dcbd7c5..c8bb93ad0e 100644 --- a/e2e/readme.md +++ b/e2e/readme.md @@ -156,7 +156,7 @@ Fail if a panel still shows `ProControl` / "Get Premium" while premium is mocked | Surface | Flow | |---------|------| | Design System | Sidebar opens; Preview; Color Schemes / Font pairs / Size presets / Icon Library are live controls | -| Global Block Styles | Save a named style from one Text block, apply it to a second; canvas uses the style, inspector stays at defaults and can override | +| Global Block Styles | Save a named style from one Text block, apply it to a second; canvas uses the style, inspector stays at defaults and can override; rename and delete from Design System; updating a style applies the change to other blocks that use it | | Dynamic Content | Post title / meta / featured image resolve on the frontend | | Conditional display | Hide-when-logged-in: absent on frontend, present in editor | | Motion / Transform / Custom CSS | Entrance class, hover transform CSS, unique rule on frontend | diff --git a/e2e/test-utils/index.ts b/e2e/test-utils/index.ts index 939aefe5e6..56a855e68e 100644 --- a/e2e/test-utils/index.ts +++ b/e2e/test-utils/index.ts @@ -6,4 +6,13 @@ export * from './format' export { assertNoBlockRecovery } from './block-recovery' export { insertStackableCatalog, waitForBlockEditor, TOP_LEVEL_BLOCKS } from './catalog' export { publishAndVisitFrontend, getEditorPostId } from './frontend' -export { assertNoUpsell, openInspectorPanel, openBlockStylesPopover, closeBlockStylesPopover } from './inspector' +export { + assertNoUpsell, + openInspectorPanel, + openBlockStylesPopover, + closeBlockStylesPopover, + waitForWpSettingsSave, + saveNewBlockStyle, + applyBlockStyleByName, + confirmUpdateBlockStyle, +} from './inspector' diff --git a/e2e/test-utils/inspector.ts b/e2e/test-utils/inspector.ts index d01f1cb0b4..063ee9e6e9 100644 --- a/e2e/test-utils/inspector.ts +++ b/e2e/test-utils/inspector.ts @@ -38,3 +38,60 @@ export const closeBlockStylesPopover = async ( page: Page ) => { } await expect( page.locator( '.ugb-block-styles-controls__popover' ) ).toHaveCount( 0 ) } + +export const waitForWpSettingsSave = ( page: Page, timeout = 15_000 ) => + page.waitForResponse( response => { + const url = decodeURIComponent( response.url() ) + return url.includes( '/wp/v2/settings' ) && + [ 'POST', 'PUT', 'PATCH' ].includes( response.request().method() ) + }, { timeout } ) + +export const saveNewBlockStyle = async ( page: Page, styleName: string, styleSlug: string ) => { + const popover = await openBlockStylesPopover( page ) + await expect( popover.getByRole( 'button', { name: 'Save New Block Style' } ) ) + .toBeVisible( { timeout: 15_000 } ) + await popover.getByRole( 'button', { name: 'Save New Block Style' } ).click() + + const modal = page.locator( '.ugb-block-styles__new-style-modal' ) + await expect( modal ).toBeVisible() + await expect( modal.getByRole( 'heading', { name: 'Create New Block Style' } ) ).toBeVisible() + await modal.locator( 'input[name="name"]' ).click() + await modal.locator( 'input[name="name"]' ).fill( styleName ) + await modal.locator( 'input[name="slug"]' ).click() + await modal.locator( 'input[name="slug"]' ).fill( styleSlug ) + await modal.locator( 'input[name="slug"]' ).blur() + + const saved = waitForWpSettingsSave( page ) + await modal.getByRole( 'button', { name: 'Create Block Style' } ).click() + await saved.catch( () => undefined ) + await expect( modal ).toHaveCount( 0, { timeout: 15_000 } ) + await expect( page.locator( '.ugb-block-styles-controls__block-style-button' ) ) + .toContainText( styleName, { timeout: 15_000 } ) +} + +export const applyBlockStyleByName = async ( page: Page, styleName: string ) => { + const popover = await openBlockStylesPopover( page ) + await expect( popover.locator( '.ugb-block-styles-controls__list' ) ) + .toContainText( styleName ) + await popover.locator( '.ugb-block-styles-controls__list' ) + .getByRole( 'button', { name: styleName } ) + .click() + await closeBlockStylesPopover( page ) +} + +export const confirmUpdateBlockStyle = async ( page: Page ) => { + const popover = await openBlockStylesPopover( page ) + const update = popover.getByRole( 'button', { name: 'Update Style' } ) + await expect( update ).toBeVisible( { timeout: 15_000 } ) + await update.click() + + const modal = page.locator( '.ugb-block-styles__new-style-modal' ) + await expect( modal ).toBeVisible() + await expect( modal.getByRole( 'heading', { name: /Update Block Style/ } ) ).toBeVisible() + + const saved = waitForWpSettingsSave( page ) + await modal.getByRole( 'button', { name: 'Update Block Style' } ).click() + await saved.catch( () => undefined ) + await expect( modal ).toHaveCount( 0, { timeout: 15_000 } ) + await closeBlockStylesPopover( page ) +} From dfc6a5076dc0b5d4b5953b338562e517916b3829 Mon Sep 17 00:00:00 2001 From: bfintal Date: Thu, 13 Aug 2026 18:39:04 +0800 Subject: [PATCH 05/13] fix: persist e2e drafts via the editor data store Gutenberg's saveDraft helper waits for a Save draft button that becomes Saved after reload, which timed out the catalog test and closed the page. --- e2e/test-utils/editor.ts | 43 +++++++++++++++++++ .../upgrade-from-old-version.spec.ts | 1 + e2e/tests/block-catalog.spec.ts | 2 +- 3 files changed, 45 insertions(+), 1 deletion(-) diff --git a/e2e/test-utils/editor.ts b/e2e/test-utils/editor.ts index ebf14703b4..c0d6fcb4f5 100644 --- a/e2e/test-utils/editor.ts +++ b/e2e/test-utils/editor.ts @@ -12,6 +12,49 @@ class ExtendedEditor extends BaseEditor { return attributes } + + /** + * Persist the current editor document as a draft. + * + * Gutenberg's helper clicks the "Save draft" top-bar button. After autosave + * or a reload of an already-saved draft that button is named "Saved" and + * the click waits until the test timeout closes the page. + */ + saveDraft = async function() { + await this.page.waitForFunction( + () => window?.wp?.data?.select?.( 'core/editor' ) && window?.wp?.data?.dispatch?.( 'core/editor' ) + ) + + await this.page.waitForFunction( () => { + return ! window.wp.data.select( 'core/editor' ).isSavingPost() + }, null, { timeout: 60_000 } ) + + const needsSave = await this.page.evaluate( () => { + const editor = window.wp.data.select( 'core/editor' ) + return editor.isEditedPostNew() || editor.isEditedPostDirty() + } ) + + if ( needsSave ) { + await this.page.evaluate( async () => { + await window.wp.data.dispatch( 'core/editor' ).savePost() + } ) + + await this.page.waitForFunction( () => { + return ! window.wp.data.select( 'core/editor' ).isSavingPost() + }, null, { timeout: 60_000 } ) + + const saveFailed = await this.page.evaluate( () => { + return window.wp.data.select( 'core/editor' ).didPostSaveRequestFail() + } ) + if ( saveFailed ) { + throw new Error( 'Editor saveDraft failed to persist the post' ) + } + } + + await this.page.waitForFunction( () => { + return !! new URLSearchParams( window.location.search ).get( 'post' ) + } ) + } } export { ExtendedEditor } diff --git a/e2e/tests-upgrade/upgrade-from-old-version.spec.ts b/e2e/tests-upgrade/upgrade-from-old-version.spec.ts index 553d598170..4ca48f1335 100644 --- a/e2e/tests-upgrade/upgrade-from-old-version.spec.ts +++ b/e2e/tests-upgrade/upgrade-from-old-version.spec.ts @@ -19,6 +19,7 @@ test.describe( `Upgrade from Stackable ${ UPGRADE_FROM_VERSION }`, () => { requestUtils, stackable, } ) => { + test.setTimeout( 300_000 ) await stackable.dismissToursAndNotices() await admin.createNewPost( { title: `Upgrade from ${ UPGRADE_FROM_VERSION }` } ) diff --git a/e2e/tests/block-catalog.spec.ts b/e2e/tests/block-catalog.spec.ts index 7749f8786f..ac44a36c6e 100644 --- a/e2e/tests/block-catalog.spec.ts +++ b/e2e/tests/block-catalog.spec.ts @@ -27,7 +27,7 @@ test.describe( 'Block catalog', () => { editor, requestUtils, } ) => { - test.setTimeout( 180_000 ) + test.setTimeout( 300_000 ) await admin.createNewPost( { title: 'Block Catalog' } ) await insertStackableCatalog( editor, TOP_LEVEL_BLOCKS ) await editor.saveDraft() From 307ccb53f809b81982a75593e217f3a397f239b7 Mon Sep 17 00:00:00 2001 From: bfintal Date: Thu, 13 Aug 2026 19:00:47 +0800 Subject: [PATCH 06/13] fix: fill Global Spacing e2e range controls after leaving preset mode --- e2e/tests/global-settings.spec.ts | 37 +++++++++++++++++++------------ 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/e2e/tests/global-settings.spec.ts b/e2e/tests/global-settings.spec.ts index 0fe1d4c232..5ba5304ec3 100644 --- a/e2e/tests/global-settings.spec.ts +++ b/e2e/tests/global-settings.spec.ts @@ -1,5 +1,26 @@ +import { Page } from '@playwright/test' import { test, expect } from 'e2e/test-utils' +/** + * Size-preset (mark) mode is the default for Global Spacing / Buttons range + * controls. That mode hides the number field until Custom is toggled, and the + * custom field is a text input, not a spinbutton. + */ +const fillRangeControl = async ( page: Page, label: string, value: string ) => { + const control = page.locator( '.stk-control' ).filter( { + has: page.locator( '.stk-control-label', { hasText: label } ), + } ).first() + await expect( control ).toBeVisible() + + const numberInput = control.locator( 'input[type="text"], input[type="number"]' ) + if ( await numberInput.count() === 0 ) { + await control.locator( '.stk-range-control__custom-button' ).click() + } + + await expect( numberInput.first() ).toBeVisible() + await numberInput.first().fill( value ) +} + test.describe( 'Global Settings', () => { let pid = null @@ -132,23 +153,11 @@ test.describe( 'Global Settings', () => { await page.getByLabel( 'Stackable Design System' ).click() await page.getByRole( 'button', { name: 'Global Spacing & Borders' } ).click() await expect( page.getByText( 'Block Margin Bottom' ) ).toBeVisible() - - const marginInput = page.locator( '.stk-control, .components-base-control' ) - .filter( { hasText: 'Block Margin Bottom' } ) - .getByRole( 'spinbutton' ) - .first() - await expect( marginInput ).toBeVisible() - await marginInput.fill( '40' ) + await fillRangeControl( page, 'Block Margin Bottom', '40' ) await page.getByRole( 'button', { name: 'Global Buttons & Icons' } ).click() await expect( page.getByText( 'Min. Button Height' ) ).toBeVisible() - - const heightInput = page.locator( '.stk-control, .components-base-control' ) - .filter( { hasText: 'Min. Button Height' } ) - .getByRole( 'spinbutton' ) - .first() - await expect( heightInput ).toBeVisible() - await heightInput.fill( '48' ) + await fillRangeControl( page, 'Min. Button Height', '48' ) const textBlock = editor.canvas.locator( '[data-type="stackable/text"] .stk-block' ).first() await expect.poll( async () => { From c9260501d79e5cc299c157e20f421338d82526d7 Mon Sep 17 00:00:00 2001 From: bfintal Date: Thu, 13 Aug 2026 19:20:38 +0800 Subject: [PATCH 07/13] test: give interactive frontend specs real block content and behavior Empty accordion and carousel inserts never saved inner blocks, and Count Up, Progress Bar, and Table of Contents need their own viewport, value, and heading-link checks. --- e2e/tests/frontend-interactive.spec.ts | 245 +++++++++++++++++++++++-- 1 file changed, 228 insertions(+), 17 deletions(-) diff --git a/e2e/tests/frontend-interactive.spec.ts b/e2e/tests/frontend-interactive.spec.ts index 33c5e81ff1..6251e4a3fa 100644 --- a/e2e/tests/frontend-interactive.spec.ts +++ b/e2e/tests/frontend-interactive.spec.ts @@ -1,6 +1,60 @@ import { test, expect } from 'e2e/test-utils' import { publishAndVisitFrontend, getEditorPostId } from 'e2e/test-utils' +const pickDefaultLayoutIfPresent = async editor => { + const picker = editor.canvas.locator( '.stk-variation-picker' ) + const firstVariation = picker.locator( '.block-editor-block-variation-picker__variation' ).first() + + try { + await firstVariation.waitFor( { state: 'visible', timeout: 10_000 } ) + } catch { + return + } + + await firstVariation.click() + await expect( picker ).toBeHidden() +} + +const insertViewportSpacer = async editor => { + await editor.insertBlock( { + name: 'core/spacer', + attributes: { height: '1100px' }, + } ) +} + +const waitForTocHeadings = async ( editor, expectedTexts ) => { + const tocBlock = editor.canvas.locator( '[data-type="stackable/table-of-contents"]' ).first() + await expect( tocBlock ).toBeVisible() + + for ( const text of expectedTexts ) { + await expect( tocBlock.getByText( text ) ).toBeVisible( { timeout: 15_000 } ) + } + + const generateAnchors = tocBlock.getByRole( 'button', { + name: 'Auto-generate missing anchor ids', + } ) + if ( await generateAnchors.isVisible().catch( () => false ) ) { + await generateAnchors.click() + } + + // Deselect the TOC so heading detection can flush into block attributes. + await editor.canvas.locator( '[data-type="core/heading"], [data-type="stackable/heading"]' ).last().click() + + await expect( async () => { + const clientId = await tocBlock.getAttribute( 'data-block' ) + const attributes = await editor.getBlockAttributes( clientId ) + const contents = ( attributes.headings || [] ).map( heading => heading.content ) + for ( const text of expectedTexts ) { + expect( contents ).toContain( text ) + } + for ( const heading of attributes.headings ) { + if ( expectedTexts.includes( heading.content ) ) { + expect( heading.anchor ).toBeTruthy() + } + } + } ).toPass( { timeout: 15_000 } ) +} + test.describe( 'Interactive frontend', () => { let pid = null @@ -25,12 +79,28 @@ test.describe( 'Interactive frontend', () => { page, editor, requestUtils, admin, } ) => { await editor.insertBlock( { name: 'stackable/accordion' } ) + await pickDefaultLayoutIfPresent( editor ) + + const accordionBlock = editor.canvas.locator( '[data-type="stackable/accordion"]' ).first() + const heading = accordionBlock.locator( '[data-type="stackable/heading"] [role="textbox"]' ).first() + const panelText = accordionBlock.locator( '[data-type="stackable/text"] [role="textbox"]' ).first() + await expect( heading ).toBeVisible( { timeout: 15_000 } ) + await heading.fill( 'E2E Accordion Title' ) + + // The panel is collapsed in the editor until the heading is clicked. + await accordionBlock.locator( '.stk-block-accordion__heading' ).click() + await panelText.fill( 'E2E accordion panel content', { force: true } ) + await publishAndVisitFrontend( page, editor, requestUtils, admin ) const accordion = page.locator( 'details.stk-block-accordion' ).first() await expect( accordion ).toBeVisible() + await expect( accordion.getByText( 'E2E Accordion Title' ) ).toBeVisible() + await expect( accordion.getByText( 'E2E accordion panel content' ) ).toBeHidden() + await accordion.locator( 'summary' ).first().click() await expect( accordion ).toHaveAttribute( 'open', '' ) + await expect( accordion.getByText( 'E2E accordion panel content' ) ).toBeVisible() } ) test( 'Tabs switch panels', async ( { @@ -50,17 +120,44 @@ test.describe( 'Interactive frontend', () => { test( 'Carousel next control changes the slide', async ( { page, editor, requestUtils, admin, } ) => { - await editor.insertBlock( { name: 'stackable/carousel' } ) + await editor.insertBlock( { + name: 'stackable/carousel', + innerBlocks: [ 1, 2, 3 ].map( n => ( { + name: 'stackable/column', + innerBlocks: [ + { + name: 'stackable/heading', + attributes: { text: `E2E Carousel Slide ${ n }` }, + }, + { + name: 'stackable/text', + attributes: { + text: 'Carousel slide body copy so the slider has height and the next control stays clickable.', + }, + }, + ], + } ) ), + } ) + + await expect( + editor.canvas.getByText( 'E2E Carousel Slide 1' ) + ).toBeVisible( { timeout: 15_000 } ) + await expect( editor.canvas.getByText( 'E2E Carousel Slide 2' ) ).toBeVisible() + await expect( editor.canvas.getByText( 'E2E Carousel Slide 3' ) ).toBeVisible() + await publishAndVisitFrontend( page, editor, requestUtils, admin ) const carousel = page.locator( '.stk-block-carousel' ).first() await expect( carousel ).toBeVisible() + await expect( carousel.getByText( 'E2E Carousel Slide 1' ) ).toBeVisible() + const next = carousel.locator( '.stk-block-carousel__button__next' ).first() await expect( next ).toBeVisible() const firstSlide = carousel.locator( '.stk-block-carousel__slider > .stk-block-column' ).first() await expect( firstSlide ).toHaveAttribute( 'aria-hidden', 'false' ) await next.click() await expect( firstSlide ).toHaveAttribute( 'aria-hidden', 'true' ) + await expect( carousel.getByText( 'E2E Carousel Slide 2' ) ).toBeVisible() } ) test( 'Expand reveals more content', async ( { @@ -96,6 +193,10 @@ test.describe( 'Interactive frontend', () => { page, editor, requestUtils, admin, } ) => { await editor.insertBlock( { name: 'stackable/notification' } ) + await pickDefaultLayoutIfPresent( editor ) + await expect( + editor.canvas.locator( '[data-type="stackable/notification"]' ).first() + ).toBeVisible() await publishAndVisitFrontend( page, editor, requestUtils, admin ) const notification = page.locator( '.stk-block-notification' ).first() @@ -112,19 +213,61 @@ test.describe( 'Interactive frontend', () => { await expect( page.locator( '.stk-block-horizontal-scroller' ).first() ).toBeVisible() } ) - test( 'Countdown, Count Up, and Progress widgets render', async ( { + test( 'Countdown renders on the frontend', async ( { page, editor, requestUtils, admin, } ) => { await editor.insertBlock( { name: 'stackable/countdown' } ) + await expect( + editor.canvas.locator( '[data-type="stackable/countdown"]' ).first() + ).toBeVisible() + await publishAndVisitFrontend( page, editor, requestUtils, admin ) + await expect( page.locator( '.stk-block-countdown' ).first() ).toBeVisible() + } ) + + test( 'Count Up animates when it enters the viewport', async ( { + page, editor, requestUtils, admin, + } ) => { + await insertViewportSpacer( editor ) await editor.insertBlock( { name: 'stackable/count-up' } ) - await editor.insertBlock( { name: 'stackable/progress-bar' } ) - await editor.insertBlock( { name: 'stackable/progress-circle' } ) + + const countUpTextbox = editor.canvas.locator( + '[data-type="stackable/count-up"] [role="textbox"]' + ).first() + await expect( countUpTextbox ).toBeVisible() + await countUpTextbox.fill( '100 days' ) + await publishAndVisitFrontend( page, editor, requestUtils, admin ) - await expect( page.locator( '.stk-block-countdown' ).first() ).toBeVisible() - await expect( page.locator( '.stk-block-count-up' ).first() ).toBeVisible() - await expect( page.locator( '.stk-block-progress-bar' ).first() ).toBeVisible() - await expect( page.locator( '.stk-block-progress-circle' ).first() ).toBeVisible() + const countUp = page.locator( '.stk-block-count-up' ).first() + const countUpText = countUp.locator( '.stk-block-count-up__text' ).first() + await expect( countUp ).toBeAttached() + await expect( countUpText ).not.toHaveClass( /stk--count-up-active/ ) + + await countUp.scrollIntoViewIfNeeded() + await expect( countUpText ).toHaveClass( /stk--count-up-active/, { timeout: 10_000 } ) + await expect( countUpText ).toHaveText( '100 days', { timeout: 5_000 } ) + } ) + + test( 'Progress Bar shows the configured value', async ( { + page, editor, requestUtils, admin, + } ) => { + await editor.insertBlock( { + name: 'stackable/progress-bar', + attributes: { + progressValue: '75', + text: 'E2E Progress', + }, + } ) + await expect( + editor.canvas.locator( '[data-type="stackable/progress-bar"]' ).first() + ).toBeVisible() + await publishAndVisitFrontend( page, editor, requestUtils, admin ) + + const progress = page.locator( '.stk-block-progress-bar' ).first() + await expect( progress ).toBeVisible() + await expect( progress.getByRole( 'progressbar' ) ).toHaveAttribute( 'aria-valuenow', '75' ) + await expect( progress.locator( '.stk-progress-bar__progress-value-text' ) ).toHaveText( '75' ) + await expect( progress.locator( '.stk-progress-bar__text' ) ).toHaveText( 'E2E Progress' ) } ) test( 'Map container renders without a PHP fatal', async ( { @@ -143,22 +286,90 @@ test.describe( 'Interactive frontend', () => { await expect( page.locator( '.stk-block-posts' ).first() ).toBeVisible() } ) - test( 'Table of Contents lists a heading', async ( { + test( 'Table of Contents lists headings and jumps to them', async ( { page, editor, requestUtils, admin, } ) => { - await editor.insertBlock( { - name: 'stackable/heading', - attributes: { text: 'E2E TOC Heading' }, + const headings = [ + { text: 'E2E TOC Alpha', anchor: 'e2e-toc-alpha' }, + { text: 'E2E TOC Beta', anchor: 'e2e-toc-beta' }, + { text: 'E2E TOC Gamma', anchor: 'e2e-toc-gamma' }, + ] + + for ( const [ index, heading ] of headings.entries() ) { + if ( index > 0 ) { + await insertViewportSpacer( editor ) + } + await editor.insertBlock( { + name: 'core/heading', + attributes: { + content: heading.text, + level: 2, + anchor: heading.anchor, + }, + } ) + } + + for ( const heading of headings ) { + await expect( editor.canvas.getByText( heading.text, { exact: true } ) ).toBeVisible() + } + + // Persist heading anchors. Stackable headings (and some WP versions) + // write `anchor` as a non-undo change, which can drop the id on save. + await editor.page.evaluate( anchors => { + const { getBlocks } = window.wp.data.select( 'core/block-editor' ) + const { updateBlockAttributes } = window.wp.data.dispatch( 'core/block-editor' ) + const walk = blocks => { + blocks.forEach( block => { + const text = block.attributes.text || block.attributes.content || '' + const match = anchors.find( heading => heading.text === text ) + if ( match && ( block.name === 'core/heading' || block.name === 'stackable/heading' ) ) { + updateBlockAttributes( block.clientId, { anchor: match.anchor } ) + } + if ( block.innerBlocks?.length ) { + walk( block.innerBlocks ) + } + } ) + } + walk( getBlocks() ) + }, headings ) + + await expect( async () => { + const saved = await editor.page.evaluate( () => { + const flatten = blocks => blocks.flatMap( block => [ + block, + ...flatten( block.innerBlocks || [] ), + ] ) + return flatten( window.wp.data.select( 'core/block-editor' ).getBlocks() ) + .filter( block => block.name === 'core/heading' || block.name === 'stackable/heading' ) + .map( block => ( { + text: block.attributes.text || block.attributes.content, + anchor: block.attributes.anchor, + } ) ) + } ) + for ( const heading of headings ) { + const found = saved.find( block => String( block.text ) === heading.text ) + expect( found?.anchor ).toBe( heading.anchor ) + } + } ).toPass( { timeout: 10_000 } ) + + // Insert at the top so the frontend TOC can jump down the page. + await editor.page.evaluate( () => { + const block = window.wp.blocks.createBlock( 'stackable/table-of-contents' ) + window.wp.data.dispatch( 'core/block-editor' ).insertBlock( block, 0 ) } ) - await editor.insertBlock( { name: 'stackable/table-of-contents' } ) - await expect( - editor.canvas.locator( '.stk-block-table-of-contents' ).getByText( 'E2E TOC Heading' ) - ).toBeVisible( { timeout: 15_000 } ) + await waitForTocHeadings( editor, headings.map( heading => heading.text ) ) await publishAndVisitFrontend( page, editor, requestUtils, admin ) const toc = page.locator( '.stk-block-table-of-contents' ).first() await expect( toc ).toBeVisible() - await expect( toc.getByRole( 'link', { name: 'E2E TOC Heading' } ) ).toBeVisible() + for ( const heading of headings ) { + await expect( toc.getByRole( 'link', { name: heading.text } ) ).toBeVisible() + await expect( page.locator( `#${ heading.anchor }` ) ).toBeAttached() + } + + await toc.getByRole( 'link', { name: 'E2E TOC Gamma' } ).click() + await expect( page ).toHaveURL( /#e2e-toc-gamma/ ) + await expect( page.getByRole( 'heading', { name: 'E2E TOC Gamma' } ) ).toBeInViewport() } ) } ) From 7f41664ef4d748fc7667d3b3e065d1a1d0f05bc5 Mon Sep 17 00:00:00 2001 From: bfintal Date: Thu, 13 Aug 2026 19:24:52 +0800 Subject: [PATCH 08/13] test: cover Preview Design System style guide live updates Assert the overlay shows current design-system values and a sample website, then verify color, typography, spacing, and button changes update the preview in real time. --- e2e/readme.md | 2 +- e2e/tests/global-settings.spec.ts | 179 +++++++++++++++++++++++++++++- 2 files changed, 176 insertions(+), 5 deletions(-) diff --git a/e2e/readme.md b/e2e/readme.md index c8bb93ad0e..93519a634e 100644 --- a/e2e/readme.md +++ b/e2e/readme.md @@ -134,7 +134,7 @@ Do not listen for console `Block validation` messages. | Admin | Activate redirects to Getting Started; settings save; inner tabs render | | Block editor | Insert Text block; inspector tabs; attribute updates | | Block catalog | `createBlock` every inserter-facing `stackable/*`, save, reload, no recovery UI, frontend `.stk-block` | -| Global settings | Color / typography; spacing & buttons tokens; Preview Design System | +| Global settings | Color / typography; spacing & buttons tokens; Preview Design System style guide (live values + website preview) | | Design Library | Open, load patterns, insert a free page/pattern | | Existing blocks | Seeded nested layout post has no recovery UI | | Interactive frontend | Accordion, Tabs, Carousel, Expand, Video Popup, Notification, scroller, countdown/progress, Map, Posts, TOC | diff --git a/e2e/tests/global-settings.spec.ts b/e2e/tests/global-settings.spec.ts index 5ba5304ec3..20bd16dc44 100644 --- a/e2e/tests/global-settings.spec.ts +++ b/e2e/tests/global-settings.spec.ts @@ -1,4 +1,4 @@ -import { Page } from '@playwright/test' +import { Locator, Page } from '@playwright/test' import { test, expect } from 'e2e/test-utils' /** @@ -21,6 +21,45 @@ const fillRangeControl = async ( page: Page, label: string, value: string ) => { await numberInput.first().fill( value ) } +const sidebar = ( page: Page ) => page.locator( '.interface-interface-skeleton__sidebar' ) +const styleGuide = ( page: Page ) => page.locator( '.ugb-style-guide-popover' ) + +const expandSidebarPanel = async ( page: Page, name: string ) => { + const button = sidebar( page ).getByRole( 'button', { name, exact: true } ) + await expect( button ).toBeVisible() + if ( await button.getAttribute( 'aria-expanded' ) !== 'true' ) { + await button.click() + } +} + +const openStyleGuide = async ( page: Page ) => { + await page.getByLabel( 'Stackable Design System' ).click() + await page.getByRole( 'button', { name: 'Preview Design System' } ).click() + + const preview = styleGuide( page ) + await expect( preview ).toBeVisible() + await expect( preview.getByRole( 'heading', { name: 'Design System Style Guide' } ) ).toBeVisible() + await expect( preview.getByText( 'Loading style guide' ) ).toHaveCount( 0, { timeout: 20_000 } ) + await expect( preview.locator( '.ugb-style-guide' ) ).toBeVisible( { timeout: 20_000 } ) + return preview +} + +const fillHexColor = async ( page: Page, hex: string ) => { + const input = page.getByLabel( 'Hex color' ) + await expect( input ).toBeVisible() + await input.fill( hex ) + await input.blur() + // Dismiss the picker without using Escape, which can close the style guide. + await styleGuide( page ).getByRole( 'heading', { name: 'Design System Style Guide' } ).click() + await expect( page.getByLabel( 'Hex color' ) ).toHaveCount( 0 ) +} + +const computedStyle = async ( locator: Locator, property: string ) => { + return locator.evaluate( ( el, prop ) => { + return getComputedStyle( el )[ prop as 'color' ] + }, property ) +} + test.describe( 'Global Settings', () => { let pid = null @@ -170,12 +209,144 @@ test.describe( 'Global Settings', () => { } ).toBe( '48px' ) } ) - test( 'Preview Design System opens', async ( { + test( 'Preview Design System opens a style guide with current values and a website preview', async ( { page, } ) => { - await page.getByLabel( 'Stackable Design System' ).click() - await page.getByRole( 'button', { name: 'Preview Design System' } ).click() + const preview = await openStyleGuide( page ) + + await expect( preview.getByText( /live preview of your design system/i ) ).toBeVisible() + await expect( preview.getByRole( 'button', { name: 'Export as Image' } ) ).toBeVisible() + await expect( preview.getByRole( 'button', { name: 'Close', exact: true } ) ).toBeVisible() await expect( page.getByRole( 'button', { name: 'Close Preview' } ) ).toBeVisible() + + await expect( preview.getByRole( 'heading', { name: 'Colors', exact: true } ) ).toBeVisible() + await expect( preview.getByRole( 'heading', { name: 'Color Schemes' } ) ).toBeVisible() + await expect( preview.locator( '.ugb-style-guide__color-scheme' ).first() ).toBeVisible() + await expect( preview.locator( '.ugb-style-guide__color-scheme__colors' ).first() ).toContainText( 'Background Color' ) + await expect( preview.locator( '.ugb-style-guide__color-scheme__colors' ).first() ).toContainText( 'Heading Color' ) + + await expect( preview.getByRole( 'heading', { name: 'Typography' } ) ).toBeVisible() + await expect( preview.locator( '.ugb-style-guide__typography-preview' ).first() ).toBeVisible() + + await expect( preview.getByRole( 'heading', { name: 'Web Elements' } ) ).toBeVisible() + await expect( preview.getByRole( 'heading', { name: 'Buttons' } ) ).toBeVisible() + await expect( preview.locator( '.ugb-style-guide__elements__buttons .stk-button' ).first() ).toBeVisible() + + await expect( preview.getByRole( 'heading', { name: 'Example Website Preview' } ) ).toBeVisible() + await expect( preview.locator( '.ugb-style-guide__preview-mock-browser' ) ).toBeVisible() + await expect( preview.getByRole( 'heading', { name: 'Professional Solutions for Businesses' } ) ).toBeVisible() + await expect( preview.getByRole( 'heading', { name: 'Our Services' } ) ).toBeVisible() + await page.getByRole( 'button', { name: 'Close Preview' } ).click() + await expect( preview ).toHaveCount( 0 ) + } ) + + test( 'Preview Design System updates live when design system values change', async ( { + page, + } ) => { + test.setTimeout( 120_000 ) + page.on( 'dialog', async dialog => await dialog.accept() ) + + const preview = await openStyleGuide( page ) + const inspector = sidebar( page ) + + try { + await expandSidebarPanel( page, 'Global Color Schemes' ) + await inspector.locator( '[data-item-key="scheme-default-1"]' ).click() + await inspector.locator( '.stk-color-scheme__heading-color .stk-control-content > .components-dropdown > .components-button' ).click() + await fillHexColor( page, 'ff0000' ) + + const schemeHeading = preview.locator( '.ugb-style-guide__color-scheme__heading' ).first() + await expect.poll( async () => computedStyle( schemeHeading, 'color' ) ).toBe( 'rgb(255, 0, 0)' ) + await expect( preview.locator( '.ugb-style-guide__color-scheme__colors' ).first() ).toContainText( /Heading Color:.*#ff0000/i ) + + await inspector.locator( '.stk-inspector-sub-header .components-button' ).first().click() + + await expandSidebarPanel( page, 'Global Color Palette' ) + const colorPanel = inspector.locator( '.ugb-global-settings-color-picker' ).filter( { hasText: 'Global Colors' } ) + await colorPanel.locator( 'button.ugb-global-settings-color-picker__add-button' ).click() + await fillHexColor( page, '22aa66' ) + + const palette = preview.locator( '.ugb-style-guide__colors' ) + await expect( palette ).toBeVisible() + await expect( palette ).toContainText( 'Custom Color' ) + await expect.poll( async () => { + return computedStyle( palette.locator( '.ugb-style-guide__color-container' ).last(), 'backgroundColor' ) + } ).toBe( 'rgb(34, 170, 102)' ) + + await expandSidebarPanel( page, 'Global Typography' ) + await inspector.getByText( 'DM Serif Display' ).click() + await expect( preview.locator( '.ugb-style-guide__typography-headings .ugb-style-guide__typography-label' ).first() ) + .toContainText( 'DM Serif Display' ) + await expect.poll( async () => { + return computedStyle( + preview.locator( 'h1.ugb-style-guide__typography-preview[data-device="desktop"]' ).first(), + 'fontFamily' + ) + } ).toMatch( /DM Serif Display/ ) + + await expandSidebarPanel( page, 'Global Spacing & Borders' ) + await fillRangeControl( page, 'Block Margin Bottom', '56' ) + await expect.poll( async () => { + return computedStyle( + preview.locator( '.ugb-style-guide__preview .stk-block' ).first(), + 'marginBottom' + ) + } ).toBe( '56px' ) + + await expandSidebarPanel( page, 'Global Buttons & Icons' ) + await fillRangeControl( page, 'Min. Button Height', '64' ) + await expect.poll( async () => { + return computedStyle( + preview.locator( '.ugb-style-guide__elements__buttons .stk-button' ).first(), + 'minHeight' + ) + } ).toBe( '64px' ) + } finally { + try { + const inspector = sidebar( page ) + + if ( await inspector.locator( '.stk-inspector-sub-header' ).isVisible().catch( () => false ) ) { + const resetScheme = inspector.locator( '.stk-inspector-sub-header__reset' ) + if ( await resetScheme.isVisible().catch( () => false ) ) { + await resetScheme.click() + } + await inspector.locator( '.stk-inspector-sub-header .components-button' ).first().click() + } else { + await expandSidebarPanel( page, 'Global Color Schemes' ) + await inspector.locator( '[data-item-key="scheme-default-1"]' ).click() + const resetScheme = inspector.locator( '.stk-inspector-sub-header__reset' ) + if ( await resetScheme.isVisible().catch( () => false ) ) { + await resetScheme.click() + } + await inspector.locator( '.stk-inspector-sub-header .components-button' ).first().click() + } + + await expandSidebarPanel( page, 'Global Color Palette' ) + const colorPanel = inspector.locator( '.ugb-global-settings-color-picker' ).filter( { hasText: 'Global Colors' } ) + const deleteButtons = colorPanel.getByLabel( 'Delete' ) + const deleteCount = await deleteButtons.count() + for ( let i = 0; i < deleteCount; i++ ) { + await colorPanel.getByLabel( 'Delete' ).last().click() + } + + await expandSidebarPanel( page, 'Global Typography' ) + await inspector.getByText( 'Default Heading' ).click() + + await expandSidebarPanel( page, 'Global Spacing & Borders' ) + const spacingReset = inspector.getByRole( 'button', { name: 'Reset All' } ).first() + if ( await spacingReset.isEnabled() ) { + await spacingReset.click() + } + + await expandSidebarPanel( page, 'Global Buttons & Icons' ) + const buttonsReset = inspector.getByRole( 'button', { name: 'Reset All' } ).last() + if ( await buttonsReset.isEnabled() ) { + await buttonsReset.click() + } + } catch { + // Best-effort cleanup so a failed assertion is not hidden by reset errors. + } + } } ) } ) From 071796205f17fd2b88ab05873d89f239032bd37f Mon Sep 17 00:00:00 2001 From: bfintal Date: Thu, 13 Aug 2026 22:11:01 +0800 Subject: [PATCH 09/13] test: fix global settings tests --- e2e/config/global-setup-upgrade.js | 1 - e2e/config/global-setup.js | 52 +---------------------- e2e/playground-blueprint.json | 2 +- e2e/readme.md | 6 +-- e2e/tests/existing-blocks.spec.ts | 66 +++++++++++++++++++----------- 5 files changed, 47 insertions(+), 80 deletions(-) diff --git a/e2e/config/global-setup-upgrade.js b/e2e/config/global-setup-upgrade.js index 6345d441a7..ae8a015b6b 100644 --- a/e2e/config/global-setup-upgrade.js +++ b/e2e/config/global-setup-upgrade.js @@ -1,6 +1,5 @@ /** * Auth-only global setup for the upgrade suite. - * Does not require the Existing Blocks fixture post. */ const fs = require( 'fs/promises' ) const path = require( 'path' ) diff --git a/e2e/config/global-setup.js b/e2e/config/global-setup.js index cca04a55a9..5bfcb7d2f6 100644 --- a/e2e/config/global-setup.js +++ b/e2e/config/global-setup.js @@ -2,13 +2,7 @@ * Playwright global setup: cookie-authenticates as the Playground blueprint * admin (admin / password) and persists storage state for specs + requestUtils. * - * Resolves the "Existing Blocks" post ID from (in order): - * 1. WP_TEST_POSTID env - * 2. Blueprint-written e2e/.auth/seed-post.json - * 3. REST search by exact title - * - * Writes e2e/.auth/test-env.json for existing-blocks.spec.ts. - * In CI, missing fixture post ID fails closed so the suite cannot skip that check. + * Writes e2e/.auth/test-env.json with STACKABLE_SLUG. */ const fs = require( 'fs/promises' ) const path = require( 'path' ) @@ -30,53 +24,9 @@ module.exports = async function globalSetup() { const authDir = path.dirname( storageStatePath || path.join( __dirname, '../.auth/admin.json' ) ) await fs.mkdir( authDir, { recursive: true } ) - let existingBlocksPostId = process.env.WP_TEST_POSTID || null - - if ( ! existingBlocksPostId ) { - try { - const seed = JSON.parse( - await fs.readFile( path.join( authDir, 'seed-post.json' ), 'utf8' ) - ) - if ( seed.WP_TEST_POSTID ) { - existingBlocksPostId = String( seed.WP_TEST_POSTID ) - } - } catch { - // Blueprint may not have written a seed file yet / older boots. - } - } - - if ( ! existingBlocksPostId ) { - try { - const posts = await requestUtils.rest( { - path: '/wp/v2/posts', - params: { - search: 'Existing Blocks', - status: 'publish', - // REST query arg (WordPress API), not a JS identifier. - // eslint-disable-next-line camelcase - per_page: 10, - }, - } ) - const match = ( posts || [] ).find( post => post.title?.rendered === 'Existing Blocks' ) - if ( match ) { - existingBlocksPostId = String( match.id ) - } - } catch ( error ) { - // eslint-disable-next-line no-console - console.warn( 'Could not resolve Existing Blocks post via REST:', error.message ) - } - } - - if ( ! existingBlocksPostId && process.env.CI ) { - throw new Error( - 'Existing Blocks fixture post ID was not seeded. Check playground-blueprint.json runPHP step.' - ) - } - await fs.writeFile( path.join( authDir, 'test-env.json' ), JSON.stringify( { - WP_TEST_POSTID: existingBlocksPostId || undefined, STACKABLE_SLUG: process.env.STACKABLE_SLUG || 'stackable/plugin', }, null, 2 ) ) diff --git a/e2e/playground-blueprint.json b/e2e/playground-blueprint.json index e653cf5858..905364a355 100644 --- a/e2e/playground-blueprint.json +++ b/e2e/playground-blueprint.json @@ -16,7 +16,7 @@ }, { "step": "runPHP", - "code": "get_var( $wpdb->prepare(\n\t\t\"SELECT ID FROM {$wpdb->posts} WHERE post_title = %s AND post_type = 'post' AND post_status = 'publish' LIMIT 1\",\n\t\t'Existing Blocks'\n\t) );\n\tif ( ! $id ) {\n\t\t$id = wp_insert_post( array(\n\t\t\t'post_title' => 'Existing Blocks',\n\t\t\t'post_status' => 'publish',\n\t\t\t'post_content' => file_get_contents( $content_file ),\n\t\t), true );\n\t}\n\tif ( $id && ! is_wp_error( $id ) ) {\n\t\tupdate_option( 'stackable_e2e_existing_blocks_post_id', (int) $id, false );\n\t\t$seed_dir = '/wordpress/wp-content/plugins/stackable/e2e/.auth';\n\t\tif ( ! is_dir( $seed_dir ) ) {\n\t\t\tmkdir( $seed_dir, 0777, true );\n\t\t}\n\t\tfile_put_contents(\n\t\t\t$seed_dir . '/seed-post.json',\n\t\t\twp_json_encode( array( 'WP_TEST_POSTID' => (string) (int) $id ) )\n\t\t);\n\t}\n}\n" + "code": " { - if ( process.env.WP_TEST_POSTID ) { - return process.env.WP_TEST_POSTID - } - try { - const envPath = path.join( __dirname, '../.auth/test-env.json' ) - const env = JSON.parse( fs.readFileSync( envPath, 'utf8' ) ) - return env.WP_TEST_POSTID - } catch { - return undefined - } -} - -const postId = readSeededPostId() - -test.skip( postId === undefined, 'Existing Blocks post not seeded by Playground blueprint' ) +const POST_CONTENT = fs.readFileSync( + path.join( __dirname, '../config/post-content.txt' ), + 'utf8' +) test( 'Existing Stackable blocks should have no errors', async ( { admin, editor, + requestUtils, + stackable, } ) => { - await admin.editPost( postId ) - await expect( - editor.canvas.locator( '[data-type^="stackable/"]' ).first() - ).toBeVisible( { timeout: 60_000 } ) - await assertNoBlockRecovery( editor ) + test.setTimeout( 180_000 ) + + // Persist fixture HTML via REST as admin (unfiltered_html). Opening the + // editor on that saved post is the recovery path we care about, not + // inserting blocks or setContent in an already-open editor. + const post = await requestUtils.createPost( { + title: 'Existing Blocks Fixture', + status: 'publish', + content: POST_CONTENT, + } ) + expect( post.id ).toBeTruthy() + + try { + const stored = await requestUtils.rest( { + path: `/wp/v2/posts/${ post.id }`, + params: { context: 'edit' }, + } ) + expect( stored.content?.raw ).toContain( '